diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2013-02-17 16:26:41 -0500 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2013-02-18 02:43:07 +0100 |
commit | 66acb3996dcb1d22c7ddcc22a1d2d5d7281c2d9e (patch) | |
tree | c1124f00f0258e9daa9719c46473e8e8c7cd50f5 /lib/rbcodec/codecs/wma.c | |
parent | ef958abdaed3ccbbf1d07238db4f281d805678d0 (diff) |
Fix FSB#12826 - Mini-sound burp between track skips [with WMA].
Flush decoder state and frame out buffer upon a forced stop to prevent
a short burst of stale audio from the previously decoding track from
playing when skipping from one WMA track to another.
Change-Id: I24c910c5dbd83caed2510db68d9e39a474332a79
Reviewed-on: http://gerrit.rockbox.org/406
Reviewed-by: Michael Sevakis <jethead71@rockbox.org>
Tested-by: Michael Sevakis <jethead71@rockbox.org>
Diffstat (limited to 'lib/rbcodec/codecs/wma.c')
-rwxr-xr-x | lib/rbcodec/codecs/wma.c | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/lib/rbcodec/codecs/wma.c b/lib/rbcodec/codecs/wma.c index f9501ffad3..36e4285916 100755 --- a/lib/rbcodec/codecs/wma.c +++ b/lib/rbcodec/codecs/wma.c @@ -106,11 +106,7 @@ restart_track: { enum codec_command_action action = ci->get_command(¶m); - if (action == CODEC_ACTION_HALT) - break; - - /* Deal with any pending seek requests */ - if (action == CODEC_ACTION_SEEK_TIME) { + if (action != CODEC_ACTION_NULL) { /*flush the wma decoder state*/ wmadec.last_superframe_len = 0; @@ -121,23 +117,31 @@ restart_track: memset((*(wmadec.frame_out)), 0, sizeof(fixed32) * MAX_CHANNELS * BLOCK_MAX_SIZE * 2); - if (param == 0) { - ci->set_elapsed(0); - ci->seek_complete(); - goto restart_track; /* Pretend you never saw this... */ - } + if (action == CODEC_ACTION_HALT) + break; + + /* Deal with any pending seek requests */ + if (action == CODEC_ACTION_SEEK_TIME) { + + if (param == 0) { + ci->set_elapsed(0); + ci->seek_complete(); + goto restart_track; /* Pretend you never saw this... */ + } + + elapsedtime = asf_seek(param, &wfx); + if (elapsedtime < 1){ + ci->set_elapsed(0); + ci->seek_complete(); + break; + } + /*DEBUGF("Seek returned %d\n", (int)elapsedtime);*/ - elapsedtime = asf_seek(param, &wfx); - if (elapsedtime < 1){ - ci->set_elapsed(0); + ci->set_elapsed(elapsedtime); ci->seek_complete(); - break; } - /*DEBUGF("Seek returned %d\n", (int)elapsedtime);*/ - - ci->set_elapsed(elapsedtime); - ci->seek_complete(); } + errcount = 0; new_packet: res = asf_read_packet(&audiobuf, &audiobufsize, &packetlength, &wfx); |