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(void)
39 int bytesPerSample
=2;
43 DEBUGF("codec init failed\n");
47 while (!*ci
->taginfo_ready
&& !ci
->stop_codec
)
50 codec_set_replaygain(ci
->id3
);
55 module
= ci
->request_buffer(&filesize
, ci
->filesize
);
56 if (!module
|| (size_t)filesize
< (size_t)ci
->filesize
)
58 DEBUGF("loading error\n");
63 if (!ASAP_Load(&asap
, ci
->id3
->path
, module
, filesize
))
65 DEBUGF("%s: format not supported",ci
->id3
->path
);
69 /* Make use of 44.1khz */
70 ci
->configure(DSP_SET_FREQUENCY
, 44100);
71 /* Sample depth is 16 bit little endian */
72 ci
->configure(DSP_SET_SAMPLE_DEPTH
, 16);
73 /* Stereo or Mono output ? */
74 if(asap
.module_info
.channels
==1)
76 ci
->configure(DSP_SET_STEREO_MODE
, STEREO_MONO
);
81 ci
->configure(DSP_SET_STEREO_MODE
, STEREO_INTERLEAVED
);
87 song
= asap
.module_info
.default_song
;
88 duration
= asap
.module_info
.durations
[song
];
90 duration
= 180 * 1000;
92 ASAP_PlaySong(&asap
, song
, duration
);
93 ASAP_MutePokeyChannels(&asap
, 0);
95 /* The main decoder loop */
98 if (ci
->stop_codec
|| ci
->new_track
)
102 /* New time is ready in ci->seek_time */
105 ASAP_Seek(&asap
,ci
->seek_time
);
107 ci
->set_elapsed(ci
->seek_time
);
108 /* update bytes_done */
109 bytes_done
= ci
->seek_time
*44.1*2;
114 /* Generate a buffer full of Audio */
115 #ifdef ROCKBOX_LITTLE_ENDIAN
116 n_bytes
= ASAP_Generate(&asap
, samples
, sizeof(samples
), ASAP_FORMAT_S16_LE
);
118 n_bytes
= ASAP_Generate(&asap
, samples
, sizeof(samples
), ASAP_FORMAT_S16_BE
);
121 ci
->pcmbuf_insert(samples
, NULL
, n_bytes
/bytesPerSample
);
123 bytes_done
+= n_bytes
;
124 ci
->set_elapsed((bytes_done
/ 2) / 44.1);
126 if(n_bytes
!= sizeof(samples
))
130 if (ci
->request_next_track())