/******************************************************** PCM audio decoder Copyright 2000 Eugene Kuznetsov (divx@euro.ru) *********************************************************/ #include #include #include "pcm.h" PCM_Decoder::PCM_Decoder(WAVEFORMATEX* wf, void* extension) { in_fmt=*wf; } int PCM_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; int csize=in_size1)// need to raise frequency if(m_wstr.wBitsPerSample==8) raise_and_resample_8to16((char*)in_data, (short*)out_data, num_samples); else resample((short*)in_data, (short*)out_data, num_samples); else if(m_wstr.wBitsPerSample==8) raise_8to16((char*)in_data, (short*)out_data, num_samples); else copy((short*)in_data, (short*)out_data, num_samples); if(format) { format->is_stereo=m_wstr.nChannels-1; format->freq=m_wstr.nSamplesPerSec/m_wstr.nChannels*m_resampler; format->valid=OUT_FORMAT_VALID; } in_size=num_samples*m_wstr.wBitsPerSample/8; return num_samples*m_resampler*2; fail: in_size=0; return 0; } void PCM_Decoder::copy(const short* src_data, short* dest_data, int samples) { memcpy(dest_data, src_data, samples*2); } void PCM_Decoder::raise_8to16(const char* src_data, short* dest_data, int samples) { for(int i=0; i