public void Reset()
        {
            isPlaying = false;
            buffer.Dispose();
            sourceVoice.FlushSourceBuffers();
            buffer = null;
            sourceVoice.Dispose();
            sourceVoice = null;
            masteringVoice.Dispose();
            masteringVoice = null;

            masteringVoice = new MasteringVoice(device, waveFormat.Channels, waveFormat.SamplesPerSecond);

            sourceVoice = new SourceVoice(device, waveFormat, VoiceFlags.None);
            // sourceVoice.BufferStart += new System.EventHandler<ContextEventArgs>(sourceVoice_BufferStart);

            sourceVoice.Volume = 0.5f;
            buffer             = new AudioBuffer();
            buffer.AudioData   = new System.IO.MemoryStream();

            bytesPerSample = (waveFormat.BitsPerSample / 8) * waveFormat.Channels;

            for (int i = 0; i < BUFFER_COUNT; i++)
            {
                sampleData[i] = new short[SAMPLE_SIZE * waveFormat.Channels];
                bData[i]      = new byte[SAMPLE_SIZE * bytesPerSample];
            }
            sourceVoice.SubmitSourceBuffer(buffer);
            currentBuffer = 0;
            playBuffer    = 0;
            samplePos     = 0;
        }
            public void UpdateChange(ISoundFactory factory)
            {
                if (currentSound != emitter.Sound)
                {
                    // Changed:
                    disposeSound();
                }

                if (buffer == null && emitter.Sound != null)
                {
                    loadSound(factory);
                    currentSound = emitter.Sound;
                }

                if (emitter.Playing && !oldPlaying)
                {
                    loadSound(factory);
                    sourceVoice.SubmitSourceBuffer(buffer);
                    sourceVoice.Start();
                }
                else if (!emitter.Playing && oldPlaying)
                {
                    sourceVoice.Stop();
                    sourceVoice.FlushSourceBuffers();
                }
            }
示例#3
0
 public override void Dispose(bool disposing)
 {
     if (disposing)
     {
         if (sourceVoice != null)
         {
             sourceVoice.FlushSourceBuffers();
             sourceVoice.Stop();
             sourceVoice.Dispose();
             sourceVoice = null;
         }
         if (xAudioBuffer != null)
         {
             xAudioBuffer.Stream.Dispose();
             xAudioBuffer.Stream = null;
             xAudioBuffer        = null;
         }
         if (xAudio != null)
         {
             xAudio.StopEngine();
             xAudio.Dispose();
             xAudio = null;
         }
     }
 }
 protected override void StopNativeMusic()
 {
     isPlaying = false;
     if (source == null)
     {
         return;
     }
     source.Stop();
     source.FlushSourceBuffers();
 }
示例#5
0
 public void Dispose()
 {
     if (_voice != null && _voice.IsDisposed == false)
     {
         _voice.Stop();
         _voice.FlushSourceBuffers();
         _voice.DestroyVoice();
         _voice.Dispose();
     }
 }
 //check voice status
 private void Check()
 {
     while (Voice.State.BuffersQueued > 0)
     {
         Thread.Sleep(10);
     }
     _voice.Stop();
     _voice.FlushSourceBuffers();
     isPlaying = false;
     Stopped?.Invoke(this);
 }
 private void DisposeSource()
 {
     for (int i = 0; i < NumberOfBuffers; i++)
     {
         buffers[i] = null;
     }
     source.FlushSourceBuffers();
     source.DestroyVoice();
     source.Dispose();
     source = null;
 }
示例#8
0
        public void Flush()
        {
            m_cueId = new MyCueId(MyStringHash.NullOrEmpty);
            m_voice.Stop();
            m_voice.FlushSourceBuffers();
            DisposeWaves();

            m_isPlaying         = false;
            m_isPaused          = false;
            m_isLoopable        = false;
            m_currentDescriptor = null;
        }
示例#9
0
 public void Shutdown()
 {
     buffer.Dispose();
     sourceVoice.FlushSourceBuffers();
     buffer = null;
     sourceVoice.Dispose();
     sourceVoice = null;
     masteringVoice.Dispose();
     masteringVoice = null;
     device.StopEngine();
     device.Dispose();
 }
示例#10
0
 public void Flush()
 {
     m_cueId = new MyCueId(MyStringHash.NullOrEmpty);
     m_voice.Stop();
     m_voice.FlushSourceBuffers();
     for (int i = 0; i < m_loopBuffers.Length; i++)
     {
         m_loopBuffers[i] = null;
     }
     m_isPlaying         = false;
     m_isPaused          = false;
     m_isLoopable        = false;
     m_currentDescriptor = null;
 }
