Ejemplo n.º 1
0
        public void Init(IAudioCodec codec)
        {
            this.codec = codec;

            // Init record input
            input = new WaveIn();
            input.DeviceNumber   = cbInput.SelectedIndex;
            input.WaveFormat     = codec.RecordFormat;
            input.DataAvailable += Input_DataAvailable;
            input.StartRecording();

            // Init buffer - level meters will use it
            buffer             = new BufferedWaveProvider(codec.RecordFormat);
            InputBufferMilisec = 50;

            // Init level meters
            channel = new SampleChannel(buffer, true);
            var meter = new MeteringSampleProvider(channel);

            meter.StreamVolume += Meter_StreamVolume;

            // Init feedback output
            output        = new WaveOut();
            output.Volume = FeedbackVolume;
            output.Init(meter);
            output.Play();

            Ready = true;
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 加载歌曲
        /// </summary>
        /// <param name="itemm">要加载的歌曲</param>
        private static void Load(SongItem itemm)
        {
            if (Config.ControlOtherPlayer)
            {
                API.SendKey(System.Windows.Input.Key.MediaStop);
            }
            DanmukuReceiver.VoteUids.Clear();

            waveout = Create();

            FileReader = new Mp3FileReader(itemm._FilePath);

            var sampleChannel = new SampleChannel(FileReader, true);

            setVolumeDelegate = vol => sampleChannel.Volume = vol;

            var postVolumeMeter = new MeteringSampleProvider(sampleChannel);

            waveout.Init(postVolumeMeter);

            waveout.PlaybackStopped += Waveout_PlaybackStopped;
            SetVol();

            lrc = itemm._FLyric ?? itemm.getFLyric();
        }
Ejemplo n.º 3
0
        public void Stop()
        {
            if (playbackState == StreamingPlaybackState.Stopped)
            {
                return;
            }
            if (!fullyDownloaded)
            {
                webRequest.Abort();
            }

            playbackState = StreamingPlaybackState.Stopped;
            if (waveOut != null)
            {
                waveOut.Stop();
                waveOut.Dispose();
                waveOut = null;
                vuMeter.StreamVolume -= Meter_StreamVolume;
                vuMeter = null;
            }
            _timer.Change(Timeout.Infinite, Timeout.Infinite);
            LevelLeftValue  = 0;
            LevelRightValue = 0;
            // n.b. streaming thread may not yet have exited
            Thread.Sleep(500);
            bufferedSeconds = 0;
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Init the wave provider.
        /// </summary>
        private void Init()
        {
            // Create the channels
            SampleChannel          channel  = new SampleChannel(_audioReader, true);
            MeteringSampleProvider provider = new MeteringSampleProvider(channel);

            // Create the wave provider.
            _waveProvider = new SampleToWaveProvider(provider);

            // calculate the buffer size.
            int bufferSize = _waveProvider.WaveFormat.ConvertLatencyToByteSize((DesiredLatency + NumberOfBuffers - 1) / NumberOfBuffers);

            MmResult result;

            lock (_waveOutLock)
            {
                result = _callbackInfo.WaveOutOpen(out _hWaveOut, _device.Index, _waveProvider.WaveFormat, _callback);
            }
            MmException.Try(result, "waveOutOpen");

            _buffers       = new WaveOutBuffer[NumberOfBuffers];
            _playbackState = PlaybackState.Stopped;

            for (int n = 0; n < NumberOfBuffers; n++)
            {
                _buffers[n] = new WaveOutBuffer(_hWaveOut, bufferSize, _waveProvider, _waveOutLock);
            }
        }
Ejemplo n.º 5
0
        public AudioFile(String p)
        {
            path = p;

            Pace   = 1.0;
            volume = 0;

            //set the audio file object with a given audio file path in the drive
            try
            {
                audioOutput = new WaveOut();

                audio = new AudioFileReader(path);

                msp = new MeteringSampleProvider(audio);
                msp.StreamVolume += Msp_StreamVolume;

                audioOutput.Init(new SampleToWaveProvider(msp));
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Source);
            }

            audioOutput.Volume = (float)1.0;
        }
Ejemplo n.º 6
0
        private bool CreateWaveStream()
        {
            OptReturn optReturn;

            if (mWaveStream == null)
            {
                return(false);
            }
            try
            {
                WaveStream waveStream      = new CustomRateWaveStream(mWaveStream, mRate);
                var        waveChannel     = new SampleChannel(waveStream, true);
                var        postVolumeMeter = new MeteringSampleProvider(waveChannel);
                mSampleProvider = postVolumeMeter;
                return(true);
            }
            catch (Exception ex)
            {
                optReturn         = new OptReturn();
                optReturn.Code    = Defines.RET_FAIL;
                optReturn.Message = ex.Message;
                ShowException(optReturn);
                return(false);
            }
        }
Ejemplo n.º 7
0
        public void Play(string File)
        {
            try
            {
                if (waveOut != null)
                {
                    if (waveOut.PlaybackState != PlaybackState.Stopped)
                    {
                        waveOut.Stop();
                        audioFile.Dispose();
                        waveOut.Dispose();
                    }
                }

                waveOut             = new WasapiOut(NAudio.CoreAudioApi.AudioClientShareMode.Shared, 100);
                audioFile           = new AudioFileReader(File);
                meterSampleProvider = new MeteringSampleProvider(audioFile);
                meterSampleProvider.SamplesPerNotification = 100;
                meterSampleProvider.StreamVolume          += MeterSampleProvider_StreamVolume;

                audioFile.Volume = _volume;
                waveOut.Init(meterSampleProvider);


                waveOut.Play();
                OnPlay?.Invoke(new PlayEventArgs {
                    File = File
                });
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private void listViewBreakMusic_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (listViewBreakMusic.SelectedItems.Count == 1)
            {
                try
                {
                    createWaveOutBreak();

                    audioFileReaderBreak = new AudioFileReader(listViewBreakMusic.SelectedItems[0].SubItems[1].Text);
                    var sampleChannel = new SampleChannel(audioFileReaderBreak, true);
                    this.setVolumeDelegateBreak = (vol) => sampleChannel.Volume = vol;
                    var postVolumeMeter = new MeteringSampleProvider(sampleChannel);
                    postVolumeMeter.StreamVolume += onPostVolumeMeter;

                    //waveOutDevice.Init(postVolumeMeter);
                    waveOutDeviceBreak.Init(postVolumeMeter);
                    volumeSlider1.Volume = 1.0f;
                }
                catch (Exception)
                {
                    //Do nothing!
                }

                listViewBreakMusic.SelectedItems[0].EnsureVisible();

                enableButtons();
            }
        }
Ejemplo n.º 9
0
        private List <ISampleProvider> CreateInputStream(string fileName)
        {
            if (fileName != null)
            {
                this.fileWaveStreamDAC = CreateWaveStream(fileName);
                var waveChannelDAC = new SampleChannel(this.fileWaveStreamDAC);
                _form.setVolumeDelegateDAC = (vol) => waveChannelDAC.Volume = vol;
                //waveChannelDAC.PreVolumeMeter += _form.OnPreVolumeMeter;
                var postVolumeMeterDAC = new MeteringSampleProvider(waveChannelDAC);
                // postVolumeMeterDAC.StreamVolume += _form.OnPostVolumeMeter;


                this.fileWaveStreamDefault = CreateWaveStream(fileName);
                var waveChannelDefault = new SampleChannel(this.fileWaveStreamDefault);
                _form.setVolumeDelegateDefault = (vol) => waveChannelDefault.Volume = vol;
                waveChannelDefault.Volume      = (float)0.254;
                //waveChannelDefault.PreVolumeMeter += _form.OnPreVolumeMeter;
                var postVolumeMeterDefault = new MeteringSampleProvider(waveChannelDefault);

                //postVolumeMeterDefault.StreamVolume += _form.OnPostVolumeMeter;


                List <ISampleProvider> postVolumeMeters = new List <ISampleProvider>();
                postVolumeMeters.Add(postVolumeMeterDAC);
                postVolumeMeters.Add(postVolumeMeterDefault);
                return(postVolumeMeters);
            }
            else
            {
                return(null);
            }
        }
Ejemplo n.º 10
0
        private ISampleProvider CreateInputStream(string fileName)
        {
            if (System.IO.Path.GetExtension(fileName).ToUpper() == ".FLAC")
            {
                this.audioFileReader = new FlacReader(fileName);
            }
            else
            {
                this.audioFileReader = new AudioFileReader(fileName);
            }

            if (!(audioFileReader is FlacReader))
            {
                m_FadeInOutSampleProvider = new FadeInOutSampleProvider((ISampleProvider)audioFileReader, false);
            }

            var sampleChannel = new SampleChannel(audioFileReader, true);

            sampleChannel.PreVolumeMeter += OnPreVolumeMeter;
            this.InvokeSetVolumeDelegate  = (vol) =>
            {
                sampleChannel.Volume = vol;
                if (audioFileReader is AudioFileReader)
                {
                    ((AudioFileReader)audioFileReader).Volume = vol;
                }
            };
            var postVolumeMeter = new MeteringSampleProvider(((audioFileReader is FlacReader)) ? sampleChannel : (ISampleProvider)m_FadeInOutSampleProvider);

            postVolumeMeter.StreamVolume += OnPostVolumeMeter;

            return(postVolumeMeter);
        }
        private ISampleProvider CreateInputStream(string fileName)
        {
            audioFileReader         = new AudioFileReader(fileName);
            audioFileReader2        = new AudioFileReader(fileName);//创建一个静音流
            audioFileReader2.Volume = 0.0f;
            //处理多声道音频,双声道需要声卡驱动支持
            waveProvider = new MultiplexingWaveProvider(new IWaveProvider[] {
                audioFileReader, audioFileReader2
            }, 2);
            if (left_radio.IsChecked == true)
            {
                waveProvider.ConnectInputToOutput(2, 1);
                waveProvider.ConnectInputToOutput(3, 1);
            }
            else if (right_radio.IsChecked == true)
            {
                waveProvider.ConnectInputToOutput(2, 0);
                waveProvider.ConnectInputToOutput(3, 0);
            }
            var sampleChannel = new SampleChannel(waveProvider, false);

            setVolumeDelegate = vol => sampleChannel.Volume = vol;//设置音量
            var postVolumeMeter = new MeteringSampleProvider(sampleChannel);

            postVolumeMeter.StreamVolume += OnPostVolumeMeter;
            sampleChannel.PreVolumeMeter += OnPreVolumeMeter;//波形图
            return(postVolumeMeter);
        }
Ejemplo n.º 12
0
        protected override void playSong()
        {
            try {
                currentSong = nextSong;
                if (currentSong == null)
                {
                    currentSong = getNextSong();
                    if (currentSong == null)
                    {
                        MessageBox.Show("No songs to play.");
                        return;
                    }
                }

                if (fileReader != null)
                {
                    fileReader.Dispose();
                }
                fileReader = new Mp3FileReader(currentSong.filepath);
            } catch (Exception) {
                MessageBox.Show("Error reading " + currentSong + ".\n" +
                                "File does not exist or cannot be read.");
                if (fileReader != null)
                {
                    fileReader.Dispose();
                }
                loadNextSong(null, null);
                return;
            }

            startGUIThread();

            waveChannel = new WaveChannel32(fileReader, 1, panSlider.Pan);
            waveChannel.PadWithZeroes = false;

            SampleChannel sampleChannel = new SampleChannel(waveChannel);

            sampleChannel.PreVolumeMeter += onPreVolumeMeter;
            volumeDelegate = (vol) => sampleChannel.Volume = vol;
            volumeDelegate(absoluteVolume * mixedVolume);

            //Debug.WriteLine("absoluteVolume: " + absoluteVolume + " mixedVolume: " + mixedVolume);
            //Debug.WriteLine("absoluteVolume * mixedVolume = " + absoluteVolume * mixedVolume);

            postVolumeMeter = new MeteringSampleProvider(sampleChannel);
            postVolumeMeter.StreamVolume += onPostVolumeMeter;


            deviceOut.Init(postVolumeMeter);
            deviceOut.Play();

            label_EndTime.Text = String.Format("{0:00}:{1:00}",
                                               (int)fileReader.TotalTime.TotalMinutes,
                                               fileReader.TotalTime.Seconds);



            label_SongTitle.Text = currentSong.ToString();
        }
Ejemplo n.º 13
0
        //音声ファイルを再生する関数
        private void PlaySound(string audioFilePath)
        {
            //音声デバイスが設定されていない場合は再取得
            if (_wavePlayer == null)
            {
                Loaded();
            }

            //音声再生をTry
            try
            {
                //再生してるなら止める
                if (_wavePlayer.PlaybackState != PlaybackState.Stopped)
                {
                    _wavePlayer.Stop();
                }

                //音声ファイルのロード
                //対応フォーマット:.wav, .mp3, .aiff, MFCreateSourceReaderFromURL()で読めるもの(動画ファイルも可?)
                _reader = new AudioFileReader(audioFilePath);

                //sampleChannelにreaderをセット
                var sampleChannel = new SampleChannel(_reader, true);

                /*
                 * //ここでボリューム等(?)の設定が可能?
                 * //サンプルの AudioPlaybackPanel.cs を参照
                 * sampleChannel.PreVolumeMeter+= OnPreVolumeMeter;
                 * setVolumeDelegate = vol => sampleChannel.Volume = vol;
                 */

                //sampleChannelのボリュームをセット
                var postVolumeMeter = new MeteringSampleProvider(sampleChannel);

                /*
                 * //ここでボリューム等(?)の設定が可能?
                 * //サンプルの AudioPlaybackPanel.cs を参照
                 * postVolumeMeter.StreamVolume += OnPostVolumeMeter;
                 */

                //プレイヤーに設定をセット
                _wavePlayer.Init(postVolumeMeter);

                //再生
                YukarinetteLogger.Instance.Info($"Sound Play Start");
                _wavePlayer.Play();

                //YukarinetteLogger.Instance.Info("Sound Play End");
            }
            catch (YukarinetteException ex)
            {
                //エラー文出力
                YukarinetteLogger.Instance.Error($"Sound Play Error!");
                YukarinetteLogger.Instance.Error($"{audioFilePath}");
                YukarinetteLogger.Instance.Error($"{ex.Message}");
                YukarinetteConsoleMessage.Instance.WriteMessage($"{typeof(ExFilterPlugin)}: エラーが発生しました。再生を中止します。");
                YukarinetteConsoleMessage.Instance.WriteMessage(ex);
            }
        }
Ejemplo n.º 14
0
        private ISampleProvider CreateInputStream()
        {
            var sampleChannel = new SampleChannel(waveStream, true);
            sampleChannel.PreVolumeMeter += OnPreVolumeMeter;
            setVolumeDelegate = vol => sampleChannel.Volume = vol;
            var postVolumeMeter = new MeteringSampleProvider(sampleChannel);
            postVolumeMeter.StreamVolume += OnPostVolumeMeter;

            return postVolumeMeter;
        }
Ejemplo n.º 15
0
        public PlaybackTrack(MixingSampleProvider parent)
        {
            parentMixer = parent;
            mixer       = new MixingSampleProvider(parent.WaveFormat)
            {
                ReadFully = true
            };
            meter = new MeteringSampleProvider(mixer);

            parentMixer.AddMixerInput(meter);
        }
Ejemplo n.º 16
0
        static ISampleProvider CreateInput(string FileName)
        {
            AudioFileReader = new AudioFileReader(FileName);
            var sampleChanel = new SampleChannel(AudioFileReader, true);

            ChangeVolume = vol => sampleChanel.Volume = vol;

            var postVolumeMeter = new MeteringSampleProvider(sampleChanel);

            return(postVolumeMeter);
        }
Ejemplo n.º 17
0
        public void Enable()
        {
            try
            {
                ipep   = new IPEndPoint(IPAddress.Parse(Micobject.settings.sourcename), 8092);
                client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                client.Connect(ipep);
                logger.Info("与对方服务器{0}通信连接成功。", Micobject.settings.sourcename);
            }
            catch (SocketException se)
            {
                logger.Error("Socket异常:{0}", se.Message);
                throw;
            }
            catch (Exception ex)
            {
                logger.Error("通信异常", ex.Message);
            }
            try
            {
                _sampleRate    = Micobject.settings.samples;
                _bitsPerSample = Micobject.settings.bits;
                _channels      = Micobject.settings.channels;

                RecordingFormat = new WaveFormat(_sampleRate, _bitsPerSample, _channels);


                _waveIn = new WaveInEvent {
                    BufferMilliseconds = 40, DeviceNumber = 0, WaveFormat = RecordingFormat
                };
                _waveIn.DataAvailable    += WaveInDataAvailable;
                _waveIn.RecordingStopped += WaveInRecordingStopped;

                _waveProvider  = new WaveInProvider(_waveIn);
                _sampleChannel = new SampleChannel(_waveProvider);

                _meteringProvider = new MeteringSampleProvider(_sampleChannel);
                //_meteringProvider.StreamVolume += _meteringProvider_StreamVolume;
            }
            catch (Exception exc)
            {
                logger.Error(exc.Message);
            }

            try
            {
                _waveIn.StartRecording();
                logger.Info("开始接收语音信号。");
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message);
            }
        }
Ejemplo n.º 18
0
        private ISampleProvider CreateInputStream(string fileName)
        {
            audioFileReader = new AudioFileReader(fileName);

            SampleChannel          sampleChannel   = new SampleChannel(audioFileReader, true);
            MeteringSampleProvider postVolumeMeter = new MeteringSampleProvider(sampleChannel);

            postVolumeMeter.StreamVolume += OnPostVolumeMeter;

            return(postVolumeMeter);
        }
Ejemplo n.º 19
0
        private ISampleProvider CreateInputStream(string fileName)
        {
            audioFileReader = new AudioFileReader(fileName);
            SampleChannel sampleChannel = new SampleChannel(audioFileReader, true);

            postVolumeMeter = new MeteringSampleProvider(sampleChannel);
            fade            = new FadeInOutSampleProvider(postVolumeMeter);


            return(fade);
        }
Ejemplo n.º 20
0
        private ISampleProvider CreateInputStream(string fileName)
        {
            _audioFileReader = new AudioFileReader(fileName);

            var sampleChannel = new SampleChannel(_audioFileReader, true);

            sampleChannel.PreVolumeMeter += OnPreVolumeMeter;
            var postVolumeMeter = new MeteringSampleProvider(sampleChannel);

            return(postVolumeMeter);
        }
        public async void ConnectToServer(object o)
        {
            TcpClient client = new TcpClient(ipAddress, port); //IP адрес сервера и порт на котором он висит

            var rawSource      = new RawSourceWaveStream(client.GetStream(), waveFormat);
            var sampleProvider = rawSource.ToSampleProvider();

            metering = new MeteringSampleProvider(sampleProvider);
            metering.StreamVolume += realVolume;
            waveOut.Init(metering);
            waveOut.Play();
        }
Ejemplo n.º 22
0
 /// <summary>
 /// Initialises a new instance of SampleChannel
 /// </summary>
 /// <param name="waveProvider">Source wave provider, must be PCM or IEEE</param>
 /// <param name="forceStereo">force mono inputs to become stereo</param>
 public SampleChannel(IWaveProvider waveProvider, bool forceStereo)
 {
     ISampleProvider sampleProvider = SampleProviderConverters.ConvertWaveProviderIntoSampleProvider(waveProvider);
     if (sampleProvider.WaveFormat.Channels == 1 && forceStereo)
     {
         sampleProvider = new MonoToStereoSampleProvider(sampleProvider);
     }
     this.waveFormat = sampleProvider.WaveFormat;
     // let's put the meter before the volume (useful for drawing waveforms)
     this.preVolumeMeter = new MeteringSampleProvider(sampleProvider);
     this.volumeProvider = new VolumeSampleProvider(preVolumeMeter);
 }
Ejemplo n.º 23
0
        ISampleProvider CreateSampleProvider(string fileName)
        {
            m_AudioReader = new AudioFileReader(fileName);

            m_SampleChannel = new SampleChannel(m_AudioReader, true);
            m_SampleChannel.PreVolumeMeter += OnPreVolumeMeter;
            var postVolumeMeter = new MeteringSampleProvider(m_SampleChannel);

            postVolumeMeter.StreamVolume += OnPostVolumeMeter;

            return(postVolumeMeter);
        }
Ejemplo n.º 24
0
        private void AudioOutput_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (output != null && output.PlaybackState != PlaybackState.Stopped)
            {
                output.Pause();
            }

            output = new WasapiOut(outputs[audioOutputSelector.SelectedIndex], AudioClientShareMode.Shared, true, outputLatency);
            StoreSetting("output_device", audioOutputSelector.SelectedIndex.ToString());
            Logger.WriteLine("Set outputDevice to: " + audioOutputSelector.SelectedIndex.ToString());

            bitsPrSample = output.OutputWaveFormat.BitsPerSample;
            sampleRate   = output.OutputWaveFormat.SampleRate;
            channels     = output.OutputWaveFormat.Channels;


            // Set the WaveFormat
            outputFormat = WaveFormat.CreateIeeeFloatWaveFormat(sampleRate, channels);

            // (Re)Setup the mixer and buffers
            if (outputBufferTimer != null)
            {
                outputBufferTimer.Stop();
            }

            outputBuffer           = new BufferedWaveProvider(internalFormatStereo);
            outputBuffer.ReadFully = true;
            outputBuffer.DiscardOnBufferOverflow = true;

            WdlResamplingSampleProvider resampler = new WdlResamplingSampleProvider(outputBuffer.ToSampleProvider(), outputFormat.SampleRate);

            outputMeter = new MeteringSampleProvider(resampler, samplesPrIntegration);
            outputMeter.StreamVolume += (a, b) => RunOutputMeter(a, b, meter);

            SetOutputMode(outputMode);


            output.Init(outputMeter);
            output.Play();



            outputBufferTimer          = new System.Windows.Forms.Timer();
            outputBufferTimer.Interval = mainServerInterval;
            outputBufferTimer.Tick    += outputBufferTimerCheck;
            outputBufferTimer.Start();


            Logger.WriteLine("SET OUTPUT FORMAT: "
                             + "Sample Rate: " + sampleRate
                             + ", BitsPrSasmple: " + bitsPrSample
                             + ", Channels: " + channels);
        }
