From 3f04079d7354ea0904f4eaff1bd7ec5d874a9570 Mon Sep 17 00:00:00 2001 From: Michel Kaempf Date: Thu, 23 Sep 1999 08:53:15 +0000 Subject: [PATCH] =?UTF-8?q?*=20audio=5Fdecoder/audio=5Fdecoder.c=20:=20-?= =?UTF-8?q?=20Tout=20est=20pret=20pour=20accueillir=20la=20synchro=20:-)?= =?UTF-8?q?=20-=20Les=20passages=20modifi=EF=BF=BDs=20sont=20encore=20en?= =?UTF-8?q?=20commentaire,=20parce=20qu'avec=20ma=20synchro=20simul?= =?UTF-8?q?=EF=BF=BDe=20le=20%CPU=20du=20d=EF=BF=BDcodeur=20audio=20passe?= =?UTF-8?q?=20de=200.1%=20=EF=BF=BD=209.7%,=20alors=20que=20les=20op?= =?UTF-8?q?=EF=BF=BDrations=20sont=20toutes=20simples=20et=20pas=20appel?= =?UTF-8?q?=EF=BF=BDes=20tant=20que=20=EF=BF=BDa=20(il=20faudra=20encore?= =?UTF-8?q?=20essayer=20en=20-Oqqch=20si=20=EF=BF=BDa=20change=20qqch)=20;?= =?UTF-8?q?=20-=20Reste=20=EF=BF=BD=20modifier=20l'audio=20output=20pour?= =?UTF-8?q?=20la=20synchro...=20coming=20soon=20;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -- MaXX --- src/audio_decoder/audio_decoder.c | 50 ++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/src/audio_decoder/audio_decoder.c b/src/audio_decoder/audio_decoder.c index bdc4cb7a88..a1af8cf14f 100644 --- a/src/audio_decoder/audio_decoder.c +++ b/src/audio_decoder/audio_decoder.c @@ -771,6 +771,17 @@ static int InitThread( adec_thread_t * p_adec ) return( 0 ); } +#define UPDATE_INCREMENT( increment, integer ) \ + if ( ((increment).l_remainder += (increment).l_euclidean_remainder) >= 0 ) \ + { \ + (integer) += (increment).l_euclidean_integer + 1; \ + (increment).l_remainder -= (increment).l_euclidean_denominator; \ + } \ + else \ + { \ + (integer) += (increment).l_euclidean_integer; \ + } + /****************************************************************************** * RunThread : audio decoder thread ****************************************************************************** @@ -783,7 +794,11 @@ static void RunThread( adec_thread_t * p_adec ) // int i_header; // int i_framesize; // int i_dummy; - mtime_t adec_date = 0; + s64 s64_numerator; + s64 s64_denominator; + /* The synchronization needs date and date_increment for the moment */ + mtime_t date = 0; + aout_increment_t date_increment; intf_DbgMsg("adec debug: running audio decoder thread (%p) (pid == %i)\n", p_adec, getpid()); @@ -793,6 +808,31 @@ static void RunThread( adec_thread_t * p_adec ) p_adec->b_error = 1; } + /* Initializing date_increment */ + switch ( (p_adec->bit_stream.fifo.buffer & ADEC_HEADER_LAYER_MASK) >> ADEC_HEADER_LAYER_SHIFT ) + { + /* Layer 2 */ + case 2: + s64_numerator = 1152 * 1000000; + s64_denominator = (s64)p_adec->p_aout->dsp.l_rate; + break; + + /* Layer 1 */ + case 3: + s64_numerator = 384 * 1000000; + s64_denominator = (s64)p_adec->p_aout->dsp.l_rate; + break; + } + date_increment.l_remainder = -(long)s64_denominator; + date_increment.l_euclidean_integer = 0; + while ( s64_numerator >= s64_denominator ) + { + date_increment.l_euclidean_integer++; + s64_numerator -= s64_denominator; + } + date_increment.l_euclidean_remainder = (long)s64_numerator; + date_increment.l_euclidean_denominator = (long)s64_denominator; + /* Audio decoder thread's main loop */ while ( (!p_adec->b_die) && (!p_adec->b_error) ) { @@ -849,7 +889,7 @@ static void RunThread( adec_thread_t * p_adec ) { pthread_mutex_lock( &p_adec->p_aout_fifo->data_lock ); /* Frame 1 */ - p_adec->p_aout_fifo->date[p_adec->p_aout_fifo->l_end_frame] = adec_date; + p_adec->p_aout_fifo->date[p_adec->p_aout_fifo->l_end_frame] = date; p_adec->p_aout_fifo->l_end_frame = (p_adec->p_aout_fifo->l_end_frame + 1) & AOUT_FIFO_SIZE; /* Frame 2 */ p_adec->p_aout_fifo->date[p_adec->p_aout_fifo->l_end_frame] = LAST_MDATE; @@ -867,8 +907,10 @@ static void RunThread( adec_thread_t * p_adec ) p_adec->p_aout_fifo->date[p_adec->p_aout_fifo->l_end_frame] = LAST_MDATE; p_adec->p_aout_fifo->l_end_frame = (p_adec->p_aout_fifo->l_end_frame + 1) & AOUT_FIFO_SIZE; pthread_mutex_unlock( &p_adec->p_aout_fifo->data_lock ); - /* 24000 == 6*384/2/48000*1000000 */ - adec_date += 24000; /* !! */ + date += 24000; +/* + UPDATE_INCREMENT( date_increment, date ) +*/ } } break;