Пример #1
0
 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));
 }
Пример #2
0
        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);
        }