diff --git a/apps/codecs/speex.c b/apps/codecs/speex.c index e38a04495c..7a1efa9753 100644 --- a/apps/codecs/speex.c +++ b/apps/codecs/speex.c @@ -393,6 +393,9 @@ enum codec_status codec_main(void) void *st = NULL; int j = 0; + memset(&bits, 0, sizeof(bits)); + memset(&oy, 0, sizeof(oy)); + /* Ogg handling still uses mallocs, so reset the malloc buffer per track */ next_track: error = CODEC_OK; @@ -401,16 +404,16 @@ next_track: error = CODEC_ERROR; goto exit; } + stereo = speex_stereo_state_init(); + spx_ogg_sync_init(&oy); + spx_ogg_alloc_buffer(&oy,2*CHUNKSIZE); if (codec_wait_taginfo() != 0) goto done; strtoffset = ci->id3->offset; - spx_ogg_sync_init(&oy); - spx_ogg_alloc_buffer(&oy,2*CHUNKSIZE); - samplerate = ci->id3->frequency; codec_set_replaygain(ci->id3); @@ -558,7 +561,8 @@ done: /* Clean things up for the next track */ - speex_decoder_destroy(st); + if (st) + speex_decoder_destroy(st); if (stream_init == 1) spx_ogg_stream_reset(&os); diff --git a/apps/codecs/vorbis.c b/apps/codecs/vorbis.c index 17cc4a03f9..0a36a37c8b 100644 --- a/apps/codecs/vorbis.c +++ b/apps/codecs/vorbis.c @@ -110,6 +110,7 @@ enum codec_status codec_main(void) OggVorbis_File vf; ogg_int32_t **pcm; + bool initialized = false; /* First init done? */ int error; long n; int current_section; @@ -185,6 +186,7 @@ next_track: vf.end = ci->id3->filesize; vf.ready_state = OPENED; vf.links = 1; + initialized = true; } else { DEBUGF("Vorbis: ov_open failed: %d\n", error); error = CODEC_ERROR; @@ -248,6 +250,8 @@ done: ogg_malloc_destroy(); if (ci->request_next_track()) { + if (!initialized) + goto next_track; /* Clean things up for the next track */ vf.dataoffsets = NULL; vf.offsets = NULL;