示例#11
0
文件: Program.cs 项目: shiranr/rocket
        static void SetRow(int row)
        {
            double time = row / rowRate;

            // Stop and restart voice at different location. This is a bit nasty,
            // but it seems to work.
            sourceVoice.Stop();
            sourceVoice.FlushSourceBuffers();

            // Seek the stream back to start, and change PlayBegin. Seeking directly
            // in the stream does not seem to work.
            stream.Seek(0, System.IO.SeekOrigin.Begin);
            audioBuffer.PlayBegin = (int)(time * stream.Format.SamplesPerSecond);
            if (stream.Format.FormatTag == WaveFormatTag.WMAudio2)
            {
                // Ruond off play-position to the closest 128 samples. If we don't,
                // the nice gentlemen gets upset or something. (AKA the documentation
                // says so. It doesn't seem to cause any harm in reality, though)
                audioBuffer.PlayBegin = (int)System.Math.Floor(audioBuffer.PlayBegin * 128 + 0.5) / 128;
            }

            // Ngh. Even though the documentation says that the voice counters should
            // be reset if FlushSourceBuffers is called after Stop, guess what? They
            // arent! So let's keep track of how far off it is.
            samplesBias = sourceVoice.State.SamplesPlayed - audioBuffer.PlayBegin;

            // Submit data, and restart if needed
            sourceVoice.SubmitSourceBuffer(audioBuffer, stream.DecodedPacketsInfo);
            if (playing)
            {
                sourceVoice.Start();
            }
        }
示例#12
0
        public void Clear()
        {
            //flush buffers
            SourceVoice.FlushSourceBuffers();

            while (SourceVoice.State.BuffersQueued > 0)
            {
                SourceVoice.FlushSourceBuffers();
            }

            SourceVoice.FlushSourceBuffers();

            //stop sound
            SourceVoice.Stop(XAudio2.CommitNow);

            var buffers = _audioBuffers.ToArray();

            _audioBuffers.Clear();

            //dispose buffers
            foreach (var buffer in buffers)
            {
                buffer.Value.Stream.Dispose();
            }

            //flush buffers
            SourceVoice.FlushSourceBuffers();

            while (SourceVoice.State.BuffersQueued > 0)
            {
                SourceVoice.FlushSourceBuffers();
            }
        }
示例#13
0
        public override void Play(AudioBuffer buffer)
        {
            _xa2Buffer            = (XAudio2AudioBuffer)buffer;
            _channelCount         = GetChannelCount(_xa2Buffer.Format);
            _emitter.ChannelCount = _channelCount;
            if ((_channelCount > 1 && !_stereoState) || (_channelCount == 1 && _stereoState))
            {
                float volume = _sourceVoice.Volume;
                _sourceVoice.DestroyVoice();
                _sourceVoice.Dispose();
                WaveFormat waveFormat = new WaveFormat(_xa2Buffer.Frequency, GetChannelCount(_xa2Buffer.Format));
                _sourceVoice = new SourceVoice(_engine.XAudio2, waveFormat, VoiceFlags.None, maxFrequencyRatio: 2.0f);
                _sourceVoice.SetVolume(volume);
                _emitter.ChannelAzimuths = new[] { 0.0f };
                _dspSettings             = new DspSettings(_channelCount, 2);
                UpdateSourcePosition();
                _stereoState = _channelCount == 2;
            }

            if (_sourcePositionDirty)
            {
                UpdateSourcePosition();
                _sourcePositionDirty = false;
            }

            _audioBuffer.Stream     = _xa2Buffer.DataStream;
            _audioBuffer.AudioBytes = _xa2Buffer.SizeInBytes;
            _audioBuffer.Flags      = BufferFlags.EndOfStream;
            _sourceVoice.Stop();
            _sourceVoice.FlushSourceBuffers();
            _sourceVoice.SubmitSourceBuffer(_audioBuffer, null);
            _sourceVoice.Start();
        }
示例#14
0
        void CloseDevice()
        {
            _sourceVoice?.Stop(PlayFlags.None, XAUDIO2_COMMIT_NOW);
            _sourceVoice?.FlushSourceBuffers();
            _sourceVoice?.DestroyVoice();
            _sourceVoice?.Dispose();

            _xaudio2?.StopEngine();

            _masteringVoice?.DestroyVoice();
            _masteringVoice?.Dispose();

            _xaudio2?.Dispose();

            _sourceVoice    = null;
            _masteringVoice = null;
            _xaudio2        = null;

            //if (_hidden.handle.IsAllocated)
            //{
            //    _hidden.handle.Free();
            //    _hidden.device = IntPtr.Zero;
            //}

            if (_hidden.mixbuf != null)
            {
                Marshal.FreeHGlobal((IntPtr)_hidden.mixbuf);
                _hidden.mixbuf = null;
            }

            _dev = null;
        }
