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");
                }
            }
        }
    }
}