Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        /// <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);
        }
Ejemplo n.º 4
0
        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);
            }
        }
Ejemplo n.º 5
0
            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);
            }
Ejemplo n.º 6
0
        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);
            }
        }
Ejemplo n.º 7
0
 public XA2Submixer(XA2Engine engine)
 {
     _engine       = engine;
     SubMixerVoice = new SubmixVoice(_engine.Device);
 }