Example #1
0
        public void StartRecord()
        {
            Parent.Log.WriteLog("客户{0}启用语音输出", Parent.Name);
            if (!RequestConstants.VoiceFromFile)
            {
                //Lame init
                _lameConfig = new BE_CONFIG(new LameWaveFormat(SAMPLE_RATE, BITS, CHANNELS));
                Lame.beInitStream(_lameConfig, ref _lameInSamples, ref _lameOutBufferSize, ref _lameStream);
                _lameInBuffer  = new byte[_lameInSamples * 2]; //Input buffer is expected as short[]
                _lameOutBuffer = new byte[_lameOutBufferSize];

                WaveIn = new WaveIn();
                //waveIn.BufferMilliseconds = 50;
                //waveIn.DeviceNumber = inputDeviceNumber;
                WaveIn.WaveFormat = new WaveFormat(SAMPLE_RATE, CHANNELS);
                //配置waveIn以优化发送间隔
                //font
                WaveIn.DataAvailable += waveIn_DataAvailable;
                ////background
                //WaveInEvent waveInE = new WaveInEvent();
                //waveInE.DataAvailable += waveIn_DataAvailable;
                //waveIn.DataAvailable = waveInE;
                WaveIn.StartRecording();
            }
            else
            {
                //模拟持续录入
                byte[] buffer = File.ReadAllBytes(RequestConstants.FilePath);
                Parent.Log.WriteLog("音频数据已加载");
                int length   = buffer.Length;
                int position = 0;

                #region WriteData需要的初始化内容
                ////Lame init
                //_lameConfig = new BE_CONFIG(new LameWaveFormat(SAMPLE_RATE, BITS, CHANNELS));
                //Lame.beInitStream(_lameConfig, ref _lameInSamples, ref  _lameOutBufferSize, ref _lameStream);
                //_lameInBuffer = new byte[_lameInSamples * 2]; //Input buffer is expected as short[]
                //_lameOutBuffer = new byte[_lameOutBufferSize];
                //WriteData(buffer, 0, length);
                #endregion
                try
                {
                    while (length - position > 0)
                    {
                        int sendLength = Math.Min(length, Parent.TargetClient.SendBufferSize);
                        Parent.TargetClient.Send(buffer, sendLength, SocketFlags.None);
                        Thread.Sleep(100);
                        position += sendLength;
                        Parent.Log.WriteLog("{0}已传输{1}位数据", Parent.Name, sendLength);
                    }
                }
                catch (Exception)
                {
                    throw;
                }
                int j = 1;
            }
        }
Example #2
0
        private void WriteData(byte[] buffer, int index, int count)
        {
            int  ToCopy      = 0;
            uint EncodedSize = 0;
            uint LameResult;

            while (count > 0)
            {
                if (_lameInBufferPos > 0)
                {
                    ToCopy = Math.Min(count, _lameInBuffer.Length - _lameInBufferPos);
                    Buffer.BlockCopy(buffer, index, _lameInBuffer, _lameInBufferPos, ToCopy);
                    _lameInBufferPos += ToCopy;
                    index            += ToCopy;
                    count            -= ToCopy;
                    if (_lameInBufferPos >= _lameInBuffer.Length)
                    {
                        _lameInBufferPos = 0;
                        if ((LameResult = Lame.EncodeChunk(_lameStream, _lameInBuffer, _lameOutBuffer, ref EncodedSize)) == Lame.BE_ERR_SUCCESSFUL)
                        {
                            if (EncodedSize > 0)
                            {
                                if (Parent.SendBuffer(Parent.TargetClient, _lameOutBuffer, (int)EncodedSize) == -1)
                                {
                                    break;
                                }
                            }
                        }
                        else
                        {
                            throw new ApplicationException(string.Format("Lame.EncodeChunk failed with the error code {0}", LameResult));
                        }
                    }
                }
                else
                {
                    if (count >= _lameInBuffer.Length)
                    {
                        if ((LameResult = Lame.EncodeChunk(_lameStream, buffer, index, (uint)_lameInBuffer.Length, _lameOutBuffer, ref EncodedSize)) == Lame.BE_ERR_SUCCESSFUL)
                        {
                            if (EncodedSize > 0)
                            {
                                if (Parent.SendBuffer(Parent.TargetClient, _lameOutBuffer, (int)EncodedSize) == -1)
                                {
                                    break;
                                }
                            }
                        }
                        else
                        {
                            throw new ApplicationException(string.Format("Lame.EncodeChunk failed with the error code {0}", LameResult));
                        }
                        count -= _lameInBuffer.Length;
                        index += _lameInBuffer.Length;
                    }
                    else
                    {
                        Buffer.BlockCopy(buffer, index, _lameInBuffer, 0, count);
                        _lameInBufferPos = count;
                        index           += count;
                        count            = 0;
                    }
                }
            }
        }