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;