示例#1
0
        private void PlaySound()
        {
            StartRecordingButton.IsEnabled = false;
            if (outputDevice == null)
            {
                StereoToMonoSampleProvider toMonoSampleProvider;
                outputDevice = new WaveOutEvent();
                try
                {
                    toMonoSampleProvider = new StereoToMonoSampleProvider(audioFileReader);
                    volumeProvider       = new VolumeSampleProvider(toMonoSampleProvider);
                }
                catch (ArgumentException)
                {
                    volumeProvider = new VolumeSampleProvider(audioFileReader);
                }

                panningProvider       = new PanningSampleProvider(volumeProvider);
                panningProvider.Pan   = (float)(PanningSlider.Value / 100.0f);
                volumeProvider.Volume = (float)(VolumeSlider.Value / 100.0f);
                //TestLabel.Content = panningProvider.Pan;

                outputDevice.Init(panningProvider);
            }
            if (outputDevice != null)
            {
                outputDevice.Play();
            }
        }
示例#2
0
        private ISampleProvider CreateSampleChain(WaveStream sourceStream)
        {
            //loop is implemented as a wave stream
            _loopingProvider = new LoopingWaveStream(sourceStream);
            _loopingProvider.EnableLooping = _loop;

            var outputSample = _loopingProvider.ToSampleProvider();

            //fade-in/fade-out
            _fadingProvider = new FadeInOutStopSampleProvider(outputSample);
            outputSample    = _fadingProvider;

            //panning (will convert to mono)
            if (PanningEnabled)
            {
                var monoProvider = new StereoToMonoSampleProvider(outputSample);

                _panningProvider = new PanningSampleProvider(monoProvider);

                _panningProvider.PanStrategy = new StereoBalanceStrategy();
                _panningProvider.Pan         = Pan;

                outputSample = _panningProvider;
            }

            //volume
            _volumeProvider        = new VolumeSampleProvider(outputSample);
            _volumeProvider.Volume = _volume;

            outputSample = _volumeProvider;

            return(outputSample);
        }
示例#3
0
 private void closeAudioFilerReader()
 {
     if (audioFileReader != null)
     {
         audioFileReader.Dispose();
         audioFileReader = null;
         panningProvider = null;
         volumeProvider  = null;
     }
 }
示例#4
0
        public void Stop()
        {
            IsPlaying = false;

            audioFile.Position = 0;
            outputDevice?.Stop();

            currentEntity = null;
            panner        = null;
        }
示例#5
0
        public MixerChannel(IEventAggregator events)
        {
            _events = events ?? throw new ArgumentNullException(nameof(events));

            _buffer  = new BufferedWaveProvider(WaveFormat.CreateIeeeFloatWaveFormat(WaveFormat.SampleRate, 1));
            _volume  = new VolumeSampleProvider(_buffer.ToSampleProvider());
            _balance = new PanningSampleProvider(_volume)
            {
                Pan = 0f
            };

            _events.Subscribe(this);
        }
示例#6
0
        public void Play(Entity entity)
        {
            Stop();

            IsPlaying = true;

            currentEntity                 = entity;
            audioFile.Position            = 0;
            audioFile.Volume              = Utils.CalculateVolume(entity);
            panner                        = new PanningSampleProvider(audioFile);
            panner.Pan                    = Utils.CalculateStereo(entity);
            outputDevice                  = new WaveOutEvent();
            outputDevice.PlaybackStopped += OutputDevice_PlaybackStopped;
            outputDevice.Init(panner);
            outputDevice.Play();
        }
示例#7
0
        public void Dispose()
        {
            if (waveStream == null)
            {
                return;
            }

            waveOut.PlaybackStopped -= onPlaybackComplete;
            waveOut.Stop();
            waveOut.Dispose();
            waveStream.Dispose();
            byteStream.Dispose();
            waveOut         = null;
            panningProvider = null;
            volumeProvider  = null;
            waveStream      = null;
            byteStream      = null;
        }
