/******************************************************** IMA ADPCM audio decoder Copyright 2000 Eugene Kuznetsov (divx@euro.ru) *********************************************************/ #include #include #include "adpcm.h" #include #define __MODULE__ "ADPCM decoder" ADPCM_Decoder::ADPCM_Decoder(WAVEFORMATEX* wf, void* extension) { state.valprev=0; state.index=0; if(wf) { in_fmt=*wf; return; } else throw FATAL("Bad argument"); } #warning TEST WITH MONO int ADPCM_Decoder::Convert(unsigned char* in_data, Unsigned in_size, unsigned char* out_data, Unsigned out_size, Unsigned* size_read, Unsigned* size_written) { if(in_data==0)return -1; if(out_data==0)return -1; if(in_fmt.nChannels==1) { int nsamples=in_size/512; if(nsamples>out_size/2036)nsamples=out_size/2036; for(int i=0; i>16; dest[0]=state.valprev; adpcm_decoder((char*)inp, dest+1, 1016, &state); } if(size_read)*size_read=nsamples*512; if(size_written)*size_written=nsamples*2036; return 0; } else { int in_left[128], in_right[128]; short out_left[1016], out_right[1016]; int nsamples=in_size/1024; if(nsamples>out_size/4072)nsamples=out_size/4072; for(int i=0; i>16; dest[0]=state.valprev; adpcm_decoder((char*)in_left, out_left, 1016, &state); state.valprev=inp[-1]; state.index=inp[-1]>>16; dest[1]=state.valprev; adpcm_decoder((char*)in_right, out_right, 1016, &state); for(int j=0; j<1016; j++) { dest[2+2*j]=out_left[j]; dest[2+2*j+1]=out_right[j]; } } if(size_read)*size_read=nsamples*1024; if(size_written)*size_written=nsamples*4072; return 0; } }