示例#15
0
        private void PlatformPlay()
        {
            if (_voice != null)
            {
                // Choose the correct buffer depending on if we are looped.
                var buffer = _loop ? _effect._loopedBuffer : _effect._buffer;

                if (_voice.State.BuffersQueued > 0)
                {
                    _voice.Stop();
                    _voice.FlushSourceBuffers();
                }

                _voice.SubmitSourceBuffer(buffer, null);
                _voice.Start();
            }

            _paused = false;
        }
示例#16
0
        public void Start(bool louder = true)
        {
            if (_voice == null || _voice.IsDisposed)
            {
                return;
            }

            if (Queued)
            {
                // Gracefully restart this voice
                _voice.FlushSourceBuffers();
                _resetAfterEnd = true;
                return;
            }

            // Emphasis the important voices to rise above the chaos!
            _voice.SetVolume(_baseVolume * (louder ? 2f : 1f));
            _voice.SubmitSourceBuffer(_audioBuffer, _stream.DecodedPacketsInfo);
            _voice.Start();
        }
示例#17
0
        internal bool Play(SourceVoice pVoice)
        {
            //Clear anything from its buffers (shouldn't be anything)
            pVoice.FlushSourceBuffers();

            //Play
            pVoice.SubmitSourceBuffer(_buffer, DecodedPacketsInfo);
            pVoice.Start();

            return(true);
        }
        /// <summary>
        /// Plays the current instance. If it is already playing - the call is ignored.
        /// </summary>
        public void Play()
        {
            if (State == AudioState.Playing)
            {
                return;
            }

            if (voice.State.BuffersQueued > 0)
            {
                voice.Stop();
                voice.FlushSourceBuffers();
            }

            voice.SubmitSourceBuffer(CurrentAudioBuffer, Effect.DecodedPacketsInfo);

            voice.Start();

            this.Update();

            paused = false;
        }
示例#19
0
        public void cambioFrec(int frecuenciaNueva, int frecuenciaEnvolvente)
        {
            if (sourcevoice != null)
            {
                sourcevoice.SetVolume(0.0f);
                sourcevoice.FlushSourceBuffers();

                //sourcevoice.SetFrequencyRatio(frecuenciaNueva / 2048);
            }
            sourcevoice.SetVolume(vol);
            llenaBuffer(BufferSamples, frecuenciaNueva, frecuenciaEnvolvente);
            sourcevoice.Start();
        }
示例#20
0
        /// <summary>
        /// Plays the current instance. If it is already playing - the call is ignored.
        /// </summary>
        /// <exception cref="ObjectDisposedException">Is thrown if the current instance was already disposed.</exception>
        public void Play()
        {
            if (IsDisposed)
            {
                throw new ObjectDisposedException(this.GetType().FullName);
            }

            if (State == SoundState.Playing)
            {
                return;
            }

            if (voice.State.BuffersQueued > 0)
            {
                voice.Stop();
                voice.FlushSourceBuffers();
            }

            voice.SubmitSourceBuffer(CurrentAudioBuffer, Effect.DecodedPacketsInfo);
            voice.Start();

            paused = false;
        }
示例#21
0
        public void StopImmediate()
        {
            if (immediateVoice != null)
            {
                immediateVoice.Stop();
                immediateVoice.FlushSourceBuffers();
                immediateVoice.BufferEnd -= ImmediateVoice_BufferEnd;
                immediateVoice.DestroyVoice();
                immediateVoice.Dispose();
                immediateVoice = null;

                Utilities.FreeMemory(immediateAudioBuffer.AudioDataPointer);
                immediateAudioBuffer = null;
                immediateDonePlaying = true;
            }
        }
