summaryrefslogtreecommitdiff
path: root/lib/rbcodec/codecs/wma.c
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2013-02-17 16:26:41 -0500
committerMichael Sevakis <jethead71@rockbox.org>2013-02-18 02:43:07 +0100
commit66acb3996dcb1d22c7ddcc22a1d2d5d7281c2d9e (patch)
treec1124f00f0258e9daa9719c46473e8e8c7cd50f5 /lib/rbcodec/codecs/wma.c
parentef958abdaed3ccbbf1d07238db4f281d805678d0 (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-xlib/rbcodec/codecs/wma.c40
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(&param);
- 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);