Ejemplo n.º 25
0
        private ISampleProvider CreateInputStream(string fileName)
        {
            audioFileReader = new AudioFileReader(fileName);
            var sampleChannel = new SampleChannel(audioFileReader, false);

            setVolumeDelegate = vol => sampleChannel.Volume = vol;
            var postVolumeMeter = new MeteringSampleProvider(sampleChannel);

            postVolumeMeter.StreamVolume          += OnPostVolumeMeter;
            postVolumeMeter.SamplesPerNotification = 80;
            return(postVolumeMeter);
        }
Ejemplo n.º 26
0
        private ISampleProvider CreateInputStream(string fileName)
        {
            audioFileReader = new AudioFileReader(fileName);
            
            var sampleChannel = new SampleChannel(audioFileReader, true);
            sampleChannel.PreVolumeMeter+= OnPreVolumeMeter;
            setVolumeDelegate = vol => sampleChannel.Volume = vol;
            var postVolumeMeter = new MeteringSampleProvider(sampleChannel);
            postVolumeMeter.StreamVolume += OnPostVolumeMeter;

            return postVolumeMeter;
        }
Ejemplo n.º 27
0
        private ISampleProvider createInputStream(string fileName)
        {
            this.audioFileReader          = new AudioFileReader(fileName);
            sampleChannel                 = new SampleChannel(audioFileReader, true);
            sampleChannel.PreVolumeMeter += OnPreVolumeMeter;
            sampleChannel.Volume          = Volume;

            var postVolumeMeter = new MeteringSampleProvider(sampleChannel);

            postVolumeMeter.StreamVolume += OnPostVolumeMeter;
            return(postVolumeMeter);
        }
