/// <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; } }
/// <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()); }
/// <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); }
/// <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()); }
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); }
public AudioControl(AudioDataFlow audioFlow) { _audioDataFlow = audioFlow; //Create Instance IMMDeviceEnumerator deviceEnumerator = MMDeviceEnumeratorFactory.CreateInstance(); InitializeAudio(audioFlow, deviceEnumerator); }
/// <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); }
/// <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); }
/// <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); }
/// <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()); }
/// <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()); }
/// <summary> /// The Constructor /// </summary> /// <param name="audioFlow"></param> public BaseAudioControl(IMMDevice audioDevice, AudioDataFlow audioFlow) { _audioDataFlow = audioFlow; _audioDevice = audioDevice; }
public void OnDefaultDeviceChanged(AudioDataFlow flow, EndPointRole role, [MarshalAs(UnmanagedType.LPWStr)] string defaultDeviceId) { //Do Nothing. }
public AudioSessionControl(IMMDevice audioDevice, AudioDataFlow audioFlow) : base(audioDevice, audioFlow) { AudioSessionsPid = new List <AudioSessionDataStruct>(); _audioSessionEventDict = new Dictionary <IAudioSessionControl, JoshAudioSessionStruct>(); InitializeAudioSessions(); }
public AudioControl(IMMDevice audioDevice, AudioDataFlow audioFlow) : base(audioDevice, audioFlow) { //Initialize Call Back classCallBack = new ClassAudioEndPointVolumeCallBack(); InitializeAudioClient(); }
public void OnDefaultDeviceChanged(AudioDataFlow flow, EndPointRole role, [MarshalAs(UnmanagedType.LPWStr)] string defaultDeviceId) { //Change default device in windows page. }