コード例 #1
0
        /// <summary>
        /// The Initialize Audio Controls
        /// </summary>
        public void InitializeAudioControls(AudioDataFlow initFlow, string pid, string vid)
        {
            IMMDevice _audioDevice = null;

            //Get Audio Device
            switch (initFlow)
            {
            case AudioDataFlow.eAll:
                _audioDevice         = GetIMMDevice(AudioDataFlow.eRender, pid, vid);
                _speakerControl      = new AudioControl(_audioDevice, AudioDataFlow.eRender);
                _audioSessionControl = new AudioSessionControl(_audioDevice, AudioDataFlow.eRender);
                _audioDevice         = GetIMMDevice(AudioDataFlow.eCapture, pid, vid);
                _microphoneControl   = new AudioControl(_audioDevice, AudioDataFlow.eCapture);
                break;

            case AudioDataFlow.eRender:
                _audioDevice    = GetIMMDevice(initFlow, pid, vid);
                _speakerControl = new AudioControl(_audioDevice, initFlow);
                break;

            case AudioDataFlow.eCapture:
                _audioDevice       = GetIMMDevice(initFlow, pid, vid);
                _microphoneControl = new AudioControl(_audioDevice, initFlow);
                break;
            }
        }
コード例 #2
0
        /// <summary>
        /// Gets WaveOut/WaveIn audio device.
        /// </summary>
        /// <param name="dataFlow">Audio data flow.</param>
        /// <returns>Audio device list.</returns>
        private static AudioDevice[] GetWaveAudioDevices(AudioDataFlow dataFlow)
        {
            var devices = new List <AudioDevice>();

            if (dataFlow.HasFlag(AudioDataFlow.Render))
            {
                for (int i = -1; i < WaveOut.DeviceCount; i++)
                {
                    var caps = WaveOut.GetCapabilities(i);

                    devices.Add(
                        new AudioDevice
                    {
                        Id           = Convert.ToBase64String(Encoding.UTF8.GetBytes(String.Format("{0}.{1}", i, caps.ProductName)), Base64FormattingOptions.None).TrimEnd('='),
                        Guid         = caps.ProductGuid,
                        Number       = i,
                        DataFlow     = AudioDataFlow.Render,
                        DeviceType   = AudioDeviceType.Wave,
                        Name         = caps.ProductName,
                        FriendlyName = caps.ProductName,
                    }
                        );
                }
            }

            return(devices.ToArray());
        }
コード例 #3
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);
        }
コード例 #4
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());
        }
コード例 #5
0
        private void InitializeAudio(AudioDataFlow audioFlow, IMMDeviceEnumerator deviceEnumerator)
        {
            //Get Audio Device
            COMResult result = deviceEnumerator.GetDefaultAudioEndpoint(audioFlow, EndPointRole.eMultimedia, out _audioDevice);

            //Register End point notification
            _notifyClient = new MMNotificationClient();
            result        = deviceEnumerator.RegisterEndpointNotificationCallback(_notifyClient);
            //Get Audio Client from device
            result       = _audioDevice.Activate(typeof(IAudioClient).GUID, 0, IntPtr.Zero, out object obj);
            _audioClient = (IAudioClient)obj;
            //Get Audio Meter from device
            result      = _audioDevice.Activate(typeof(IAudioMeterInformation).GUID, 0, IntPtr.Zero, out obj);
            _audioMeter = (IAudioMeterInformation)obj;
            //Initialize Audio Client.
            _sessionGuid = new Guid();
            result       = _audioClient.GetMixFormat(out waveFormat);
            AudioClientStreamFlags streamFlag = AudioClientStreamFlags.None;

            if (audioFlow == AudioDataFlow.eRender)
            {
                streamFlag = AudioClientStreamFlags.Loopback;
            }
            result = _audioClient.Initialize(AudioClientMode.Shared, streamFlag, 10000000, 0, waveFormat, ref _sessionGuid);
            //Get Capture Client.
            result = _audioClient.GetService(typeof(IAudioCaptureClient).GUID, out obj);
            Marshal.ThrowExceptionForHR((int)result);
            _audioCaptureClient = (IAudioCaptureClient)obj;
            result = _audioClient.Start();
            //Change wave format here
            SetupWaveFormat(waveFormat);
        }