Ejemplo n.º 28
0
        /// <summary>
        /// Initialises a new instance of SampleChannel
        /// </summary>
        /// <param name="waveProvider">Source wave provider, must be PCM or IEEE</param>
        /// <param name="forceStereo">force mono inputs to become stereo</param>
        public SampleChannel(IWaveProvider waveProvider, bool forceStereo)
        {
            ISampleProvider sampleProvider = SampleProviderConverters.ConvertWaveProviderIntoSampleProvider(waveProvider);

            if (sampleProvider.WaveFormat.Channels == 1 && forceStereo)
            {
                sampleProvider = new MonoToStereoSampleProvider(sampleProvider);
            }
            waveFormat = sampleProvider.WaveFormat;
            // let's put the meter before the volume (useful for drawing waveforms)
            preVolumeMeter = new MeteringSampleProvider(sampleProvider);
            volumeProvider = new VolumeSampleProvider(preVolumeMeter);
        }
Ejemplo n.º 29
0
        /// <summary>
        /// 使用指定的音频流绘制波形图
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        public OptReturn Draw(WaveStream stream)
        {
            OptReturn optReturn = new OptReturn();

            optReturn.Result = true;
            optReturn.Code   = Defines.RET_SUCCESS;
            try
            {
                WaveStream reader = stream;
                reader.Position = 0;

                if (reader.WaveFormat.Encoding != WaveFormatEncoding.Pcm && reader.WaveFormat.Encoding != WaveFormatEncoding.IeeeFloat)
                {
                    reader = WaveFormatConversionStream.CreatePcmStream(reader);
                    reader = new BlockAlignReductionStream(reader);
                }
                InitDraw();
                var waveChannel     = new SampleChannel(reader, true);
                int samples         = (int)(reader.TotalTime.TotalSeconds) * reader.WaveFormat.SampleRate / mPngWidth;
                var postVolumeMeter = new MeteringSampleProvider(waveChannel, samples);
                postVolumeMeter.StreamVolume += postVolumeMeter_StreamVolume;
                var waveProvider = new SampleToWaveProvider(postVolumeMeter);
                while (true)
                {
                    byte[] buffer    = new byte[waveProvider.WaveFormat.AverageBytesPerSecond];
                    int    readcount = waveProvider.Read(buffer, 0, waveProvider.WaveFormat.AverageBytesPerSecond);
                    if (readcount <= 0)
                    {
                        break;
                    }
                }
                stream.Position = 0;
                if (mIsSaveFile)
                {
                    return(GenerateImageFile());
                }
                Bitmap[] bitmaps = new Bitmap[2];
                bitmaps[0]     = mBitmap;
                bitmaps[1]     = mBitmap1;
                optReturn.Data = bitmaps;
                return(optReturn);
            }
            catch (Exception ex)
            {
                optReturn.Result  = false;
                optReturn.Code    = Defines.RET_FAIL;
                optReturn.Message = ex.Message;
                return(optReturn);
            }
        }
