internal byte[] ConvertSamples(byte[] pvInSamples) { short[] data = null; short[] array = AudioFormatConverter.Convert(pvInSamples, _iInFormatType, AudioCodec.PCM16); if (_inWavFormat.nChannels == 2 && _outWavFormat.nChannels == 1) { data = Resample(_inWavFormat, _outWavFormat, Stereo2Mono(array), _leftMemory); } else if (_inWavFormat.nChannels == 1 && _outWavFormat.nChannels == 2) { data = Mono2Stereo(Resample(_inWavFormat, _outWavFormat, array, _leftMemory)); } if (_inWavFormat.nChannels == 2 && _outWavFormat.nChannels == 2) { if (_inWavFormat.nSamplesPerSec != _outWavFormat.nSamplesPerSec) { short[] leftSamples; short[] rightSamples; SplitStereo(array, out leftSamples, out rightSamples); data = MergeStereo(Resample(_inWavFormat, _outWavFormat, leftSamples, _leftMemory), Resample(_inWavFormat, _outWavFormat, rightSamples, _rightMemory)); } else { data = array; } } if (_inWavFormat.nChannels == 1 && _outWavFormat.nChannels == 1) { data = Resample(_inWavFormat, _outWavFormat, array, _leftMemory); } _eChunkStatus = Block.Middle; return(AudioFormatConverter.Convert(data, AudioCodec.PCM16, _iOutFormatType)); }
internal bool PrepareConverter(ref WAVEFORMATEX inWavFormat, ref WAVEFORMATEX outWavFormat) { bool result = true; if (inWavFormat.nSamplesPerSec <= 0 || inWavFormat.nChannels > 2 || inWavFormat.nChannels <= 0 || outWavFormat.nChannels <= 0 || outWavFormat.nSamplesPerSec <= 0 || outWavFormat.nChannels > 2) { throw new FormatException(); } _iInFormatType = AudioFormatConverter.TypeOf(inWavFormat); _iOutFormatType = AudioFormatConverter.TypeOf(outWavFormat); if (_iInFormatType < AudioCodec.G711U || _iOutFormatType < AudioCodec.G711U) { throw new FormatException(); } if (outWavFormat.nSamplesPerSec == inWavFormat.nSamplesPerSec && _iOutFormatType == _iInFormatType && outWavFormat.nChannels == inWavFormat.nChannels) { result = false; } else { if (inWavFormat.nSamplesPerSec != outWavFormat.nSamplesPerSec) { CreateResamplingFilter(inWavFormat.nSamplesPerSec, outWavFormat.nSamplesPerSec); } _inWavFormat = inWavFormat; _outWavFormat = outWavFormat; } return(result); }