Пример #1
0
        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();
        }
Пример #2
0
        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);
        }
Пример #3
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);
 }
Пример #4
0
 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);
 }
Пример #5
0
 internal void __MarshalFree(ref DeviceDetails.__Native @ref)
 {
     @ref.__MarshalFree();
 }
Пример #6
0
        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();
        }
Пример #7
0
        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));
        }