private void StartEngine() { if (m_audioEngine != null) { DisposeVoices(); m_audioEngine.CriticalError -= m_audioEngine_CriticalError; m_audioEngine.Dispose(); } // Init/reinit engine m_audioEngine = new XAudio2(XAudio2Version.Version27); // 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, XAudio2.DefaultChannels, XAudio2.DefaultSampleRate, m_deviceNumber); if (m_useVolumeLimiter) { var limiter = new SharpDX.XAPO.Fx.MasteringLimiter(m_audioEngine); var param = limiter.Parameter; param.Loudness = 0; limiter.Parameter = param; //TODO: this throws exception in 3.0.1 version var effectDescriptor = new EffectDescriptor(limiter); m_masterVoice.SetEffectChain(effectDescriptor); m_soundLimiterReady = true; m_masterVoice.DisableEffect(0); //m_masterVoice.EnableEffect(0); //limiter.Dispose(); } 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); } m_reverb = new Reverb(m_audioEngine); m_gameAudioVoice.SetEffectChain(new EffectDescriptor(m_reverb, masterDetails.InputChannelCount)); m_gameAudioVoice.DisableEffect(0); }
private static void StartEngine() { if (m_audioEngine != null) { DisposeVoices(); m_audioEngine.Dispose(); } // Init/reinit engine m_audioEngine = new XAudio2(); m_masterVoice = new MasteringVoice(m_audioEngine); m_gameAudioVoice = new SubmixVoice(m_audioEngine); m_musicAudioVoice = new SubmixVoice(m_audioEngine); m_hudAudioVoice = new SubmixVoice(m_audioEngine); m_gameAudioVoiceDesc = new VoiceSendDescriptor[] { new VoiceSendDescriptor(m_gameAudioVoice) }; m_musicAudioVoiceDesc = new VoiceSendDescriptor[] { new VoiceSendDescriptor(m_musicAudioVoice) }; m_hudAudioVoiceDesc = new VoiceSendDescriptor[] { new VoiceSendDescriptor(m_hudAudioVoice) }; }