1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2008 Dominik Wenger
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
23 #include "libasap/asap.h"
27 #define CHUNK_SIZE (1024*2)
29 static byte samples
[CHUNK_SIZE
] IBSS_ATTR
; /* The sample buffer */
30 static ASAP_State asap
; /* asap codec state */
32 /* this is the codec entry point */
33 enum codec_status
codec_main(enum codec_entry_call_reason reason
)
40 /* this is called for each file to process */
41 enum codec_status
codec_run(void)
47 int bytesPerSample
=2;
51 DEBUGF("codec init failed\n");
55 codec_set_replaygain(ci
->id3
);
60 module
= ci
->request_buffer(&filesize
, ci
->filesize
);
61 if (!module
|| (size_t)filesize
< (size_t)ci
->filesize
)
63 DEBUGF("loading error\n");
68 if (!ASAP_Load(&asap
, ci
->id3
->path
, module
, filesize
))
70 DEBUGF("%s: format not supported",ci
->id3
->path
);
74 /* Make use of 44.1khz */
75 ci
->configure(DSP_SET_FREQUENCY
, 44100);
76 /* Sample depth is 16 bit little endian */
77 ci
->configure(DSP_SET_SAMPLE_DEPTH
, 16);
78 /* Stereo or Mono output ? */
79 if(asap
.module_info
.channels
==1)
81 ci
->configure(DSP_SET_STEREO_MODE
, STEREO_MONO
);
86 ci
->configure(DSP_SET_STEREO_MODE
, STEREO_INTERLEAVED
);
92 song
= asap
.module_info
.default_song
;
93 duration
= asap
.module_info
.durations
[song
];
95 duration
= 180 * 1000;
97 /* set id3 length, because metadata parse might not have done it */
98 ci
->id3
->length
= duration
;
100 ASAP_PlaySong(&asap
, song
, duration
);
101 ASAP_MutePokeyChannels(&asap
, 0);
103 /* The main decoder loop */
105 enum codec_command_action action
= ci
->get_command(¶m
);
107 if (action
== CODEC_ACTION_HALT
)
110 if (action
== CODEC_ACTION_SEEK_TIME
) {
111 /* New time is ready in param */
114 ASAP_Seek(&asap
,param
);
115 /* update bytes_done */
116 bytes_done
= param
*44.1*2;
118 ci
->set_elapsed((bytes_done
/ 2) / 44.1);
123 /* Generate a buffer full of Audio */
124 #ifdef ROCKBOX_LITTLE_ENDIAN
125 n_bytes
= ASAP_Generate(&asap
, samples
, sizeof(samples
), ASAP_FORMAT_S16_LE
);
127 n_bytes
= ASAP_Generate(&asap
, samples
, sizeof(samples
), ASAP_FORMAT_S16_BE
);
130 ci
->pcmbuf_insert(samples
, NULL
, n_bytes
/bytesPerSample
);
132 bytes_done
+= n_bytes
;
133 ci
->set_elapsed((bytes_done
/ 2) / 44.1);
135 if(n_bytes
!= sizeof(samples
))