Mercurial > mplayer.hg
comparison mplayer.c @ 190:a8552ad553e0
DirectShow audio support
author | arpi_esp |
---|---|
date | Thu, 22 Mar 2001 01:57:58 +0000 |
parents | 55206b791586 |
children | ae0f909ccc7c |
comparison
equal
deleted
inserted
replaced
189:45778577e6aa | 190:a8552ad553e0 |
---|---|
56 char f4[8]; | 56 char f4[8]; |
57 } GUID; | 57 } GUID; |
58 | 58 |
59 #ifdef USE_DIRECTSHOW | 59 #ifdef USE_DIRECTSHOW |
60 #include "DirectShow/DS_VideoDec.h" | 60 #include "DirectShow/DS_VideoDec.h" |
61 #include "DirectShow/DS_AudioDec.h" | |
61 #endif | 62 #endif |
62 | 63 |
63 #include "opendivx/decore.h" | 64 #include "opendivx/decore.h" |
64 | 65 |
65 | 66 |
365 int seek_to_byte=0; | 366 int seek_to_byte=0; |
366 int f; // filedes | 367 int f; // filedes |
367 int stream_type; | 368 int stream_type; |
368 stream_t* stream=NULL; | 369 stream_t* stream=NULL; |
369 int file_format=DEMUXER_TYPE_UNKNOWN; | 370 int file_format=DEMUXER_TYPE_UNKNOWN; |
370 int has_audio=1; // audio format 0=no 1=mpeg 2=pcm 3=ac3 4=win32 5=alaw 6=msgsm | 371 int has_audio=1; // audio 0=no 1=mpeg 2=pcm 3=ac3 4=ACM 5=alaw 6=msgsm 7=DShow |
371 int has_video=0; // video format 0=no 1=mpeg 2=win32/VfW 3=OpenDivX 4=w32/DShow | 372 int has_video=0; // video 0=no 1=mpeg 2=win32/VfW 3=OpenDivX 4=w32/DShow |
372 // | 373 // |
373 int audio_format=0; // override | 374 int audio_format=0; // override |
374 #ifdef ALSA_TIMER | 375 #ifdef ALSA_TIMER |
375 int alsa=1; | 376 int alsa=1; |
376 #else | 377 #else |
674 has_audio=4; // Win32/ACM | 675 has_audio=4; // Win32/ACM |
675 } | 676 } |
676 if(verbose) printf("detected AVI audio format: %d\n",has_audio); | 677 if(verbose) printf("detected AVI audio format: %d\n",has_audio); |
677 if(has_audio==4){ | 678 if(has_audio==4){ |
678 if(!avi_header.audio_codec) avi_header.audio_codec=get_auds_codec_name(); | 679 if(!avi_header.audio_codec) avi_header.audio_codec=get_auds_codec_name(); |
680 if(avi_header.auds_guid) has_audio=7; // force DShow | |
679 if(!avi_header.audio_codec) has_audio=0; // unknown win32 codec | 681 if(!avi_header.audio_codec) has_audio=0; // unknown win32 codec |
680 if(verbose) printf("win32 audio codec: '%s'\n",avi_header.audio_codec); | 682 if(verbose) printf("win32 audio codec: '%s'\n",avi_header.audio_codec); |
681 } | 683 } |
682 if(has_audio){ | 684 if(has_audio){ |
683 if(verbose) printf("AVI: Searching for audio stream (id:%d)\n",d_audio->id); | 685 if(verbose) printf("AVI: Searching for audio stream (id:%d)\n",d_audio->id); |
741 has_audio=4; // Win32/ACM | 743 has_audio=4; // Win32/ACM |
742 } | 744 } |
743 if(verbose) printf("detected ASF audio format: %d\n",has_audio); | 745 if(verbose) printf("detected ASF audio format: %d\n",has_audio); |
744 if(has_audio==4){ | 746 if(has_audio==4){ |
745 if(!avi_header.audio_codec) avi_header.audio_codec=get_auds_codec_name(); | 747 if(!avi_header.audio_codec) avi_header.audio_codec=get_auds_codec_name(); |
748 if(avi_header.auds_guid) has_audio=7; // force DShow | |
746 if(!avi_header.audio_codec) has_audio=0; // unknown win32 codec | 749 if(!avi_header.audio_codec) has_audio=0; // unknown win32 codec |
747 if(verbose) printf("win32 audio codec: '%s'\n",avi_header.audio_codec); | 750 if(verbose) printf("win32 audio codec: '%s'\n",avi_header.audio_codec); |
748 } | 751 } |
749 if(has_audio){ | 752 if(has_audio){ |
750 if(verbose) printf("ASF: Searching for audio stream (id:%d)\n",d_audio->id); | 753 if(verbose) printf("ASF: Searching for audio stream (id:%d)\n",d_audio->id); |
1163 has_audio=1; // fallback to mp3lib | 1166 has_audio=1; // fallback to mp3lib |
1164 } else | 1167 } else |
1165 has_audio=0; // nosound | 1168 has_audio=0; // nosound |
1166 } | 1169 } |
1167 } | 1170 } |
1171 | |
1172 if(has_audio==7){ | |
1173 #ifndef USE_DIRECTSHOW | |
1174 printf("Compiled without DirectShow support -> force nosound :(\n"); | |
1175 has_audio=0; | |
1176 #else | |
1177 // Win32 DShow audio codec: | |
1178 WAVEFORMATEX *in_fmt=(WAVEFORMATEX*)&avi_header.wf_ext; | |
1179 avi_header.wf.nChannels=in_fmt->nChannels; | |
1180 avi_header.wf.nSamplesPerSec=in_fmt->nSamplesPerSec; | |
1181 avi_header.wf.nAvgBytesPerSec=2*avi_header.wf.nSamplesPerSec*avi_header.wf.nChannels; | |
1182 avi_header.wf.wFormatTag=WAVE_FORMAT_PCM; | |
1183 avi_header.wf.nBlockAlign=2*in_fmt->nChannels; | |
1184 avi_header.wf.wBitsPerSample=16; | |
1185 avi_header.wf.cbSize=0; | |
1186 | |
1187 if(!DS_AudioDecoder_Open(avi_header.audio_codec,avi_header.auds_guid,in_fmt)){ | |
1188 MP3_channels=avi_header.wf.nChannels; | |
1189 MP3_samplerate=avi_header.wf.nSamplesPerSec; | |
1190 } else { | |
1191 printf("Could not load/initialize Win32/DirctShow AUDIO codec (missing .AX file?)\n"); | |
1192 if((in_fmt->wFormatTag)==0x55){ | |
1193 printf("Audio format is MP3 -> fallback to internal mp3lib/mpg123\n"); | |
1194 has_audio=1; // fallback to mp3lib | |
1195 } else | |
1196 has_audio=0; // nosound | |
1197 } | |
1198 #endif | |
1199 } | |
1200 | |
1168 | 1201 |
1169 // allocate audio out buffer: | 1202 // allocate audio out buffer: |
1170 a_buffer=malloc(a_buffer_size); | 1203 a_buffer=malloc(a_buffer_size); |
1171 memset(a_buffer,0,a_buffer_size); | 1204 memset(a_buffer,0,a_buffer_size); |
1172 a_buffer_len=0; | 1205 a_buffer_len=0; |