Ejemplo n.º 30
0
        public SoundCardRecorder(string filePath, string song)
        {
            FilePath = filePath;
            Song     = song;

            _waveIn = new WasapiLoopbackCapture();
            _waveIn.DataAvailable += OnDataAvailable;
            _buffer = new BufferedWaveProvider(_waveIn.WaveFormat);
            _writer = new WaveFileWriter(filePath, _waveIn.WaveFormat);

            var sampleChannel = new SampleChannel(_buffer, true);

            PostVolumeMeter = new MeteringSampleProvider(sampleChannel, _waveIn.WaveFormat.SampleRate / 4);
        }
        private void listViewParticipants_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (listViewParticipants.SelectedItems.Count == 1)
                {
                    if (listViewParticipants.Tag != null)
                    {
                        listViewParticipants.Items[(int)listViewParticipants.Tag].SubItems[0].BackColor = SystemColors.Window;
                        listViewParticipants.Items[(int)listViewParticipants.Tag].SubItems[0].ForeColor = Color.Gray;
                        listViewParticipants.Tag = null;
                    }

                    createWaveOutParticipant();

                    //Check that there is a file in the grid. Gives a strange error message it we let AudioFileReader throw exception
                    if (string.IsNullOrEmpty(listViewParticipants.SelectedItems[0].SubItems[4].Text))
                    {
                        throw new Exception(Properties.Resources.CAPTION_NO_FILE_FOR_PARTICIPANT);
                    }


                    audioFileReaderParticipant = new AudioFileReader(listViewParticipants.SelectedItems[0].SubItems[4].Text);
                    var sampleChannel = new SampleChannel(audioFileReaderParticipant, true);
                    this.setVolumeDelegateParticipant = (vol) => sampleChannel.Volume = vol;
                    var postVolumeMeter = new MeteringSampleProvider(sampleChannel);
                    postVolumeMeter.StreamVolume += onPostVolumeMeter;
                    fadeInOut = new FadeInOutSampleProvider(postVolumeMeter, false);

                    labelTotalTime.Text = $"{(int)audioFileReaderParticipant.TotalTime.TotalMinutes:00}:{audioFileReaderParticipant.TotalTime.Seconds:00}";

                    //waveOutDevice.Init(postVolumeMeter);
                    waveOutDeviceParticipant.Init(fadeInOut);
                    volumeSlider1.Volume = 1.0f;
                    pausePlaying         = false;

                    listViewParticipants.Tag = listViewParticipants.SelectedItems[0].Index;
                    listViewParticipants.SelectedItems[0].BackColor = Color.LightGreen;
                    listViewParticipants.SelectedItems[0].EnsureVisible();
                    listViewParticipants.SelectedItems[0].Selected = false;

                    enableButtons();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Can't load music\n" + listViewParticipants.SelectedItems[0].SubItems[4].Text + "\n\n" + ex.Message, Properties.Resources.CAPTION_ERROR_LOADING_MUSIC, MessageBoxButtons.OK);
            }
        }