public void SetDefaultAudioDevice(SoundControllServer.AudioDevice device, AudioDeviceRole role)
        {
            if (device == null)
            {
                throw new ArgumentNullException("device");
            }

            // BADNESS: The following code uses undocumented interfaces provided by the Audio SDK. This is completely
            // unsupported, and should be used for amusement purposes only. This is *extremely likely* to be broken
            // in future updates and/or versions of Windows. If Larry Osterman was dead, he would be rolling over
            // in his grave if he knew you were using this for nefarious purposes.
            var config = new PolicyConfig();

            int            hr;
            IPolicyConfig2 config2 = config as IPolicyConfig2;

            if (config2 != null)
            {   // Windows 7 -> Windows 8.1
                hr = config2.SetDefaultEndpoint(device.Id, role);
            }
            else
            {   // Windows 10+
                hr = ((IPolicyConfig3)config).SetDefaultEndpoint(device.Id, role);
            }

            if (hr != HResult.OK)
            {
                throw Marshal.GetExceptionForHR(hr);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Gets WASAPI Audio device.
        /// </summary>
        /// <param name="dataFlow">Audio data flow.</param>
        /// <param name="deviceRole">Audio device role.</param>
        /// <returns>Audio device list.</returns>
        private static AudioDevice[] GetWASAPIAudioDevices(AudioDataFlow dataFlow, AudioDeviceRole deviceRole = AudioDeviceRole.Multimedia)
        {
            var devices = new List <AudioDevice>();

            var mmde = new MMDeviceEnumerator();
            var role = deviceRole switch
            {
                AudioDeviceRole.Console => Role.Console,
                AudioDeviceRole.Multimedia => Role.Multimedia,
                AudioDeviceRole.Communications => Role.Communications,
                _ => Role.Multimedia,
            };

            if (dataFlow.HasFlag(AudioDataFlow.Render))
            {
                try
                {
                    var device = mmde.GetDefaultAudioEndpoint(NAudio.CoreAudioApi.DataFlow.Render, role);
                    devices.Add(GetAudioDeviceFromMMDevice(device, AudioDataFlow.Render));
                }
                catch (Exception) { }

                foreach (var item in mmde.EnumerateAudioEndPoints(NAudio.CoreAudioApi.DataFlow.Render, DeviceState.Active))
                {
                    devices.Add(GetAudioDeviceFromMMDevice(item, AudioDataFlow.Render));
                }
            }

            return(devices.ToArray());
        }
        public void SetDefaultAudioDevice(AudioDevice device, AudioDeviceRole role)
        {
            if (device == null)
                throw new ArgumentNullException("device");

            // BADNESS: The following code uses undocumented interfaces provided by the Audio SDK. This is completely
            // unsupported, and should be used for amusement purposes only. This is *extremely likely* to be broken 
            // in future updates and/or versions of Windows. If Larry Osterman was dead, he would be rolling over 
            // in his grave if he knew you were using this for nefarious purposes.
            var config = new PolicyConfig();

            int hr;
            IPolicyConfig2 config2 = config as IPolicyConfig2;
            if (config2 != null)
            {   // Windows 7 -> Windows 8.1
                hr = config2.SetDefaultEndpoint(device.Id, role);
            }
            else
            {   // Windows 10+
                hr = ((IPolicyConfig3)config).SetDefaultEndpoint(device.Id, role);
            }

            if (hr != HResult.OK)
                throw Marshal.GetExceptionForHR(hr);
        }
Ejemplo n.º 4
0
        public void SetDefaultAudioDevice(AudioDevice device, AudioDeviceRole role = AudioDeviceRole.Multimedia)
        {
            if (device == null)
            {
                throw new ArgumentNullException(nameof(device));
            }

            var config = new PolicyConfig();

            int hr;

            if (config is IPolicyConfig2 config2)
            {   // Windows 7 -> Windows 8.1
                hr = config2.SetDefaultEndpoint(device.Id, role);
            }
            else
            {   // Windows 10+
                hr = ((IPolicyConfig3)config).SetDefaultEndpoint(device.Id, role);
            }

            if (hr != HResult.OK)
            {
                throw Marshal.GetExceptionForHR(hr);
            }
        }
Ejemplo n.º 5
0
        public bool IsDefaultAudioDevice(AudioDevice device, AudioDeviceRole role)
        {
            AudioDevice defaultDevice = GetDefaultAudioDevice(device.Kind, role);

            if (defaultDevice == null)
            {
                return(false);
            }

            return(String.Equals(defaultDevice.Id, device.Id, StringComparison.OrdinalIgnoreCase));
        }
Ejemplo n.º 6
0
        void IMMNotificationClient.OnDefaultDeviceChanged(AudioDeviceKind kind, AudioDeviceRole role, string deviceId)
        {
            var handler = DefaultDeviceChanged;

            if (handler != null)
            {
                AudioDevice device = GetDevice(deviceId);

                handler(this, new DefaultAudioDeviceEventArgs(device, kind, role));
            }
        }
        public AudioDevice GetDefaultAudioDevice(AudioDeviceKind kind, AudioDeviceRole role)
        {
            int hr = _deviceEnumerator.GetDefaultAudioEndpoint(kind, role, out IMMDevice underlyingDevice);

            if (hr == HResult.OK)
            {
                return(new AudioDevice(underlyingDevice));
            }

            if (hr == HResult.NotFound || hr == HResult.FileNotFound)   // See #33
            {
                return(null);
            }

            throw Marshal.GetExceptionForHR(hr);
        }
Ejemplo n.º 8
0
        public bool IsDefaultAudioDevice(AudioDevice device, AudioDeviceRole role)
        {
            if (device == null)
            {
                throw new ArgumentNullException("device");
            }

            AudioDevice defaultDevice = GetDefaultAudioDevice(device.Kind, role);

            if (defaultDevice == null)
            {
                return(false);
            }

            return(String.Equals(defaultDevice.Id, device.Id, StringComparison.OrdinalIgnoreCase));
        }
Ejemplo n.º 9
0
        void IMMNotificationClient.OnDefaultDeviceChanged(AudioDeviceKind kind, AudioDeviceRole role, string deviceId)
        {
            InvokeOnSynchronizationContext(() =>
            {
                var handler = DefaultDeviceChanged;
                if (handler != null)
                {
                    AudioDevice device = null;
                    if (deviceId != null)
                    {
                        device = GetDevice(deviceId);
                    }

                    handler(this, new DefaultAudioDeviceEventArgs(device, kind, role));
                }
            });
        }
Ejemplo n.º 10
0
        public AudioDevice GetDefaultAudioDevice(AudioDeviceKind kind, AudioDeviceRole role)
        {
            const int E_NOTFOUND = unchecked ((int)0x80070490);

            IMMDevice underlyingDevice;
            int       hr = _underlyingEnumerator.GetDefaultAudioEndpoint(kind, role, out underlyingDevice);

            if (hr == HResult.OK)
            {
                return(new AudioDevice(underlyingDevice));
            }

            if (hr == E_NOTFOUND)
            {
                return(null);
            }

            throw Marshal.GetExceptionForHR(hr);
        }
Ejemplo n.º 11
0
        public bool IsDefaultAudioDevice(AudioDevice device, AudioDeviceRole role)
        {
            if (device == null)
                throw new ArgumentNullException("device");

            AudioDevice defaultDevice = GetDefaultAudioDevice(device.Kind, role);
            if (defaultDevice == null)
                return false;

            return String.Equals(defaultDevice.Id, device.Id, StringComparison.OrdinalIgnoreCase);
        }
 public DefaultAudioDeviceEventArgs(AudioDevice device, AudioDeviceKind kind, AudioDeviceRole role)
     : base(device)
 {
     _kind = kind;
     _role = role;
 }
 protected SetAsDefaultDeviceCommand(AudioDeviceManager manager, AudioDevice device, AudioDeviceRole role)
 {
     _manager = manager;
     _device  = device;
     _role    = role;
 }
Ejemplo n.º 14
0
 protected SetAsDefaultDeviceCommandBase(AudioDeviceManager manager, AudioDeviceRole role)
 {
     _manager = manager;
     _role    = role;
 }
Ejemplo n.º 15
0
        public AudioDevice GetDefaultAudioDevice(AudioDeviceKind kind, AudioDeviceRole role)
        {
            IMMDevice underlyingDevice;
            int hr = _deviceEnumerator.GetDefaultAudioEndpoint(kind, role, out underlyingDevice);
            if (hr == HResult.OK)
                return new AudioDevice(underlyingDevice);

            if (hr == HResult.NotFound || hr == HResult.FileNotFound)   // See #33
                return null;

            throw Marshal.GetExceptionForHR(hr);
        }
Ejemplo n.º 16
0
 void IMMNotificationClient.OnDefaultDeviceChanged(AudioDeviceKind kind, AudioDeviceRole role, string deviceId)
 {
     InvokeOnSynchronizationContext(() =>
     {
         var handler = DefaultDeviceChanged;
         if (handler != null)
         {
             AudioDevice device = null;
             if (deviceId != null)
                 device = GetDevice(deviceId);
             
             handler(this, new DefaultAudioDeviceEventArgs(device, kind, role));
         }
     });
 }
Ejemplo n.º 17
0
        /// <summary>
        /// Gets Audio devices.
        /// </summary>
        /// <param name="dataFlow">Audio data flow. In current version, only <see cref="AudioDataFlow.Render"/> is supported.</param>
        /// <param name="deviceType">Audio device type.</param>
        /// <param name="deviceRole">Audio device role.</param>
        /// <returns>Audio device list.</returns>
        public static AudioDevice[] GetAudioDevices(AudioDataFlow dataFlow, AudioDeviceType deviceType = AudioDeviceType.WASAPI, AudioDeviceRole deviceRole = AudioDeviceRole.Multimedia)
        {
            AudioDevice[] result;

            if (deviceType == AudioDeviceType.WASAPI)
            {
                result = GetWASAPIAudioDevices(dataFlow, deviceRole);
            }
            else if (deviceType == AudioDeviceType.Wave)
            {
                result = GetWaveAudioDevices(dataFlow);
            }
            else if (deviceType == AudioDeviceType.DirectSound)
            {
                result = GetDirectSoundAudioDevices(dataFlow);
            }
            else if (deviceType == AudioDeviceType.ASIO)
            {
                result = GetASIOAudioDevices(dataFlow);
            }
            else
            {
                throw new ArgumentException(String.Format("Invalid device type: {0}", deviceType), nameof(deviceType));
            }

            return(result);
        }
Ejemplo n.º 18
0
 public DefaultAudioDeviceEventArgs(AudioDevice device, AudioDeviceKind kind, AudioDeviceRole role)
     : base(device)
 {
     _kind = kind;
     _role = role;
 }
Ejemplo n.º 19
0
 /// <summary>
 /// Gets Audio render devices.
 /// </summary>
 /// <param name="deviceType">Audio device type.</param>
 /// <param name="deviceRole">Audio device role.</param>
 /// <returns>Audio device list.</returns>
 public static AudioDevice[] GetAudioRenderDevices(AudioDeviceType deviceType = AudioDeviceType.WASAPI, AudioDeviceRole deviceRole = AudioDeviceRole.Multimedia)
 {
     return(GetAudioDevices(AudioDataFlow.Render, deviceType, deviceRole));
 }