GetAudioDeviceNames.cs
using System.Management.Automation;
using NAudio.Wave; using NAudio.CoreAudioApi; namespace GenXdev.Helpers { /// <summary> /// Gets available audio device names that can be used with AudioDevice parameter /// </summary> [Cmdlet(VerbsCommon.Get, "AudioDeviceNames")] public class GetAudioDeviceNames : PSCmdlet { #region Cmdlet Parameters [Parameter(Mandatory = false, HelpMessage = "Whether to list desktop audio capture devices instead of microphone devices")] public SwitchParameter UseDesktopAudioCapture { get; set; } [Parameter(Mandatory = false, HelpMessage = "Returns detailed device objects instead of just names")] public SwitchParameter Passthru { get; set; } #endregion protected override void ProcessRecord() { base.ProcessRecord(); try { if (UseDesktopAudioCapture.IsPresent) { ListDesktopAudioDevices(); } else { ListMicrophoneDevices(); } } catch (Exception ex) { WriteError(new ErrorRecord(ex, "AudioDeviceEnumerationError", ErrorCategory.OperationStopped, null)); } } private void ListMicrophoneDevices() { WriteVerbose("Enumerating microphone devices..."); for (int i = 0; i < WaveIn.DeviceCount; i++) { try { var deviceInfo = WaveIn.GetCapabilities(i); if (Passthru.IsPresent) { var deviceObject = new PSObject(); deviceObject.Properties.Add(new PSNoteProperty("Index", i)); deviceObject.Properties.Add(new PSNoteProperty("Name", deviceInfo.ProductName)); deviceObject.Properties.Add(new PSNoteProperty("Guid", deviceInfo.ProductGuid)); deviceObject.Properties.Add(new PSNoteProperty("Channels", deviceInfo.Channels)); deviceObject.Properties.Add(new PSNoteProperty("Type", "Microphone")); deviceObject.Properties.Add(new PSNoteProperty("WildcardPattern", $"*{deviceInfo.ProductName}*")); WriteObject(deviceObject); } else { WriteObject(deviceInfo.ProductName); } } catch (Exception ex) { WriteVerbose($"Could not enumerate device {i}: {ex.Message}"); } } } private void ListDesktopAudioDevices() { WriteVerbose("Enumerating desktop audio capture devices..."); try { using var deviceEnumerator = new MMDeviceEnumerator(); var devices = deviceEnumerator.EnumerateAudioEndPoints(DataFlow.Render, DeviceState.Active); int index = 0; foreach (var device in devices) { try { if (Passthru.IsPresent) { var deviceObject = new PSObject(); deviceObject.Properties.Add(new PSNoteProperty("Index", index)); deviceObject.Properties.Add(new PSNoteProperty("Name", device.FriendlyName)); deviceObject.Properties.Add(new PSNoteProperty("Id", device.ID)); deviceObject.Properties.Add(new PSNoteProperty("State", device.State.ToString())); deviceObject.Properties.Add(new PSNoteProperty("Type", "DesktopAudio")); deviceObject.Properties.Add(new PSNoteProperty("WildcardPattern", $"*{device.FriendlyName}*")); WriteObject(deviceObject); } else { WriteObject(device.FriendlyName); } index++; } catch (Exception ex) { WriteVerbose($"Could not get details for device {device?.ID}: {ex.Message}"); } } } catch (Exception ex) { WriteWarning($"Desktop audio device enumeration failed: {ex.Message}"); WriteWarning("Desktop audio device selection by name is not supported in this NAudio version."); if (Passthru.IsPresent) { var defaultDevice = new PSObject(); defaultDevice.Properties.Add(new PSNoteProperty("Index", 0)); defaultDevice.Properties.Add(new PSNoteProperty("Name", "Default Desktop Audio")); defaultDevice.Properties.Add(new PSNoteProperty("Id", "default")); defaultDevice.Properties.Add(new PSNoteProperty("State", "Available")); defaultDevice.Properties.Add(new PSNoteProperty("Type", "DesktopAudio")); defaultDevice.Properties.Add(new PSNoteProperty("WildcardPattern", "*default*")); WriteObject(defaultDevice); } else { WriteObject("Default Desktop Audio"); } } } } } |