public void Setup(AudioEncoderSettings inputPars, NetworkSettings networkPars) { logger.Debug("AudioReceiver::Setup(...)"); try { decoder = new AudioDecoder(); decoder.Open(inputPars); waveFormat = new WaveFormat(8000, 16, 1); var _deviceId = inputPars.DeviceId; Guid deviceId = Guid.Empty; if (!string.IsNullOrEmpty(_deviceId)) { Guid.TryParse(_deviceId, out deviceId); } DirectSoundDeviceInfo deviceInfo = null; var DSDevices = DirectSoundOut.Devices; if (DSDevices != null && DSDevices.Count() > 0) { //DirectSoundOut.DSDEVID_DefaultPlayback deviceInfo = DSDevices.FirstOrDefault(d => d.Guid == deviceId) ?? DSDevices.FirstOrDefault(); } if (deviceId == null) { throw new Exception("Audio device not found..."); } if (deviceInfo != null) { logger.Info(deviceInfo.Description + " " + deviceInfo.ModuleName + " " + deviceInfo.Guid); wavePlayer = new NAudio.Wave.DirectSoundOut(deviceInfo.Guid); //wavePlayer = new NAudio.Wave.WaveOut(); wavePlayer.PlaybackStopped += WavePlayer_PlaybackStopped; waveBuffer = new BufferedWaveProvider(waveFormat) { BufferDuration = TimeSpan.FromMilliseconds(300), //BufferDuration = TimeSpan.FromMilliseconds(300), DiscardOnBufferOverflow = true }; volumeProvider = new VolumeSampleProvider(waveBuffer.ToSampleProvider()); var meteringSampleProvider = new MeteringSampleProvider(volumeProvider); meteringSampleProvider.StreamVolume += PostVolumeMeter_StreamVolume; wavePlayer.Init(meteringSampleProvider); bufferLost = false; } else { throw new Exception("DirectSound devices is not available..."); } session = new PCMUSession(); if (networkPars.TransportMode == TransportMode.Tcp) { rtpReceiver = new RtpTcpReceiver(session); } else { rtpReceiver = new RtpUdpReceiver(session); } session.SSRC = networkPars.SSRC; rtpReceiver.Open(networkPars); rtpReceiver.RtpPacketReceived += RtpReceiver_RtpPacketReceived; } catch (Exception ex) { logger.Debug(ex); CleanUp(); throw; } }
public void Setup(AudioEncoderSettings encoderSettings, NetworkSettings networkSettings) { logger.Debug("AudioStreamer::Start(...) "); this.Id = "AudioStreamer_" + Guid.NewGuid().ToString(); this.EncoderSettings = encoderSettings; this.NetworkSettings = networkSettings; try { // var capture = audioSource.Capture; var waveFormat = audioSource.WaveFormat; //bufferedWaveProvider = new BufferedWaveProvider(waveFormat); //bufferedWaveProvider.DiscardOnBufferOverflow = true; //sampleChannel = new SampleChannel(bufferedWaveProvider); audioResampler = new AudioEncoder(); var captureParams = new AudioEncoderSettings { SampleRate = waveFormat.SampleRate, Channels = waveFormat.Channels, }; audioResampler.Open(captureParams, encoderSettings); session = new PCMUSession(); if (networkSettings.TransportMode == TransportMode.Tcp) { RtpSender = new RtpTcpSender(session); } else if (networkSettings.TransportMode == TransportMode.Udp) { RtpSender = new RtpUdpSender(session); } else { throw new FormatException("NotSupportedFormat " + networkSettings.TransportMode); } audioSource.DataAvailable += AudioSource_DataAvailable; RtpSender.Setup(networkSettings); networkSettings.SSRC = session.SSRC; RtpSender.Start(); IsStreaming = true; OnStateChanged(); } catch (Exception ex) { logger.Error(ex); Close(); } }