作者:Naive | 来源:互联网 | 2023-06-08 17:38
我正在尝试使用NAudio指定用于记录的音频输入设备。我已经列举了当前的设备,并具有ID(GUID)。我目前在每个设备上循环浏览,直到找到匹配的GUID,然后将循环计数用作索引。
有没有一种方法可以基于GUID选择音频输入设备而不依赖索引?这里的问题是,在将循环计数用作索引的同时,for each循环不考虑索引而遍历每个设备。
void waveSource_StartRecording(int samplerate,string format,int channels,string filespec,string ID,int limit,string fileGuid)
{
try
{
AppendLog("waveSource_StartRecording Started: [" + ID +"]");
var enumerator = new MMDeviceEnumerator();
length = limit;
int devcount = WaveIn.DeviceCount;
string tempGUID;
int device_count = 0;
int waveInDevice = 0;
int wavInDevice = 0;
bool bBreak = false;
for (waveInDevice = 0; waveInDevice {
WaveInCapabilities deviceInfo = WaveIn.getcapabilities(waveInDevice);
foreach (MMDevice device in enumerator.EnumerateAudioEndPoints(DataFlow.Capture,DeviceState.active))
{
AppendLog("InnerIndex: " + wavInDevice);
tempGUID = device.ID.Split(new char[] { '.' }).Last().ToString().Replace("{","").Replace("}","");
AppendLog("tempGUID: " + tempGUID);
if (tempGUID == ID.Replace("{",""))
{
AppendLog("Found match for incoming ID: " + ID + " tempGUID: " + tempGUID);
device_count = wavInDevice;
bBreak = true;
break;
}
wavInDevice = wavInDevice + 1;
}
if (bBreak) // check if inner loop set break
break; // break outer loop
}
Console.WriteLine(device_count + "|" + waveInDevice + "|" + wavInDevice);
AppendLog(device_count + "|" + waveInDevice + "|" + wavInDevice);
WaveInEvent wave_inevent = new WaveInEvent();
wave_inevent.DeviceNumber = device_count;
waveSource = wave_inevent;
string Audio_filepath = $"{filespec}\\{fileGuid}.{format.ToLower()}";
AppendLog(filespec);
waveSource.DataAvailable += new EventHandler(waveSource_DataAvailable);
waveSource.RecordingStopped += new EventHandler(waveSource_RecordingStopped);
waveSource.WaveFormat = new WaveFormat(samplerate,channels);
wfw = new WaveFileWriter(Audio_filepath,waveSource.WaveFormat);
aTimer.Interval = length * 1000; // Convert in millisecond for setting Timer Interval
AppendLog("Recording....");
waveSource.StartRecording();
aTimer.Enabled = true;
}
catch (Exception ex)
{
AppendLog("Exception in waveSource_StartRecording " + ex.Message.ToString());
throw ex;
}
}