示例#8
0
        /* Applies volume and pan parameters to outgoing samples*/
        private ISampleProvider ProcessInput(ISampleProvider input, int bankIndex, int padIndex)
        {
            VolumeSampleProvider VSP = new VolumeSampleProvider(input);

            VSP.Volume = samplerModel.song.banks[bankIndex].pads[padIndex].volume;
            PanningSampleProvider PSP = new PanningSampleProvider(VSP.ToWaveProvider16().ToSampleProvider());                                                  // <- this throws ArgumentException

            PSP.Pan = samplerModel.song.banks[bankIndex].pads[padIndex].pan;

            //ISampleProvider result = PSP.Skip(new TimeSpan(0, 0, (int) samplerModel.song.banks[bankIndex].pads[padIndex].startPoint));
            ISampleProvider result = PSP.Skip(samplerModel.song.banks[bankIndex].pads[padIndex].startPoint);
            //int duration = (int)(samplerModel.song.banks[bankIndex].pads[padIndex].endPoint - samplerModel.song.banks[bankIndex].pads[padIndex].startPoint);
            TimeSpan duration = (samplerModel.song.banks[bankIndex].pads[padIndex].endPoint - samplerModel.song.banks[bankIndex].pads[padIndex].startPoint);

            //result = result.Take(new TimeSpan(0,0,duration));
            result = result.Take(duration);

            return(result.ToWaveProvider16().ToSampleProvider());
        }
示例#9
0
        public void wasapiPlay()
        {
            ISampleProvider                sampleProvider1;
            VolumeSampleProvider           volumeSampleProv1;
            SmbPitchShiftingSampleProvider smbPitchSampleProv1;
            OffsetSampleProvider           offsetSampleProv1;
            PanningSampleProvider          panSampleProv1;

            void funcForBuff(object sender, WaveInEventArgs waveInEventArgs)
            {
                buffWaveProv.AddSamples(waveInEventArgs.Buffer, 0, waveInEventArgs.BytesRecorded);
            }

            var enumerator = new NAudio.CoreAudioApi.MMDeviceEnumerator();

            wInput  = enumerator.GetDevice(strInputDeviceID);
            wOutput = enumerator.GetDevice(strOutputDeviceID);

            wOut     = new WasapiOut(wOutput, AudioClientShareMode.Shared, true, 10);
            wCapture = new WasapiCapture(wInput, true, 10);

            buffWaveProv = new BufferedWaveProvider(wCapture.WaveFormat);

            wCapture.DataAvailable += funcForBuff;

            sampleProvider1                 = buffWaveProv.ToSampleProvider();
            smbPitchSampleProv1             = new SmbPitchShiftingSampleProvider(sampleProvider1);
            smbPitchSampleProv1.PitchFactor = fPitch;

            offsetSampleProv1         = new OffsetSampleProvider(smbPitchSampleProv1);
            offsetSampleProv1.DelayBy = new TimeSpan(0, 0, 0, 0, iLatency);

            panSampleProv1     = new PanningSampleProvider(offsetSampleProv1.ToMono(1f, 1f));
            panSampleProv1.Pan = fPanning;

            volumeSampleProv1        = new VolumeSampleProvider(panSampleProv1);
            volumeSampleProv1.Volume = fVolume;

            wOut.Init(volumeSampleProv1);
            wCapture.StartRecording();
            wOut.Play();
        }
示例#10
0
        // constructor
        internal Audio(AudioType type, AudioFormat format, byte[] data, int device) : base(type, format, data, device)
        {
            playing.Value = false;

            waveOut.DeviceNumber     = device;
            waveOut.PlaybackStopped += OnPlaybackComplete;

            byteStream = new MemoryStream(data);
            if (Format == AudioFormat.AIFF)
            {
                waveStream = new AiffFileReader(byteStream);
            }
            else if (Format == AudioFormat.WAV)
            {
                waveStream = new WaveFileReader(byteStream);
            }
            else if (Format == AudioFormat.MP3)
            {
                waveStream = new Mp3FileReader(byteStream);
            }
            else if (Format == AudioFormat.Vorbis)
            {
                waveStream = new VorbisWaveReader(byteStream);
            }
            volumeProvider = new VolumeSampleProvider(waveStream.ToSampleProvider())
            {
                Volume = (float)Volume
            };

            if (waveStream.WaveFormat.Channels == 1)
            {
                panningProvider = new PanningSampleProvider(volumeProvider)
                {
                    Pan = (float)Pan
                };
                waveOut.Init(panningProvider);
            }
            else
            {
                waveOut.Init(volumeProvider);
            }
        }
