Esempio n. 1
0
        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;
            }
        }
Esempio n. 2
0
        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();
            }
        }