comparison dec_audio.c @ 1528:a444bd456fcc

ac3/spdif patch by German Gomez Garcia <german@piraos.com>
author arpi
date Wed, 15 Aug 2001 11:50:55 +0000
parents 0e9c29538a86
children 81aa2d701ae0
comparison
equal deleted inserted replaced
1527:187aa4b576a7 1528:a444bd456fcc
26 #include "libac3/ac3.h" 26 #include "libac3/ac3.h"
27 27
28 #include "alaw.h" 28 #include "alaw.h"
29 29
30 #include "xa/xa_gsm.h" 30 #include "xa/xa_gsm.h"
31
32 #include "ac3-iec958.h"
31 33
32 #ifdef USE_DIRECTSHOW 34 #ifdef USE_DIRECTSHOW
33 #include "loader/DirectShow/DS_AudioDec.h" 35 #include "loader/DirectShow/DS_AudioDec.h"
34 #endif 36 #endif
35 37
128 break; 130 break;
129 case AFM_AC3: 131 case AFM_AC3:
130 // Dolby AC3 audio: 132 // Dolby AC3 audio:
131 sh_audio->audio_out_minsize=4*256*6; 133 sh_audio->audio_out_minsize=4*256*6;
132 break; 134 break;
135 case AFM_HWAC3:
136 // Dolby AC3 audio:
137 sh_audio->audio_out_minsize=4*256*6;
138 sh_audio->sample_format = AFMT_AC3;
139 break;
133 case AFM_GSM: 140 case AFM_GSM:
134 // MS-GSM audio codec: 141 // MS-GSM audio codec:
135 sh_audio->audio_out_minsize=4*320; 142 sh_audio->audio_out_minsize=4*320;
136 break; 143 break;
137 case AFM_MPEG: 144 case AFM_MPEG:
217 } else { 224 } else {
218 driver=0; // bad frame -> disable audio 225 driver=0; // bad frame -> disable audio
219 } 226 }
220 break; 227 break;
221 } 228 }
229 case AFM_HWAC3: {
230 unsigned char *buffer;
231 struct hwac3info ai;
232 int len, skipped;
233 len = ds_get_packet(sh_audio->ds, &buffer);
234 if(ac3_iec958_parse_syncinfo(buffer, len, &ai, &skipped) < 0) {
235 fprintf(stderr, "AC3 stream not valid.\n");
236 driver = 0;
237 break;
238 }
239 if(ai.samplerate != 48000) {
240 fprintf(stderr, "Only 48000 Hz streams supported.\n");
241 driver = 0;
242 break;
243 }
244 sh_audio->samplerate=ai.samplerate;
245 // sh_audio->samplesize=ai.framesize;
246 sh_audio->channels=1;
247 sh_audio->i_bps=ai.bitrate*(1000/8);
248 sh_audio->ac3_frame=malloc(6144);
249 break;
250 }
222 case AFM_ALAW: { 251 case AFM_ALAW: {
223 // aLaw audio codec: 252 // aLaw audio codec:
224 sh_audio->channels=sh_audio->wf->nChannels; 253 sh_audio->channels=sh_audio->wf->nChannels;
225 sh_audio->samplerate=sh_audio->wf->nSamplesPerSec; 254 sh_audio->samplerate=sh_audio->wf->nSamplesPerSec;
226 sh_audio->i_bps=sh_audio->channels*sh_audio->samplerate; 255 sh_audio->i_bps=sh_audio->channels*sh_audio->samplerate;
330 memcpy(buf,((ac3_frame_t*)sh_audio->ac3_frame)->audio_data,len); 359 memcpy(buf,((ac3_frame_t*)sh_audio->ac3_frame)->audio_data,len);
331 sh_audio->ac3_frame=NULL; 360 sh_audio->ac3_frame=NULL;
332 } 361 }
333 //printf("{3:%d}",avi_header.idx_pos);fflush(stdout); 362 //printf("{3:%d}",avi_header.idx_pos);fflush(stdout);
334 break; 363 break;
364 case AFM_HWAC3: // AC3 through SPDIF
365 if(demux_read_data(sh_audio->ds,sh_audio->ac3_frame, 6144) != 6144)
366 break; //EOF
367 ac3_iec958_build_burst(1536, 0x1F, 1, buf, sh_audio->ac3_frame);
368 len = 6144;
369 break;
335 #ifdef USE_WIN32DLL 370 #ifdef USE_WIN32DLL
336 case AFM_ACM: 371 case AFM_ACM:
337 // len=sh_audio->audio_out_minsize; // optimal decoded fragment size 372 // len=sh_audio->audio_out_minsize; // optimal decoded fragment size
338 // if(len<minlen) len=minlen; else 373 // if(len<minlen) len=minlen; else
339 // if(len>maxlen) len=maxlen; 374 // if(len>maxlen) len=maxlen;
385 sh_audio->ac3_frame=ac3_decode_frame(); // resync 420 sh_audio->ac3_frame=ac3_decode_frame(); // resync
386 // if(verbose) printf(" OK!\n"); 421 // if(verbose) printf(" OK!\n");
387 break; 422 break;
388 case AFM_ACM: 423 case AFM_ACM:
389 case AFM_DSHOW: 424 case AFM_DSHOW:
425 case AFM_HWAC3:
390 sh_audio->a_in_buffer_len=0; // reset ACM/DShow audio buffer 426 sh_audio->a_in_buffer_len=0; // reset ACM/DShow audio buffer
391 break; 427 break;
392 } 428 }
393 429
394 } 430 }