示例#11
0
        public ISampleProvider ApplyPanVolume(ISampleProvider input, Slot slot)
        {
            //get the specified pan for this slot
            float pan    = panValues[slot];
            float volume = volumeValues[slot];

            MixingSampleProvider result = new MixingSampleProvider(WaveFormat.CreateIeeeFloatWaveFormat(sampleRate, channels));

            result.AddMixerInput(input);

            VolumeSampleProvider vsp = new VolumeSampleProvider(result);

            vsp.Volume = volume;

            PanningSampleProvider psp = new PanningSampleProvider(vsp);

            psp.Pan = pan;

            return(result);
        }
示例#12
0
        public void Start()
        {
            this._waveOut?.Dispose();

            // Stop → Init だと WASAPI がエラー出すので作り直す
            this._waveOut = new WasapiOut(AudioClientShareMode.Shared, true, 50);
            this._waveOut.PlaybackStopped += this.WaveOutPlaybackStopped;

            // ISampleProvider をつくる
            // SmbPitchShiftingSampleProvider は内部でバッファーを持っているので、使いまわせない
            this._pitchShiftProvider = new SmbPitchShiftingSampleProvider(this._monoSampleProvider, 1024, 2, 1f);
            //this._pitchShiftProvider = new StftPitchShiftingSampleProvider(this._monoSampleProvider);
            var provider = new PanningSampleProvider(this._pitchShiftProvider)
            {
                Pan = this._pan
            };

            this._waveOut.Init(provider);
            this._waveOut.Play();
        }
示例#13
0
        public void Initialize(int audioDevice)
        {
            Dispose();

            waveOut = new WaveOutEvent();
            waveOut.DeviceNumber     = audioDevice;
            waveOut.PlaybackStopped += onPlaybackComplete;

            byteStream = new MemoryStream(_data);
            if (_format == AudioFormat.Aiff)
            {
                waveStream = new AiffFileReader(byteStream);
            }
            else if (_format == AudioFormat.Wav)
            {
                waveStream = new WaveFileReader(byteStream);
            }
            else if (_format == AudioFormat.Mp3)
            {
                waveStream = new Mp3FileReader(byteStream);
            }
            else if (_format == AudioFormat.Vorbis)
            {
                waveStream = new VorbisWaveReader(byteStream);
            }

            volumeProvider        = new VolumeSampleProvider(waveStream.ToSampleProvider());
            volumeProvider.Volume = (float)_volume;
            if (waveStream.WaveFormat.Channels == 1)
            {
                panningProvider     = new PanningSampleProvider(volumeProvider);
                panningProvider.Pan = (float)_pan;
                waveOut.Init(panningProvider);
            }
            else
            {
                waveOut.Init(volumeProvider);
            }
        }
示例#14
0
        private Mixer()
        {
            try
            {
                mixer.ReadFully        = true;
                mixer.MixerInputEnded += OnInputEnded;
                VSP        = new VolumeSampleProvider(mixer);
                VSP.Volume = baseVolume;
                PSP        = new PanningSampleProvider(VSP);
                PSP.Pan    = basePan;
                // waveOut = new WaveOutEvent();
                // waveOut = new DirectSoundOut(40);

                waveOut = new NAudio.Wave.AsioOut("ASIO4ALL v2");
                //waveOut = new AsioOut();
                waveOut.Init(PSP);
                waveOut.Play();
            }
            catch (Exception e)
            {
                throw e;
            }
        }
