internal static void PlatformShutdown() { if (_reverbVoice != null) { _reverbVoice.DestroyVoice(); _reverbVoice.Dispose(); _reverbVoice = null; } if (MasterVoice != null) { MasterVoice.Dispose(); MasterVoice = null; } if (Device != null) { Device.StopEngine(); Device.Dispose(); Device = null; } _device3DDirty = true; _speakers = Speakers.Stereo; }
static AudioDefines() { WaveFormat = new WaveFormat(); XAudio = new XAudio2(); MasteringVoice = new MasteringVoice(XAudio); SubmixVoice = new SubmixVoice(XAudio); SubmixVoice.SetOutputVoices(new[] { new VoiceSendDescriptor(MasteringVoice) }); VoicePool = new VoicePool(XAudio, SubmixVoice); }
/// <summary> /// Initializes a new instance of the <see cref="AudioManager" /> class. /// </summary> /// <param name="listener"> The listener. </param> /// <param name="fxSoundPoolLimit"> The effects sound pool limit. </param> /// <param name="speakers"> The speakers. </param> /// <param name="deviceID"> (Optional) Identifier for the device. </param> /// <exception cref="ArgumentException"> /// Thrown when one or more arguments have unsupported or /// illegal values. /// </exception> public AudioManager(Listener listener, int fxSoundPoolLimit, Speakers speakers, string?deviceID = null) { _listener = listener; if (fxSoundPoolLimit <= 0) { throw new ArgumentException("fxSoundPoolLimit must be bigger than 0"); } _soundBuffer = new Dictionary <int, SoundBuffer>(128); _fxLinkedSoundList = new LinkedSoundList(fxSoundPoolLimit); _envLinkedSoundList = new LinkedSoundList(); #if DEBUG _xAudio2 = new XAudio2(XAudio2Flags.DebugEngine, ProcessorSpecifier.AnyProcessor); #else _xAudio2 = new XAudio2(XAudio2Flags.None, ProcessorSpecifier.AnyProcessor, XAudio2Version.Default); #endif if (_xAudio2.Version == XAudio2Version.Version27) { if (int.TryParse(deviceID, out int deviceID27)) { _masteringVoice = new MasteringVoice( _xAudio2, XAudio2.DefaultChannels, XAudio2.DefaultSampleRate, deviceID27); } else { _masteringVoice = new MasteringVoice( _xAudio2, XAudio2.DefaultChannels, XAudio2.DefaultSampleRate, deviceID); } } else { _masteringVoice = new MasteringVoice( _xAudio2, XAudio2.DefaultChannels, XAudio2.DefaultSampleRate, deviceID); } _masteringVoice.SetVolume(_masterVolume); _x3DAudio = new X3DAudio(speakers, X3DAudio.SpeedOfSound); _masteringVoice.GetVoiceDetails(out VoiceDetails details); _inputChannelCount = details.InputChannelCount; _fxSubmixVoice = new SubmixVoice(_xAudio2, _inputChannelCount, details.InputSampleRate); _fxSubmixVoice.SetVolume(_fxVolume); _envSubmixVoice = new SubmixVoice(_xAudio2, _inputChannelCount, details.InputSampleRate); _envSubmixVoice.SetVolume(_envVolume); _fxVoiceSendDescriptor = new VoiceSendDescriptor(VoiceSendFlags.None, _fxSubmixVoice); _envVoiceSendDescriptor = new VoiceSendDescriptor(VoiceSendFlags.None, _envSubmixVoice); }
private void CreateReverbSubmixVoice() { try { VoiceDetails masterDetails = MasteringVoice.VoiceDetails; SubmixVoiceFlags sendFlags = IsReverbFilterEnabled ? SubmixVoiceFlags.UseFilter : SubmixVoiceFlags.None; ReverbVoice = new SubmixVoice(Device, 1, masterDetails.InputSampleRate, sendFlags, 0); } catch (SharpDXException ex) { throw new AudioException("Error creating reverb submix voice.", ex); } try { reverb = new Reverb(); ReverbVoice.SetEffectChain(new EffectDescriptor(reverb, 1)); ReverbVoice.SetEffectParameters(0, reverbParameters); } catch (SharpDXException ex) { throw new AudioException("Error setting reverb effect.", ex); } }
public Track(XAudio2 xAudio2, Z2Sound baa, Dictionary <Tuple <byte, byte>, Instrument> instrumentTable, Dictionary <int, Sample> sampleTable) { engine = xAudio2; soundData = baa; this.instrumentTable = instrumentTable; this.sampleTable = sampleTable; voiceTable = new Dictionary <byte, NoteData>(); submix = new SubmixVoice(engine); Echo effect = new Echo(); EffectDescriptor effectDescriptor = new EffectDescriptor(effect) { InitialState = true, OutputChannelCount = 2 }; submix.SetEffectChain(effectDescriptor); EchoParameters effectParameter = new EchoParameters { Delay = 160f, Feedback = 0f, WetDryMix = 0f }; submix.SetEffectParameters(0, effectParameter); submix.EnableEffect(0); outputMatrix = new float[2]; Volume = 127; Pitch = 0; Pan = 63; panChanged = false; Bank = 0; Echo = 0; echoChanged = false; Instrument = 0; outputMatrix[0] = (outputMatrix[1] = 0.5f); }
private void StartEngine() { if (m_audioEngine != null) { DisposeVoices(); m_audioEngine.Dispose(); } // Init/reinit engine m_audioEngine = new XAudio2(); // A way to disable SharpDX callbacks //var meth = m_audioEngine.GetType().GetMethod("UnregisterForCallbacks_", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); //var callbacks = m_audioEngine.GetType().GetField("engineShadowPtr", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); //meth.Invoke((object)m_audioEngine, new object[] { callbacks.GetValue(m_audioEngine) }); m_audioEngine.CriticalError += m_audioEngine_CriticalError; m_lastDeviceCount = m_audioEngine.DeviceCount; m_deviceNumber = 0; while (true) //find first non com device { try { m_deviceDetails = m_audioEngine.GetDeviceDetails(m_deviceNumber); if (m_deviceDetails.Role == DeviceRole.DefaultCommunicationsDevice) { m_deviceNumber++; if (m_deviceNumber == m_audioEngine.DeviceCount) { m_deviceNumber--; break; } } else { break; } } catch (Exception e) { MyLog.Default.WriteLine(string.Format("Failed to get device details.\n\tdevice no.: {0}\n\tdevice count: {1}", m_deviceNumber, m_audioEngine.DeviceCount), LoggingOptions.AUDIO); MyLog.Default.WriteLine(e.ToString()); m_deviceNumber = 0; m_deviceDetails = m_audioEngine.GetDeviceDetails(m_deviceNumber); break; } } m_masterVoice = new MasteringVoice(m_audioEngine, deviceIndex: m_deviceNumber); m_calculateFlags = CalculateFlags.Matrix | CalculateFlags.Doppler; if ((m_deviceDetails.OutputFormat.ChannelMask & Speakers.LowFrequency) != 0) { m_calculateFlags |= CalculateFlags.RedirectToLfe; } var masterDetails = m_masterVoice.VoiceDetails; m_gameAudioVoice = new SubmixVoice(m_audioEngine, masterDetails.InputChannelCount, masterDetails.InputSampleRate); m_musicAudioVoice = new SubmixVoice(m_audioEngine, masterDetails.InputChannelCount, masterDetails.InputSampleRate); m_hudAudioVoice = new SubmixVoice(m_audioEngine, masterDetails.InputChannelCount, masterDetails.InputSampleRate); m_gameAudioVoiceDesc = new VoiceSendDescriptor[] { new VoiceSendDescriptor(m_gameAudioVoice) }; m_musicAudioVoiceDesc = new VoiceSendDescriptor[] { new VoiceSendDescriptor(m_musicAudioVoice) }; m_hudAudioVoiceDesc = new VoiceSendDescriptor[] { new VoiceSendDescriptor(m_hudAudioVoice) }; if (m_mute) { // keep sounds muted m_gameAudioVoice.SetVolume(0); m_musicAudioVoice.SetVolume(0); } }
public XA2Submixer(XA2Engine engine) { _engine = engine; SubMixerVoice = new SubmixVoice(_engine.Device); }