3 #if SILICONSTUDIO_PLATFORM_WINDOWS
7 using SiliconStudio.Core.Mathematics;
8 using SiliconStudio.Paradox.Audio.Wave;
10 using SharpDX.XAudio2;
11 using SharpDX.X3DAudio;
13 namespace SiliconStudio.
Paradox.Audio
15 public partial class SoundEffectInstance
17 #region Implementation of the ILocalizable Interface
19 internal void Apply3DImpl(AudioListener listener, AudioEmitter emitter)
23 var inputChannels = soundEffect.WaveFormat.Channels;
24 var outputChannels = MasterVoice.VoiceDetails.InputChannelCount;
26 if (inputChannels != 1 || outputChannels != 2)
27 throw new AudioSystemInternalException(
"Error in Apply3DImpl only mono sounds are supposed to be localizable");
29 var list =
new Listener
31 Position = listener.Position.ToSharpDX(),
32 Velocity = listener.Velocity.ToSharpDX(),
33 OrientFront = listener.Forward.ToSharpDX(),
34 OrientTop = listener.Up.ToSharpDX()
36 var emit =
new Emitter
38 Position = emitter.Position.ToSharpDX(),
39 Velocity = emitter.Velocity.ToSharpDX(),
40 DopplerScaler = emitter.DopplerScale,
41 CurveDistanceScaler = emitter.DistanceScale,
43 ChannelCount = inputChannels
46 var dspSettings =
new DspSettings(inputChannels, outputChannels);
48 AudioEngine.X3DAudio.Calculate(list, emit, CalculateFlags.Matrix | CalculateFlags.LpfDirect, dspSettings);
54 ComputeDopplerFactor(listener, emitter);
58 localizationChannelVolumes =
new[] { dspSettings.MatrixCoefficients[0], dspSettings.MatrixCoefficients[1] };
59 UpdateStereoVolumes();
62 internal override void UpdateLooping()
68 internal override void PauseImpl()
73 internal override void ExitLoopImpl()
75 SourceVoice.ExitLoop();
78 internal override void PlayImpl()
83 internal override void StopImpl()
86 SourceVoice.FlushSourceBuffers();
89 private void UpdateStereoVolumes()
91 var sourceChannelCount = WaveFormat.Channels;
95 if (sourceChannelCount == 1)
97 matrix =
new[] { panChannelVolumes[0] * localizationChannelVolumes[0], panChannelVolumes[1] * localizationChannelVolumes[1] };
99 else if (sourceChannelCount == 2)
101 matrix =
new[] { panChannelVolumes[0], 0, 0, panChannelVolumes[1] };
105 throw new AudioSystemInternalException(
"The sound is not supposed to contain more than 2 channels");
108 SourceVoice.SetOutputMatrix(sourceChannelCount, MasterVoice.VoiceDetails.InputChannelCount, matrix);
111 private void UpdatePitch()
113 SourceVoice.SetFrequencyRatio(MathUtil.Clamp((float)Math.Pow(2, Pitch) * dopplerPitchFactor, 0.5f, 2f));
118 #region Implementation of the IDisposable Interface
120 internal void PlatformSpecificDisposeImpl()
122 if(SourceVoice == null)
125 SourceVoice.DestroyVoice();
126 SourceVoice.Dispose();
131 internal SourceVoice SourceVoice;
133 internal void CreateVoice(WaveFormat
format)
135 SourceVoice =
new SourceVoice(AudioEngine.XAudio2, format.ToSharpDX(), VoiceFlags.None, 2f,
true);
136 SourceVoice.StreamEnd +=
Stop;
139 internal override void LoadBuffer()
141 var buffer =
new AudioBuffer(
new SharpDX.DataPointer(soundEffect.WaveDataPtr, soundEffect.WaveDataSize));
144 buffer.LoopCount = AudioBuffer.LoopInfinite;
146 SourceVoice.SubmitSourceBuffer(buffer, null);
149 private void Reset3DImpl()
154 internal override void UpdateVolume()
156 SourceVoice.SetVolume(
Volume);
159 private void UpdatePan()
161 UpdateStereoVolumes();
Gets a single texture view at the specified index in the mip hierarchy and in the array of textures T...
_In_ size_t _In_ size_t _In_ DXGI_FORMAT format