public void Apply3D(SourceVoice voice, Listener listener, Emitter emitter, float maxDistance, float frequencyRatio) { m_x3dAudio.Calculate(listener, emitter, CalculateFlags.Matrix | CalculateFlags.Doppler, m_dsp); if (emitter.InnerRadius == 0f) { // approximated decay by distance float decay = MathHelper.Clamp(1f - m_dsp.EmitterToListenerDistance / maxDistance, 0f, 1f); for (int i = 0; i < m_dsp.MatrixCoefficients.Length; ++i) { m_dsp.MatrixCoefficients[i] *= decay; } } voice.SetOutputMatrix(m_dsp.SourceChannelCount, m_dsp.DestinationChannelCount, m_dsp.MatrixCoefficients); voice.SetFrequencyRatio(frequencyRatio * m_dsp.DopplerFactor); }
public float Apply3D(SourceVoice voice, Listener listener, Emitter emitter, int srcChannels, int dstChannels, CalculateFlags flags, float maxDistance, float frequencyRatio, bool silent) { unsafe { DspSettings settings; int matrixCoefficientCount = srcChannels * dstChannels; float* matrixCoefficients = stackalloc float[matrixCoefficientCount]; float* delay = stackalloc float[dstChannels]; settings.SrcChannelCount = srcChannels; settings.DstChannelCount = dstChannels; settings.MatrixCoefficientsPointer = new IntPtr(matrixCoefficients); settings.DelayTimesPointer = new IntPtr(delay); Calculate(listener, emitter, flags, &settings); if (emitter.InnerRadius == 0f) { // approximated decay by distance float decay; if (silent) decay = 0f; else decay = MathHelper.Clamp(1f - settings.EmitterToListenerDistance / maxDistance, 0f, 1f); for (int i = 0; i < matrixCoefficientCount; i++) { matrixCoefficients[i] *= decay; } } voice.SetOutputMatrix(null, settings.SrcChannelCount, settings.DstChannelCount, matrixCoefficients); voice.SetFrequencyRatio(frequencyRatio * settings.DopplerFactor); return settings.EmitterToListenerDistance; } }
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(); }
/// <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); } } }
public float Apply3D(SourceVoice voice, Listener listener, Emitter emitter, int srcChannels, int dstChannels, CalculateFlags flags, float maxDistance, float frequencyRatio, bool silent, bool use3DCalculation = true) { unsafe { DspSettings settings; int matrixCoefficientCount = srcChannels * dstChannels; float* matrixCoefficients = stackalloc float[matrixCoefficientCount]; float* delay = stackalloc float[dstChannels]; settings.SrcChannelCount = srcChannels; settings.DstChannelCount = dstChannels; settings.MatrixCoefficientsPointer = new IntPtr(matrixCoefficients); settings.DelayTimesPointer = new IntPtr(delay); if (use3DCalculation) { Calculate(listener, emitter, flags, &settings); voice.SetFrequencyRatio(frequencyRatio * settings.DopplerFactor); } else { //realistic sounds settings.EmitterToListenerDistance = Vector3.Distance(new Vector3(listener.Position.X, listener.Position.Y, listener.Position.Z), new Vector3(emitter.Position.X, emitter.Position.Y, emitter.Position.Z)); for(int i = 0; i < matrixCoefficientCount; i++) matrixCoefficients[i] = 1f; } if (emitter.InnerRadius == 0f) { // approximated decay by distance float decay; if (silent) decay = 0f; else decay = MathHelper.Clamp(1f - settings.EmitterToListenerDistance / maxDistance, 0f, 1f); for (int i = 0; i < matrixCoefficientCount; i++) { matrixCoefficients[i] *= decay; } } #if !XB1 voice.SetOutputMatrix(null, settings.SrcChannelCount, settings.DstChannelCount, matrixCoefficients); #else // XB1 var matCoefs = new float[matrixCoefficientCount]; for (int i = 0; i < matrixCoefficientCount; i++) matCoefs[i] = matrixCoefficients[i]; voice.SetOutputMatrix(null, settings.SrcChannelCount, settings.DstChannelCount, matCoefs); #endif // XB1 return settings.EmitterToListenerDistance; } }