示例#15
0
        public void LocateNewSE(bool isRight)
        {
            Random random;

            if (isRight)
            {
                random = rightRandom;
            }
            else
            {
                random = leftRandom;
            }
            CachedSound target;

            while (true)
            {
                target = seList[random.Next(seList.Count)];
                if (!lastCache.Contains(target.Name))
                {
                    break;
                }
            }
            if (lastCache[0] == null)
            {
                lastCache[0] = target.Name;
            }
            else
            {
                if (lastCache[1] == null)
                {
                    lastCache[1] = target.Name;
                }
                else
                {
                    lastCache[0] = lastCache[1];
                    lastCache[1] = target.Name;
                }
            }
            if (isRight)
            {
                Debug.WriteLine($"{target} is Fired on Right");
            }
            else
            {
                Debug.WriteLine($"{target} is Fired on Left");
            }
            var volumeProvider = new VolumeSampleProvider(target.ToSampleProvider());

            volumeProvider.Volume = (float)selectedPreset.SEVolume;
            var panProvider = new PanningSampleProvider(volumeProvider);

            if (isRight)
            {
                panProvider.Pan = 1;
                mixer.AddMixerInput(new RightSESampleProvider(panProvider));
            }
            else
            {
                panProvider.Pan = -1;
                mixer.AddMixerInput(new LeftSESampleProvider(panProvider));
            }
        }
示例#16
0
        public static void PlaySample(Level level, WadSample sample, int channel, float volume = 1.0f, float pitch = 1.0f, float pan = 0.0f, int loopCount = 1)
        {
            if (volume <= 0.0f || loopCount <= 0)
            {
                return;
            }

            var disposables = new List <IDisposable>();

            try
            {
                // Load data.
                // If waveform data is loaded into memory, use it to play sound, otherwise find wav file on disk.

                WaveFileReader waveStream;
                MemoryStream   memoryStream;

                if (sample.IsLoaded)
                {
                    memoryStream = disposables.AddAndReturn(new MemoryStream(sample.Data, false));
                    waveStream   = disposables.AddAndReturn(new WaveFileReader(memoryStream));
                }
                else
                {
                    var path = WadSounds.TryGetSamplePath(level.Settings, sample.FileName);
                    if (path == null)
                    {
                        return;
                    }
                    else
                    {
                        waveStream = disposables.AddAndReturn(new WaveFileReader(path));
                    }
                }

                // Apply looping
                ISampleProvider sampleStream;
                if (loopCount <= 1)
                {
                    sampleStream = waveStream.ToSampleProvider();
                }
                else
                {
                    sampleStream = new RepeatedStream(waveStream)
                    {
                        LoopCount = loopCount
                    }
                };

                // Always play sample as 22 khz
                if (sampleStream.WaveFormat.SampleRate != 22050)
                {
                    sampleStream = new PitchedStream {
                        Source = sampleStream, Pitch = 22050.0f / sampleStream.WaveFormat.SampleRate
                    }
                }
                ;

                // Apply panning
                if (pan != 1.0f)
                {
                    sampleStream = new PanningSampleProvider(sampleStream)
                    {
                        Pan = pan
                    }
                }
                ;

                // Apply pitch
                if (pitch != 1.0f)
                {
                    sampleStream = new PitchedStream {
                        Source = sampleStream, Pitch = pitch
                    }
                }
                ;

                // Apply volume
                if (volume != 1.0f)
                {
                    sampleStream = new VolumeSampleProvider(sampleStream)
                    {
                        Volume = volume
                    }
                }
                ;

                // Add some silence to make sure the audio plays out.
                const int latencyInMilliseconds = 200;
                int       latencyInSamples      = (sampleStream.WaveFormat.SampleRate * latencyInMilliseconds * 2) / 1000;
                sampleStream = new OffsetSampleProvider(sampleStream)
                {
                    LeadOutSamples = sampleStream.WaveFormat.Channels * latencyInSamples
                };

                // Play
                _channels[channel] = disposables.AddAndReturn(new WaveOut());
                _channels[channel].Init(sampleStream);
                _channels[channel].PlaybackStopped += (s, e) =>
                {
                    foreach (IDisposable disposable in disposables)
                    {
                        disposable?.Dispose();
                    }
                    _channels[channel] = null;
                    _indices[channel]  = -1;
                };
                _channels[channel].Play();
            }
            catch (Exception ex)
            {
                // Clean up in case of a problem
                foreach (IDisposable disposable in disposables)
                {
                    disposable?.Dispose();
                }

                _logger.Error("Error while playing sample " + sample + ", exception: " + ex);
            }
        }
示例#17
0
 public TrackSampleProvider()
 {
     mix    = new MixingSampleProvider(WaveFormat.CreateIeeeFloatWaveFormat(44100, 2));
     pan    = new PanningSampleProvider(mix.ToMono());
     volume = new VolumeSampleProvider(pan);
 }