private unsafe void GetDeviceDetails(int index, out DeviceDetails deviceDetailsRef) { DeviceDetails.__Native _Native = default(DeviceDetails.__Native); Result result = LocalInterop.Calliint(this._nativePointer, index, &_Native, *(*(void ***)this._nativePointer + 4)); deviceDetailsRef = default(DeviceDetails); deviceDetailsRef.__MarshalFrom(ref _Native); result.CheckError(); }
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); }
internal unsafe void __MarshalTo(ref DeviceDetails.__Native @ref) { fixed (char* deviceID = this.DeviceID) { fixed (char* ptr = &@ref.DeviceID) { Utilities.CopyMemory((IntPtr)((void*)ptr), (IntPtr)((void*)deviceID), this.DeviceID.Length * 2); } } fixed (char* displayName = this.DisplayName) { fixed (char* ptr2 = &@ref.DisplayName) { Utilities.CopyMemory((IntPtr)((void*)ptr2), (IntPtr)((void*)displayName), this.DisplayName.Length * 2); } } @ref.Role = this.Role; @ref.OutputFormat = WaveFormatExtensible.__NewNative(); this.OutputFormat.__MarshalTo(ref @ref.OutputFormat); }
internal unsafe void __MarshalFrom(ref DeviceDetails.__Native @ref) { fixed (char* ptr = &@ref.DeviceID) { this.DeviceID = Utilities.PtrToStringUni((IntPtr)((void*)ptr), 256); } fixed (char* ptr2 = &@ref.DisplayName) { this.DisplayName = Utilities.PtrToStringUni((IntPtr)((void*)ptr2), 256); } this.Role = @ref.Role; this.OutputFormat = new WaveFormatExtensible(); this.OutputFormat.__MarshalFrom(ref @ref.OutputFormat); }
internal void __MarshalFree(ref DeviceDetails.__Native @ref) { @ref.__MarshalFree(); }
private unsafe void GetDeviceDetails(int index, out DeviceDetails deviceDetailsRef) { DeviceDetails.__Native _Native = default(DeviceDetails.__Native); Result result = LocalInterop.Calliint(this._nativePointer, index, &_Native, *(*(void***)this._nativePointer + 4)); deviceDetailsRef = default(DeviceDetails); deviceDetailsRef.__MarshalFrom(ref _Native); result.CheckError(); }
private static void CreateX3DAudio() { if (m_audioEngine == null) return; m_deviceDetails = m_audioEngine.GetDeviceDetails(0); m_x3dAudio = new MyX3DAudio(m_deviceDetails.OutputFormat); MySandboxGame.Log.WriteLine(string.Format("MyAudio.CreateX3DAudio - Device: {0} - Channel #: {1}", m_deviceDetails.DisplayName, m_deviceDetails.OutputFormat.Channels)); }