コード例 #6
0
        public AudioControl(AudioDataFlow audioFlow)
        {
            _audioDataFlow = audioFlow;
            //Create Instance
            IMMDeviceEnumerator deviceEnumerator = MMDeviceEnumeratorFactory.CreateInstance();

            InitializeAudio(audioFlow, deviceEnumerator);
        }
コード例 #7
0
        /// <summary>
        /// Gets <see cref="AudioDevice"/> from MMDevice.
        /// </summary>
        /// <param name="mmDevice">MMDevice.</param>
        /// <param name="dataFlow">Audio Data flow.</param>
        /// <returns><see cref="AudioDevice"/>.</returns>
        private static AudioDevice GetAudioDeviceFromMMDevice(MMDevice mmDevice, AudioDataFlow dataFlow)
        {
            var device = new AudioDevice
            {
                Id           = mmDevice.ID,
                DataFlow     = dataFlow,
                DeviceType   = AudioDeviceType.WASAPI,
                Name         = mmDevice.DeviceFriendlyName,
                FriendlyName = mmDevice.FriendlyName,
                MMDevice     = mmDevice,
            };

            return(device);
        }
コード例 #8
0
        /// <summary>
        /// Get HID Audio Device UUID
        /// </summary>
        /// <param name="dataFlow"></param>
        /// <param name="pid"></param>
        /// <param name="vid"></param>
        /// <returns></returns>
        private string GetHIDAudioDeviceUUID(AudioDataFlow dataFlow, string pid, string vid)
        {
            COMResult result = COMResult.E_FAIL;

            PropertyKey proKey;
            PropVariant proVar;

            result = _deviceEnumerator.EnumAudioEndpoints(dataFlow, AudioDeviceState.DEVICE_STATE_ACTIVE, out IMMDeviceCollection devCollect);
            result = devCollect.GetCount(out int devCnt);
            for (int i = 0; i < devCnt; i++)
            {
                result = devCollect.Item(i, out IMMDevice tDev);
                tDev.GetId(out string devID);
                tDev.OpenPropertyStore(StorageAccessMode.STGM_READ, out IPropertyStore ppt);
                ppt.GetCount(out int ppCnt);
                for (int j = 0; j < ppCnt; j++)
                {
                    result = ppt.GetAt(j, out proKey);
                    result = ppt.GetValue(ref proKey, out proVar);
                    if (proVar.DataType == System.Runtime.InteropServices.VarEnum.VT_LPWSTR ||
                        proVar.DataType == System.Runtime.InteropServices.VarEnum.VT_LPSTR)
                    {
                        if (proKey.formatId.ToString().Equals(PKEY_AUDIOENDPOINT_HWID.formatId.ToString()) &&
                            proKey.propertyId == PKEY_AUDIOENDPOINT_HWID.propertyId)
                        {
                            string hwID = proVar.Value.ToString();
                            if (!GetPIDVIDFromHWIDString(hwID, out string hwPid, out string hwVid))
                            {
                                continue;
                            }
                            if (vid.Equals(hwVid, StringComparison.CurrentCultureIgnoreCase) &&
                                pid.Equals(hwPid, StringComparison.CurrentCultureIgnoreCase))
                            {
                                return(devID);
                            }
                        }
                    }
                }
            }
            return(string.Empty);
        }
