Mercurial > audlegacy-plugins
comparison src/aac/libmp4.c @ 2997:73ae33c89dc6
Patch from John Lindgren <john.lindgren@tds.net> to support seeking whilst paused, Debian bug #517692.
author | Tony Vroon <chainsaw@gentoo.org> |
---|---|
date | Wed, 04 Mar 2009 12:46:05 +0000 |
parents | 3134a0987162 |
children | 3d6a2732f26a |
comparison
equal
deleted
inserted
replaced
2996:b7c181d0b325 | 2997:73ae33c89dc6 |
---|---|
74 | 74 |
75 static Mp4Config mp4cfg; | 75 static Mp4Config mp4cfg; |
76 static GThread *decodeThread; | 76 static GThread *decodeThread; |
77 GStaticMutex mutex = G_STATIC_MUTEX_INIT; | 77 GStaticMutex mutex = G_STATIC_MUTEX_INIT; |
78 static int seekPosition = -1; | 78 static int seekPosition = -1; |
79 static volatile char pause_flag; | |
79 | 80 |
80 void getMP4info(char*); | 81 void getMP4info(char*); |
81 int getAACTrack(mp4ff_t *); | 82 int getAACTrack(mp4ff_t *); |
82 | 83 |
83 static guint32 mp4_read_callback(void *data, void *buffer, guint32 len) | 84 static guint32 mp4_read_callback(void *data, void *buffer, guint32 len) |
98 | 99 |
99 static void mp4_init(void) | 100 static void mp4_init(void) |
100 { | 101 { |
101 mp4cfg.file_type = FILE_UNKNOWN; | 102 mp4cfg.file_type = FILE_UNKNOWN; |
102 seekPosition = -1; | 103 seekPosition = -1; |
104 pause_flag = 0; | |
103 return; | 105 return; |
104 } | 106 } |
105 | 107 |
106 static void mp4_play(InputPlayback *playback) | 108 static void mp4_play(InputPlayback *playback) |
107 { | 109 { |
294 g_free(about_text); | 296 g_free(about_text); |
295 } | 297 } |
296 | 298 |
297 static void mp4_pause(InputPlayback *playback, short flag) | 299 static void mp4_pause(InputPlayback *playback, short flag) |
298 { | 300 { |
299 playback->output->pause(flag); | 301 pause_flag = flag; |
300 } | 302 } |
301 | 303 |
302 static void mp4_seek(InputPlayback *data, int time) | 304 static void mp4_seek(InputPlayback *data, int time) |
303 { | 305 { |
304 seekPosition = time; | 306 seekPosition = time; |
538 /* Seek if seek position has changed */ | 540 /* Seek if seek position has changed */ |
539 if ( seekPosition!=-1 ) { | 541 if ( seekPosition!=-1 ) { |
540 sampleID = (float)seekPosition*(float)samplerate/(float)(framesize - 1.0); | 542 sampleID = (float)seekPosition*(float)samplerate/(float)(framesize - 1.0); |
541 playback->output->flush(seekPosition*1000); | 543 playback->output->flush(seekPosition*1000); |
542 seekPosition = -1; | 544 seekPosition = -1; |
545 } | |
546 | |
547 if (pause_flag) { | |
548 playback->output->pause (1); | |
549 while (pause_flag) { | |
550 if (seekPosition != -1) { | |
551 playback->output->flush (seekPosition * 1000); | |
552 sampleID = (long long) seekPosition * samplerate / (framesize - 1); | |
553 seekPosition = -1; | |
554 } | |
555 g_usleep(50000); | |
556 } | |
557 playback->output->pause (0); | |
543 } | 558 } |
544 | 559 |
545 /* Otherwise continue playing */ | 560 /* Otherwise continue playing */ |
546 buffer=NULL; | 561 buffer=NULL; |
547 bufferSize=0; | 562 bufferSize=0; |