1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2005 David Bryant
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 "libwavpack/wavpack.h"
27 #define BUFFER_SIZE 4096
29 static int32_t temp_buffer
[BUFFER_SIZE
] IBSS_ATTR
;
31 static int32_t read_callback (void *buffer
, int32_t bytes
)
33 int32_t retval
= ci
->read_filebuf (buffer
, bytes
);
34 ci
->set_offset(ci
->curpos
);
38 /* this is the codec entry point */
39 enum codec_status
codec_main(enum codec_entry_call_reason reason
)
41 if (reason
== CODEC_LOAD
) {
42 /* Generic codec initialisation */
43 ci
->configure(DSP_SET_SAMPLE_DEPTH
, 28);
49 /* this is called for each file to process */
50 enum codec_status
codec_run(void)
54 /* rockbox: comment 'set but unused' variables
63 ci
->seek_buffer (ci
->id3
->offset
);
65 /* Create a decoder instance */
66 wpc
= WavpackOpenFileInput (read_callback
, error
);
71 ci
->configure(DSP_SWITCH_FREQUENCY
, WavpackGetSampleRate (wpc
));
72 codec_set_replaygain(ci
->id3
);
73 /* bps = WavpackGetBytesPerSample (wpc); */
74 nchans
= WavpackGetReducedChannels (wpc
);
75 ci
->configure(DSP_SET_STEREO_MODE
, nchans
== 2 ? STEREO_INTERLEAVED
: STEREO_MONO
);
76 sr_100
= ci
->id3
->frequency
/ 100;
80 /* The main decoder loop */
84 enum codec_command_action action
= ci
->get_command(¶m
);
86 if (action
== CODEC_ACTION_HALT
)
89 if (action
== CODEC_ACTION_SEEK_TIME
) {
90 int curpos_ms
= WavpackGetSampleIndex (wpc
) / sr_100
* 10;
93 if (param
> curpos_ms
) {
94 n
= param
- curpos_ms
;
95 d
= ci
->id3
->length
- curpos_ms
;
96 skip
= (int)((int64_t)(ci
->filesize
- ci
->curpos
) * n
/ d
);
97 ci
->seek_buffer (ci
->curpos
+ skip
);
99 else if (curpos_ms
!= 0) {
100 n
= curpos_ms
- param
;
102 skip
= (int)((int64_t) ci
->curpos
* n
/ d
);
103 ci
->seek_buffer (ci
->curpos
- skip
);
106 wpc
= WavpackOpenFileInput (read_callback
, error
);
113 ci
->set_elapsed (WavpackGetSampleIndex (wpc
) / sr_100
* 10);
117 nsamples
= WavpackUnpackSamples (wpc
, temp_buffer
, BUFFER_SIZE
/ nchans
);
122 ci
->pcmbuf_insert (temp_buffer
, NULL
, nsamples
);
123 ci
->set_elapsed (WavpackGetSampleIndex (wpc
) / sr_100
* 10);