示例#22
0
        void PlayDevice()
        {
            AudioBuffer buffer;
            byte *      mixbuf  = _hidden.mixbuf;
            byte *      nextbuf = _hidden.nextbuf;
            int         mixlen  = _hidden.mixlen;

            if (!_enabled)// shutting down?
            {
                return;
            }

            // Submit the next filled buffer
            buffer                  = _hidden.audioBuffersRing[_hidden.nextBuffer];
            buffer.AudioBytes       = mixlen;
            buffer.AudioDataPointer = (IntPtr)nextbuf;
            //buffer.Context = _hidden.device;

            if (nextbuf == mixbuf)
            {
                nextbuf += mixlen;
            }
            else
            {
                nextbuf = mixbuf;
            }
            _hidden.nextbuf    = nextbuf;
            _hidden.nextBuffer = ++_hidden.nextBuffer % _hidden.audioBuffersRing.Length;

            try
            {
                _sourceVoice.SubmitSourceBuffer(buffer, null);
            }
            catch (SharpDXException e)
            {
                if (e.HResult == ResultCode.DeviceInvalidated.Code)
                {
                    // !!! FIXME: possibly disconnected or temporary lost. Recover?
                }

                // uhoh, panic!
                _sourceVoice.FlushSourceBuffers();
                OpenedAudioDeviceDisconnected();
            }
        }
示例#23
0
        public void StopImmediate()
        {
            Debug.Assert(PlatformUtils.IsInMainThread());

            if (immediateVoice != null)
            {
                immediateVoice.Stop();
                immediateVoice.FlushSourceBuffers();
                immediateVoice.BufferEnd -= ImmediateVoice_BufferEnd;
                immediateVoice.DestroyVoice();
                immediateVoice.Dispose();
                immediateVoice = null;

                Utilities.FreeMemory(immediateAudioBuffer.AudioDataPointer);
                immediateAudioBuffer = null;
                immediateDonePlaying = true;
            }
        }
示例#24
0
        public void Stop()
        {
            if (playingTask != null)
            {
                quitEvent.Set();
                playingTask.Wait();
                playingTask = null;
            }

            if (sourceVoice != null)
            {
                sourceVoice.Stop();
                sourceVoice.FlushSourceBuffers();
                sourceVoice.DestroyVoice();
                sourceVoice.BufferEnd -= SourceVoice_BufferEnd;
                sourceVoice.Dispose();
                sourceVoice = null;
            }
        }
示例#25
0
 /// <summary>
 /// Plays the audio.
 /// </summary>
 /// <param name="stop">If true, will stop the sound and return its position to 0 before playing it. Passing false will have the effect of resuming the sound from the last position it was stopped at.</param>
 /// <param name="loop">Whether or not to loop the sound.</param>
 public void play(bool stop, bool loop)
 {
     this.looping           = loop;
     isInitializingPlayback = true;
     if (loop)
     {
         buffer.LoopCount = AudioBuffer.LoopInfinite;
     }
     // We'll start the buffer from the beginning if we've never played this buffer before so that the sound can be loaded.
     // Otherwise, the sound might start from a random position in the buffer.
     if (stop || hasNeverPlayed)
     {
         hasNeverPlayed = false;
         voice.Stop();
         voice.FlushSourceBuffers();
         buffer.Stream.Position = 0;
         voice.SubmitSourceBuffer(buffer, null);
     }
     voice.Start();
     isStopped = false;
     isInitializingPlayback = false;
 }
示例#26
0
        public override void Dispose()
        {
            if (InvokeRequired)
            {
                Invoke(new DisposeDelegate(Dispose));
                return;
            }

            while (mReadingData)
            {
                Thread.Sleep(1);
            }

            mIsDisposed = true;

            mVoice.FlushSourceBuffers();
            Thread.Sleep(1);
            mVoice.Stop();

            //w.BaseStream.Dispose();

            try
            {
                mVoice.Dispose();
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.Print("Caught exception {0}.\n{1}", e.GetType(), e.Message);
            }

            foreach (var b in buffer)
            {
                b.buffer.Dispose();
            }


            System.Diagnostics.Debug.Print("Disposed streaming buffer {0}.", thisBufferIndex);
        }
        /// <summary>
        /// Dispose resources
        /// </summary>
        /// <param name="disposing">Free managed resources</param>
        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (voice != null)
                {
                    voice.BufferStart -= SourceVoice_BufferStart;
                    voice.BufferEnd   -= SourceVoice_BufferEnd;
                    voice.LoopEnd     -= SourceVoice_LoopEnd;
                }

                voice?.Stop(0);
                voice?.FlushSourceBuffers();
                if (isReverbSubmixEnabled)
                {
                    voice?.SetOutputVoices(null);
                    isReverbSubmixEnabled = false;
                }
                voice?.DestroyVoice();
                voice?.Dispose();
                voice = null;
            }
        }
 private void ClearBuffersImpl()
 {
     SourceVoice.FlushSourceBuffers();
 }
示例#29
0
 public override void Flush()
 {
     _voice.FlushSourceBuffers();
 }
示例#30
0
 public void Stop()
 {
     sourceVoice.Stop(PlayFlags.None, 0);
     sourceVoice.FlushSourceBuffers();
     isStarted = false;
 }