/******************************************************** Audio decoder interface Copyright 2000 Eugene Kuznetsov (divx@euro.ru) *********************************************************/ #include "config.h" #include "gsm61dec.h" #include "mpeg/mpegsound.h" //#include "mp3-decoder.h" #include "pcm.h" #include "acm.h" #include "adpcm.h" #include #ifdef HAVE_AC3 #include "ac3.h" #endif #include #define __MODULE__ "Audio decoder" IAudioDecoder* IAudioDecoder::Create(WAVEFORMATEX* format, void* extension) { if(!format) return 0; IAudioDecoder* decoder; // in_fmt=*format; char s[256]; switch(format->wFormatTag) { case 0x01://PCM decoder=new PCM_Decoder(format, extension); printf("Audio in PCM format\n"); break; case 0x2://MS ADPCM decoder=new ACM_Decoder(format, extension);; printf("Audio in MS ADPCM format\n"); break; case 0x11://IMA ADPCM decoder=new ADPCM_Decoder(format, extension);; printf("Audio in ADPCM format\n"); break; case 0x31://MS GSM 6.10 case 0x32://MSN Audio decoder=new MSGSM_Decoder(format, extension);; printf("Audio in MS GSM 6.10 format\n"); break; case 0x50://MPEG Layer-1,2 decoder=new Mpegtoraw(format, extension);; // decoder=new MP3_Decoder(format, extension); printf("Audio in MPEG Layer-1/2 format\n"); break; case 0x55://MPEG Layer-3 decoder=new Mpegtoraw(format, extension); // decoder=new MP3_Decoder(format, extension); printf("Audio in MPEG Layer-3 format\n"); break; case 0x160: case 0x161://DivX audio decoder=new ACM_Decoder(format, extension);; printf("Audio in DivX WMA format\n"); break; case 0x401://Intel Music Coder decoder=new ACM_Decoder(format, extension);; printf("Audio in IMC format\n"); break; #ifdef HAVE_AC3 case 0x2000://AC3 printf("Audio in AC3 format\n"); decoder=new AC3_Decoder(format, extension); break; #endif default: sprintf(s,"Audio format ID %d unsupported\n", format->wFormatTag); throw FATAL(s); } return decoder; } int IAudioDecoder::GetOutputFormat(WAVEFORMATEX* destfmt) { if(destfmt==0)return -1; // if(m_status==0)return -1; // return decoder->GetOutFormat(destfmt); WAVEFORMATEX* srcfmt=&in_fmt; if(in_fmt.wBitsPerSample==0) in_fmt.wBitsPerSample=16; if(in_fmt.wBitsPerSample==4)//ADPCM in_fmt.wBitsPerSample=16; if(in_fmt.wBitsPerSample==2) in_fmt.wBitsPerSample=16;//IMC *destfmt=in_fmt; if(in_fmt.nChannels==5)//AC3 destfmt->nChannels = 2; destfmt->wFormatTag=1;//PCM destfmt->nAvgBytesPerSec=destfmt->nSamplesPerSec*destfmt->wBitsPerSample*destfmt->nChannels/8; destfmt->nBlockAlign=destfmt->nChannels*destfmt->wBitsPerSample/8; destfmt->cbSize=0; printf("src [wFormatTag=%u, nChannels=%u, nSamplesPerSec=%lu, nAvgBytesPerSec=%lu, nBlockAlign=%u, wBitsPerSample=%u, cbSize=%u]\n", srcfmt->wFormatTag, srcfmt->nChannels, srcfmt->nSamplesPerSec, srcfmt->nAvgBytesPerSec, srcfmt->nBlockAlign, srcfmt->wBitsPerSample, srcfmt->cbSize); printf("dst [wFormatTag=%u, nChannels=%u, nSamplesPerSec=%lu, nAvgBytesPerSec=%lu, nBlockAlign=%u, wBitsPerSample=%u, cbSize=%u]\n", destfmt->wFormatTag, destfmt->nChannels, destfmt->nSamplesPerSec, destfmt->nAvgBytesPerSec, destfmt->nBlockAlign, destfmt->wBitsPerSample, destfmt->cbSize); return 0; }