コード例 #9
0
        /// <summary>
        /// Get IMMDevice
        /// </summary>
        /// <param name="initFlow"></param>
        /// <param name="pid"></param>
        /// <param name="vid"></param>
        /// <returns>Null means Failed</returns>
        private IMMDevice GetIMMDevice(AudioDataFlow initFlow, string pid, string vid)
        {
            COMResult result  = COMResult.E_FAIL;
            IMMDevice _device = null;

            if (initFlow == AudioDataFlow.eAll)
            {
                //Not support get both render and capture.
                return(_device);
            }
            string devUUID = GetHIDAudioDeviceUUID(initFlow, pid, vid);

            if (string.IsNullOrEmpty(devUUID))
            {
                //Failed to get UUID, Get Default Endpoint
                result = _deviceEnumerator.GetDefaultAudioEndpoint(initFlow, EndPointRole.eCommunications, out _device);
            }
            else
            {
                result = _deviceEnumerator.GetDevice(devUUID, out _device);
            }
            return(_device);
        }
コード例 #10
0
        /// <summary>
        /// Gets ASIO audio device.
        /// </summary>
        /// <param name="dataFlow">Audio data flow.</param>
        /// <returns>Audio device list.</returns>
        private static AudioDevice[] GetASIOAudioDevices(AudioDataFlow dataFlow)
        {
            var devices = new List <AudioDevice>();

            if (dataFlow.HasFlag(AudioDataFlow.Render))
            {
                foreach (var item in AsioOut.GetDriverNames())
                {
                    devices.Add(
                        new AudioDevice
                    {
                        Id           = item,
                        DataFlow     = AudioDataFlow.Render,
                        DeviceType   = AudioDeviceType.ASIO,
                        Name         = item,
                        FriendlyName = item,
                    }
                        );
                }
            }

            return(devices.ToArray());
        }
コード例 #11
0
        /// <summary>
        /// Get DirectSound audio device.
        /// </summary>
        /// <param name="dataFlow">Audio data flow.</param>
        /// <returns>Audio device list.</returns>
        private static AudioDevice[] GetDirectSoundAudioDevices(AudioDataFlow dataFlow)
        {
            var devices = new List <AudioDevice>();

            if (dataFlow.HasFlag(AudioDataFlow.Render))
            {
                foreach (var item in DirectSoundOut.Devices)
                {
                    devices.Add(
                        new AudioDevice
                    {
                        Id           = item.Guid.ToString(),
                        Guid         = item.Guid,
                        DataFlow     = AudioDataFlow.Render,
                        DeviceType   = AudioDeviceType.DirectSound,
                        Name         = item.ModuleName,
                        FriendlyName = item.Description,
                    }
                        );
                }
            }

            return(devices.ToArray());
        }
コード例 #12
0
 /// <summary>
 /// The Constructor
 /// </summary>
 /// <param name="audioFlow"></param>
 public BaseAudioControl(IMMDevice audioDevice, AudioDataFlow audioFlow)
 {
     _audioDataFlow = audioFlow;
     _audioDevice   = audioDevice;
 }
コード例 #13
0
 public void OnDefaultDeviceChanged(AudioDataFlow flow, EndPointRole role, [MarshalAs(UnmanagedType.LPWStr)] string defaultDeviceId)
 {
     //Do Nothing.
 }
コード例 #14
0
 public AudioSessionControl(IMMDevice audioDevice, AudioDataFlow audioFlow) : base(audioDevice, audioFlow)
 {
     AudioSessionsPid       = new List <AudioSessionDataStruct>();
     _audioSessionEventDict = new Dictionary <IAudioSessionControl, JoshAudioSessionStruct>();
     InitializeAudioSessions();
 }
コード例 #15
0
 public AudioControl(IMMDevice audioDevice, AudioDataFlow audioFlow) : base(audioDevice, audioFlow)
 {
     //Initialize Call Back
     classCallBack = new ClassAudioEndPointVolumeCallBack();
     InitializeAudioClient();
 }
コード例 #16
0
 public void OnDefaultDeviceChanged(AudioDataFlow flow, EndPointRole role, [MarshalAs(UnmanagedType.LPWStr)] string defaultDeviceId)
 {
     //Change default device in windows page.
 }