/// <summary> /// Plays the given sound. /// </summary> /// <param name="soundFile">The sound file to be played.</param> /// <param name="volume">The volume of the sound to be played.</param> public async Task PlaySoundAsync(CachedSoundFile soundFile, float volume = 1f) { soundFile.EnsureNotNullOrDisposed(nameof(soundFile)); volume.EnsurePositive(nameof(volume)); if (!m_xaudioDevice.IsLoaded) { return; } // Play the sound on the device using (var sourceVoice = new XA.SourceVoice(m_xaudioDevice.Device, soundFile.Format, true)) { // Register the created voice m_playingVoices.Add(sourceVoice); // Start voice playing TaskCompletionSource<object> complSource = new TaskCompletionSource<object>(); sourceVoice.SubmitSourceBuffer(soundFile.AudioBuffer, soundFile.DecodedPacketsInfo); sourceVoice.SetVolume(volume); sourceVoice.BufferEnd += (pointer) => { complSource.TrySetResult(null); }; sourceVoice.Start(); // Await finished playing await complSource.Task; // Destroy the voice object // A NullReference is raised later, if we forget this call sourceVoice.DestroyVoice(); // Remove the created voice finally m_playingVoices.Remove(sourceVoice); } }
public void startSound(int loop = -1) { buffer.LoopCount = loop; sourceVoice = new SourceVoice(device, stream.Format, true); sourceVoice.SubmitSourceBuffer(buffer, stream.DecodedPacketsInfo); sourceVoice.Start(); }
/// <summary> /// Initializes a new instance of the <see cref="AudioPlayer" /> class. /// </summary> /// <param name="xaudio2">The xaudio2 engine.</param> /// <param name="audioStream">The input audio stream.</param> public AudioPlayer(XAudio2 xaudio2, Stream audioStream) { this.xaudio2 = xaudio2; audioDecoder = new AudioDecoder(audioStream); //sourceVoice = new SourceVoice(xaudio2, audioDecoder.WaveFormat); sourceVoice = new SourceVoice(xaudio2, audioDecoder.WaveFormat,0,1.0f); localVolume = 1.0f; sourceVoice.BufferEnd += sourceVoice_BufferEnd; sourceVoice.Start(); bufferEndEvent = new AutoResetEvent(false); playEvent = new ManualResetEvent(false); waitForPlayToOutput = new ManualResetEvent(false); clock = new Stopwatch(); // Pre-allocate buffers audioBuffersRing = new AudioBuffer[3]; memBuffers = new DataPointer[audioBuffersRing.Length]; for (int i = 0; i < audioBuffersRing.Length; i++) { audioBuffersRing[i] = new AudioBuffer(); memBuffers[i].Size = 32 * 1024; // default size 32Kb memBuffers[i].Pointer = Utilities.AllocateMemory(memBuffers[i].Size); } // Initialize to stopped State = AudioPlayerState.Stopped; // Starts the playing thread playingTask = Task.Factory.StartNew(PlayAsync, TaskCreationOptions.LongRunning); }
public void Play() { _sourceVoice = new SourceVoice(_xaudio, _waveFormat, true); _sourceVoice.SubmitSourceBuffer(_buffer, _soundstream.DecodedPacketsInfo); _sourceVoice.Start(); IsPlaying = true; }
public void RestartSong() { voice.Stop(); voice = new SourceVoice(xAudio, firstWave.Buffer.WaveFormat, true); voice.SourceSampleRate = defaultSampleRate; voice.SubmitSourceBuffer(firstWave.Buffer, firstWave.Buffer.DecodedPacketsInfo); voice.Start(); }
public void ChangeSpeed(double modifier) { AudioBufferAndMetaData newBuffer = firstWave.Buffer; voice.Stop(); newBuffer.Stream.Read(firstWave.Buffer.Stream.PositionPointer, 100000, 3); voice = new SourceVoice(xAudio, newBuffer.WaveFormat, true); voice.SourceSampleRate = (int)(defaultSampleRate * modifier); voice.SubmitSourceBuffer(newBuffer, newBuffer.DecodedPacketsInfo); voice.Start(); }
public static void PlaySound(Stream soundStream, float volume = 1) { SourceVoice sourceVoice; var buffer = GetBuffer(soundStream); sourceVoice = new SourceVoice(XAudio, buffer.WaveFormat, true); sourceVoice.SetVolume(volume, SharpDX.XAudio2.XAudio2.CommitNow); sourceVoice.SubmitSourceBuffer(buffer, buffer.DecodedPacketsInfo); sourceVoice.BufferEnd += SourceVoiceOnBufferEnd; sourceVoice.Start(); }
public void PlayWave(string key) { var wave = waves.FirstOrDefault(x => x.Key == key); firstWave = wave; if (wave != null) { voice = new SourceVoice(xAudio, wave.Buffer.WaveFormat, true); voice.SourceSampleRate = defaultSampleRate; voice.SubmitSourceBuffer(wave.Buffer, wave.Buffer.DecodedPacketsInfo); voice.Start(); } }
/// <summary> /// Function to play an mp3. /// </summary> /// <param name="path">The path to the mp3 file.</param> public async Task PlayMp3Async(string path) { if (_currentPlayback != null) { await _currentPlayback; return; } _tokenSource = new CancellationTokenSource(); _currentPlayback = Task.Run(() => { var stream = new Mm.SoundStream(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.None)); Mm.WaveFormat format = stream.Format; var buffer = new Xa.AudioBuffer { Stream = stream.ToDataStream(), AudioBytes = (int)stream.Length, Flags = Xa.BufferFlags.EndOfStream }; stream.Close(); var source = new Xa.SourceVoice(_audio, format); source.SubmitSourceBuffer(buffer, stream.DecodedPacketsInfo); source.Start(); try { while ((!_tokenSource.Token.IsCancellationRequested) && (!source.IsDisposed) && (source.State.BuffersQueued > 0)) { Thread.Sleep(10); } source.Stop(); } finally { buffer.Stream?.Dispose(); source.Dispose(); stream?.Dispose(); } }, _tokenSource.Token); await _currentPlayback; _currentPlayback = null; }
public static void PlaySound(string soundfile, float volume = 1) { SourceVoice sourceVoice; if (!LoadedSounds.ContainsKey(soundfile)) { var buffer = GetBuffer(soundfile); sourceVoice = new SourceVoice(XAudio, buffer.WaveFormat, true); sourceVoice.SetVolume(volume, SharpDX.XAudio2.XAudio2.CommitNow); sourceVoice.SubmitSourceBuffer(buffer, buffer.DecodedPacketsInfo); sourceVoice.Start(); } else { sourceVoice = LoadedSounds[soundfile]; if (sourceVoice != null) sourceVoice.Stop(); } }
/// <summary> /// SharpDX XAudio2 sample. Plays a generated sound with some reverb. /// </summary> static void Main(string[] args) { var xaudio2 = new XAudio2(); var masteringVoice = new MasteringVoice(xaudio2); var waveFormat = new WaveFormat(44100, 32, 2); var sourceVoice = new SourceVoice(xaudio2, waveFormat); int bufferSize = waveFormat.ConvertLatencyToByteSize(60000); var dataStream = new DataStream(bufferSize, true, true); int numberOfSamples = bufferSize/waveFormat.BlockAlign; for (int i = 0; i < numberOfSamples; i++) { double vibrato = Math.Cos(2 * Math.PI * 10.0 * i / waveFormat.SampleRate); float value = (float) (Math.Cos(2*Math.PI*(220.0 + 4.0*vibrato)*i/waveFormat.SampleRate)*0.5); dataStream.Write(value); dataStream.Write(value); } dataStream.Position = 0; var audioBuffer = new AudioBuffer {Stream = dataStream, Flags = BufferFlags.EndOfStream, AudioBytes = bufferSize}; var reverb = new Reverb(); var effectDescriptor = new EffectDescriptor(reverb); sourceVoice.SetEffectChain(effectDescriptor); sourceVoice.EnableEffect(0); sourceVoice.SubmitSourceBuffer(audioBuffer, null); sourceVoice.Start(); Console.WriteLine("Play sound"); for(int i = 0; i < 60; i++) { Console.Write("."); Console.Out.Flush(); Thread.Sleep(1000); } }
/// <summary> /// Play a sound file. Supported format are Wav(pcm+adpcm) and XWMA /// </summary> /// <param name="device">The device.</param> /// <param name="text">Text to display</param> /// <param name="fileName">Name of the file.</param> static void PLaySoundFile(XAudio2 device, string text, string fileName) { Console.WriteLine("{0} => {1} (Press esc to skip)", text, fileName); var stream = new SoundStream(File.OpenRead(fileName)); var waveFormat = stream.Format; var buffer = new AudioBuffer { Stream = stream.ToDataStream(), AudioBytes = (int) stream.Length, Flags = BufferFlags.EndOfStream }; stream.Close(); var sourceVoice = new SourceVoice(device, waveFormat, true); // Adds a sample callback to check that they are working on source voices sourceVoice.BufferEnd += (context) => Console.WriteLine(" => event received: end of buffer"); sourceVoice.SubmitSourceBuffer(buffer, stream.DecodedPacketsInfo); sourceVoice.Start(); int count = 0; while (sourceVoice.State.BuffersQueued > 0 && !IsKeyPressed(ConsoleKey.Escape)) { if (count == 50) { Console.Write("."); Console.Out.Flush(); count = 0; } Thread.Sleep(10); count++; } Console.WriteLine(); sourceVoice.DestroyVoice(); sourceVoice.Dispose(); buffer.Stream.Dispose(); }
public static void PlayNote(string AssetPath) { if (AssetPath.Equals("Oud Maquam")) { AssetPath = AssetPath.Replace(" ", "").Replace("M", "m"); } try { XAudio2 xAudio = new XAudio2(); var masteringVoice = new MasteringVoice(xAudio); var nativeFileStream = new NativeFileStream(AssetPath, NativeFileMode.Open, NativeFileAccess.Read, NativeFileShare.Read); SoundStream stream = new SoundStream(nativeFileStream); var waveFormat = stream.Format; AudioBuffer buffer = new AudioBuffer { Stream = stream.ToDataStream(), AudioBytes = (int)stream.Length, Flags = BufferFlags.EndOfStream }; var sourceVoice = new SourceVoice(xAudio, waveFormat, true); sourceVoice.SubmitSourceBuffer(buffer, stream.DecodedPacketsInfo); sourceVoice.Start(); /* SourceVoice sound; notes.TryGetValue(AssetPath, out sound); sound.Stop(); * sound.Start();*/ } catch (Exception) { } }
/// <summary> /// SharpDX X3DAudio sample. Plays a generated sound rotating around the listener. /// </summary> static void Main(string[] args) { var xaudio2 = new XAudio2(); using (var masteringVoice = new MasteringVoice(xaudio2)) { // Instantiate X3DAudio var x3dAudio = new X3DAudio(Speakers.Stereo); var emitter = new Emitter { ChannelCount = 1, CurveDistanceScaler = float.MinValue, OrientFront = new Vector3(0, 0, 1), OrientTop = new Vector3(0, 1, 0), Position = new Vector3(0, 0, 0), Velocity = new Vector3(0, 0, 0) }; var listener = new Listener { OrientFront = new Vector3(0, 0, 1), OrientTop = new Vector3(0, 1, 0), Position = new Vector3(0, 0, 0), Velocity = new Vector3(0, 0, 0) }; var waveFormat = new WaveFormat(44100, 32, 1); var sourceVoice = new SourceVoice(xaudio2, waveFormat); int bufferSize = waveFormat.ConvertLatencyToByteSize(60000); var dataStream = new DataStream(bufferSize, true, true); int numberOfSamples = bufferSize/waveFormat.BlockAlign; for (int i = 0; i < numberOfSamples; i++) { float value = (float) (Math.Cos(2*Math.PI*220.0*i/waveFormat.SampleRate)*0.5); dataStream.Write(value); } dataStream.Position = 0; var audioBuffer = new AudioBuffer {Stream = dataStream, Flags = BufferFlags.EndOfStream, AudioBytes = bufferSize}; //var reverb = new Reverb(); //var effectDescriptor = new EffectDescriptor(reverb); //sourceVoice.SetEffectChain(effectDescriptor); //sourceVoice.EnableEffect(0); sourceVoice.SubmitSourceBuffer(audioBuffer, null); sourceVoice.Start(); Console.WriteLine("Play a sound rotating around the listener"); for (int i = 0; i < 1200; i++) { // Rotates the emitter var rotateEmitter = Matrix.RotationY(i/5.0f); var newPosition = Vector3.Transform(new Vector3(0, 0, 1000), rotateEmitter); var newPositionVector3 = new Vector3(newPosition.X, newPosition.Y, newPosition.Z); emitter.Velocity = (newPositionVector3 - emitter.Position)/0.05f; emitter.Position = newPositionVector3; // Calculate X3DAudio settings var dspSettings = x3dAudio.Calculate(listener, emitter, CalculateFlags.Matrix | CalculateFlags.Doppler, 1, 2); // Modify XAudio2 source voice settings sourceVoice.SetOutputMatrix(1, 2, dspSettings.MatrixCoefficients); sourceVoice.SetFrequencyRatio(dspSettings.DopplerFactor); // Wait for 50ms Thread.Sleep(50); } } }
private void btnXAudio2_Click(object sender, RoutedEventArgs e) { XAudio2 xaudio; MasteringVoice masteringVoice; xaudio = new XAudio2(); masteringVoice = new MasteringVoice(xaudio); var nativefilestream = new NativeFileStream( @"Assets\Clk_1Sec1.wav", NativeFileMode.Open, NativeFileAccess.Read, NativeFileShare.Read); var soundstream = new SoundStream(nativefilestream); var waveFormat = soundstream.Format; var buffer = new AudioBuffer { Stream = soundstream.ToDataStream(), AudioBytes = (int)soundstream.Length, Flags = BufferFlags.EndOfStream, }; var sourceVoice = new SourceVoice(xaudio, waveFormat, true); // There is also support for shifting the frequency. sourceVoice.SetFrequencyRatio(1.0f); sourceVoice.SubmitSourceBuffer(buffer, soundstream.DecodedPacketsInfo); sourceVoice.Start(); }
static void Playsound(XAudio2 device, string path, int volume/*, bool ambiance*/) { var stream = new SoundStream(File.OpenRead(path)); bool boolwhile = true; var waveformat = stream.Format; var buffer = new AudioBuffer { Stream = stream.ToDataStream(), AudioBytes = (int)stream.Length, Flags = BufferFlags.EndOfStream }; stream.Close(); var sourcevoice = new SourceVoice(device, waveformat, true); sourcevoice.SubmitSourceBuffer(buffer, stream.DecodedPacketsInfo); sourcevoice.SetVolume(volume); sourcevoice.Start(); int count = 0; while (sourcevoice.State.BuffersQueued > 0 && boolwhile) { if (/*ambiance || soundContinue*/42 == 42) { if (count == 50) { //Console.Out.Flush(); count = 0; } //Thread.Sleep(10); count++; } else { boolwhile = false; } } sourcevoice.DestroyVoice(); sourcevoice.Dispose(); buffer.Stream.Dispose(); }
/// <summary> /// Play the sound. /// </summary> public override void Play() { SourceVoice sourceVoice; sourceVoice = new SourceVoice(m_xaudio, m_waveFormat, true); sourceVoice.SubmitSourceBuffer(m_buffer, m_soundStream.DecodedPacketsInfo); sourceVoice.Start(); }
public void SetSourceVoice(SourceVoice sourceVoice) { this.sourceVoice = sourceVoice; sourceVoice.Start(); }
public void SetSampleProvider(IAudioSampleProvider audioSampleProvider) { var format = ToWaveFormat(audioSampleProvider.AudioFormat); _voice = new SourceVoice(_xAudio, format, true); _audioSampleProvider = audioSampleProvider; for (var i = 0; i < NumBuffers; i++) { FillBuffer(i); } _audioThread = Task.Factory.StartNew(OnAudioThread, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default); _voice.Start(); }
public SourceVoice Play(EffectSound sound) { var waveFormat = sound.Stream.Format; List<SourceVoice> voices; lock (instances) { if (!instances.TryGetValue(waveFormat, out voices)) { voices = new List<SourceVoice>(); instances.Add(waveFormat, voices); } // Clean non-playing source var voiceToDelete = new List<SourceVoice>(); foreach (var voice in voices) { if (voice.State.BuffersQueued == 0) voiceToDelete.Add(voice); } voiceToDelete.ForEach(x => { voices.Remove(x); x.Stop(); x.DestroyVoice(); x.Dispose(); }); if (voices.Count >= this.maxInstances) // Too many instances return null; var newVoice = new SourceVoice(this.xaudio2, waveFormat, true); newVoice.BufferEnd += newVoice_BufferEnd; voices.Add(newVoice); newVoice.SubmitSourceBuffer(sound.Buffer, sound.Stream.DecodedPacketsInfo); newVoice.Start(); return newVoice; } }
protected override void EndBufferChange() { if (AudioBuffer != null) { if (xAudioBuffer == null) xAudioBuffer = new XAudioBuffer(); audioBufferHandle = GCHandle.Alloc(AudioBuffer.RawBuffer, GCHandleType.Pinned); xAudioBuffer.Stream = new DataStream(audioBufferHandle.AddrOfPinnedObject(), AudioBuffer.SizeInBytes, true, true); xAudioBuffer.AudioBytes = (int)xAudioBuffer.Stream.Length; xAudioBuffer.LoopLength = AudioBuffer.RawBuffer.Length / 2; xAudioBuffer.LoopCount = XAudio2.MaximumLoopCount; sourceVoice = new SourceVoice(xAudio, waveFormat); sourceVoice.SubmitSourceBuffer(xAudioBuffer, null); sourceVoice.Start(); } }
static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //Application.Run(new UIForm()); UIHandler.Init(); GraphicsManager.Init(); ThemeManager.LoadDefault(); InteropManager.Init(); /*UIForm f1 = new UIForm(1); UIForm f2 = new UIForm(2); Button b = new Button(); b.SetBounds(48, 48, 48, 48); b.Click += (Object s, EventArgs e) => { new UIForm(32).Show(); }; f1.Controls.Add(b); f2.Show();*/ new WindowMain().Open(); UIManager.SpawnUIUpdateThread(); //Application.Run(f1); Application.Run(); bool yes = true; if (yes) return; // XAudio2 audio = new XAudio2(); WaveFormat format = new WaveFormat(44100, 32, 2); MasteringVoice mvoice = new MasteringVoice(audio); SourceVoice voice = new SourceVoice(audio, format); int bufferSize = format.ConvertLatencyToByteSize(500); DataStream stream = new DataStream(bufferSize, true, true); int samples = bufferSize / format.BlockAlign; for (int i = 0; i < samples; i++) { float val = (float)(Math.Sin(2*Math.PI*500*i/format.SampleRate));// * (0.5 + Math.Sin(2*Math.PI*2.2*i/format.SampleRate)*0.5)); //if (val == 0) val = 1; //val = val / Math.Abs(val); for (int j = 0; j < 3; j++) val = val * val; stream.Write(val); stream.Write(val); //stream.Write(val * (float)(0.5 + Math.Sin(2 * Math.PI * 2.2 * i / format.SampleRate) * 0.5)); //stream.Write(val * (float)(0.5 + Math.Cos(2 * Math.PI * 2.2 * i / format.SampleRate) * 0.5)); } stream.Position = 0; AudioBuffer buffer = new AudioBuffer { Stream = stream, Flags = BufferFlags.EndOfStream, AudioBytes = bufferSize }; //buffer.LoopCount = AudioBuffer.LoopInfinite; voice.SubmitSourceBuffer(buffer, null); voice.SubmitSourceBuffer(buffer, null); voice.SubmitSourceBuffer(buffer, null); voice.SubmitSourceBuffer(buffer, null); voice.SubmitSourceBuffer(buffer, null); voice.SubmitSourceBuffer(buffer, null); voice.SubmitSourceBuffer(buffer, null); voice.SubmitSourceBuffer(buffer, null); voice.SubmitSourceBuffer(buffer, null); voice.SubmitSourceBuffer(buffer, null); voice.SubmitSourceBuffer(buffer, null); voice.SubmitSourceBuffer(buffer, null); voice.SubmitSourceBuffer(buffer, null); voice.SubmitSourceBuffer(buffer, null); voice.Start(); Thread.Sleep(3000); long pos = stream.Position; stream.Position = 0; for (int i = 0; i < samples; i++) { float val = (float)(Math.Sin(2 * Math.PI * 500 * i / format.SampleRate));// * (0.5 + Math.Sin(2*Math.PI*2.2*i/format.SampleRate)*0.5)); //if (val == 0) val = 1; //val = val / Math.Abs(val); //for (int j = 0; j < 8; j++) val = val * val; stream.Write(val); stream.Write(val); //stream.Write(val * (float)(0.5 + Math.Sin(2 * Math.PI * 2.2 * i / format.SampleRate) * 0.5)); //stream.Write(val * (float)(0.5 + Math.Cos(2 * Math.PI * 2.2 * i / format.SampleRate) * 0.5)); } //stream.Position = pos; //voice.State.p while (voice.State.BuffersQueued > 0) Thread.Sleep(100); //Thread.Sleep(6000); }