1
0
Fork 0
forked from len0rd/rockbox

use the full resolution we get from the WMA decoder and let the DSP code do the rest

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14224 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Marcoen Hirschberg 2007-08-06 23:34:28 +00:00
parent 0ee44031f0
commit c43629f08b
3 changed files with 9 additions and 19 deletions

View file

@ -172,6 +172,6 @@ int wma_decode_init(WMADecodeContext* s, asf_waveformatex_t *wfx);
int wma_decode_superframe_init(WMADecodeContext* s, int wma_decode_superframe_init(WMADecodeContext* s,
uint8_t *buf, int buf_size); uint8_t *buf, int buf_size);
int wma_decode_superframe_frame(WMADecodeContext* s, int wma_decode_superframe_frame(WMADecodeContext* s,
int16_t *samples, int32_t *samples,
uint8_t *buf, int buf_size); uint8_t *buf, int buf_size);
#endif #endif

View file

@ -1619,10 +1619,10 @@ next:
} }
/* decode a frame of frame_len samples */ /* decode a frame of frame_len samples */
static int wma_decode_frame(WMADecodeContext *s, int16_t *samples) static int wma_decode_frame(WMADecodeContext *s, int32_t *samples)
{ {
int ret, i, n, a, ch, incr; int ret, i, n, ch, incr;
int16_t *ptr; int32_t *ptr;
fixed32 *iptr; fixed32 *iptr;
// rb->splash(HZ, "in wma_decode_frame"); // rb->splash(HZ, "in wma_decode_frame");
@ -1646,7 +1646,7 @@ static int wma_decode_frame(WMADecodeContext *s, int16_t *samples)
} }
} }
/* convert frame to integer */ /* return frame with full 30-bit precision */
n = s->frame_len; n = s->frame_len;
incr = s->nb_channels; incr = s->nb_channels;
for(ch = 0; ch < s->nb_channels; ++ch) for(ch = 0; ch < s->nb_channels; ++ch)
@ -1656,17 +1656,7 @@ static int wma_decode_frame(WMADecodeContext *s, int16_t *samples)
for (i=0;i<n;++i) for (i=0;i<n;++i)
{ {
a = fixtoi32(*iptr++)<<1; //ugly but good enough for now *ptr = (*iptr++);
if (a > 32767)
{
a = 32767;
}
else if (a < -32768)
{
a = -32768;
}
*ptr = a;
ptr += incr; ptr += incr;
} }
/* prepare for next block */ /* prepare for next block */
@ -1719,7 +1709,7 @@ int wma_decode_superframe_init(WMADecodeContext* s,
*/ */
int wma_decode_superframe_frame(WMADecodeContext* s, int wma_decode_superframe_frame(WMADecodeContext* s,
int16_t* samples, /*output*/ int32_t* samples, /*output*/
uint8_t *buf, /*input*/ uint8_t *buf, /*input*/
int buf_size) int buf_size)
{ {

View file

@ -27,7 +27,7 @@ CODEC_HEADER
BLOCK_MAX_SIZE is 2048 (samples) and MAX_CHANNELS is 2. BLOCK_MAX_SIZE is 2048 (samples) and MAX_CHANNELS is 2.
*/ */
static uint16_t decoded[BLOCK_MAX_SIZE * MAX_CHANNELS]; static uint32_t decoded[BLOCK_MAX_SIZE * MAX_CHANNELS];
/* NOTE: WMADecodeContext is 120152 bytes (on x86) */ /* NOTE: WMADecodeContext is 120152 bytes (on x86) */
static WMADecodeContext wmadec; static WMADecodeContext wmadec;
@ -319,7 +319,7 @@ enum codec_status codec_main(void)
ci->configure(CODEC_SET_FILEBUF_WATERMARK, 1024*512); ci->configure(CODEC_SET_FILEBUF_WATERMARK, 1024*512);
ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, 1024*128); ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, 1024*128);
ci->configure(DSP_SET_SAMPLE_DEPTH, 15); ci->configure(DSP_SET_SAMPLE_DEPTH, 30);
next_track: next_track: