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 "asap/asap.h"
27 #define CHUNK_SIZE (1024*8)
29 static byte samples
[CHUNK_SIZE
]; /* The sample buffer */
30 static ASAP_State asap
; /* asap codec state */
32 /* this is the codec entry point */
33 enum codec_status
codec_main(void)
40 /* Generic codec initialisation */
41 ci
->configure(CODEC_SET_FILEBUF_WATERMARK
, 1024*512);
45 DEBUGF("codec init failed\n");
49 while (!*ci
->taginfo_ready
&& !ci
->stop_codec
)
52 codec_set_replaygain(ci
->id3
);
57 module
= ci
->request_buffer(&filesize
, ci
->filesize
);
58 if (!module
|| (size_t)filesize
< (size_t)ci
->filesize
)
60 DEBUGF("loading error\n");
65 if (!ASAP_Load(&asap
, ci
->id3
->path
, module
, filesize
))
67 DEBUGF("%s: format not supported",ci
->id3
->path
);
71 /* Make use of 44.1khz */
72 ci
->configure(DSP_SET_FREQUENCY
, 44100);
73 /* Sample depth is 16 bit little endian */
74 ci
->configure(DSP_SET_SAMPLE_DEPTH
, 16);
75 /* Stereo or Mono output ? */
76 if(asap
.module_info
.channels
==1)
77 ci
->configure(DSP_SET_STEREO_MODE
, STEREO_MONO
);
79 ci
->configure(DSP_SET_STEREO_MODE
, STEREO_INTERLEAVED
);
84 song
= asap
.module_info
.default_song
;
85 duration
= asap
.module_info
.durations
[song
];
87 duration
= 180 * 1000;
89 ASAP_PlaySong(&asap
, song
, duration
);
90 ASAP_MutePokeyChannels(&asap
, 0);
92 /* The main decoder loop */
95 if (ci
->stop_codec
|| ci
->new_track
)
99 /* New time is ready in ci->seek_time */
102 ASAP_Seek(&asap
,ci
->seek_time
);
104 ci
->set_elapsed(ci
->seek_time
);
105 /* update bytes_done */
106 bytes_done
= ci
->seek_time
*44.1*2;
111 /* Generate a buffer full of Audio */
112 #ifdef ROCKBOX_LITTLE_ENDIAN
113 n_bytes
= ASAP_Generate(&asap
, samples
, sizeof(samples
), ASAP_FORMAT_S16_LE
);
115 n_bytes
= ASAP_Generate(&asap
, samples
, sizeof(samples
), ASAP_FORMAT_S16_BE
);
118 ci
->pcmbuf_insert(samples
, NULL
, n_bytes
/2);
120 bytes_done
+= n_bytes
;
121 ci
->set_elapsed((bytes_done
/ 2) / 44.1);
123 if(n_bytes
!= sizeof(samples
))
127 if (ci
->request_next_track())