В DirectSound есть много нюансов, с которыми сложно работать. Если вы открыты для использования сторонних опций, есть несколько бесплатных, которые абстрагируют технические детали DirectSound и делают эту проблему гораздо более доступной. Я лично рекомендую BASS.NET - и NAudio хорошо, если вы больше заинтересованы в полностью управляемом решении.
В BASS.NET ваш код будет выглядеть примерно так:
private RECORDPROC _myRecProc; // make it global, so that the Garbage Collector can not remove it
...
Bass.BASS_RecordInit(-1);
_myRecProc = new RECORDPROC(MyRecording);
// start recording paused
int settings = 0;
int inputSource = 0;
while (settings != -1)
{
// get the settings of that input
settings = Bass.BASS_RecordGetInput(inputSource, ref vol);
if ( Bass.BASS_RecordGetInputName(inputSource) == "What U Hear" ||
Bass.BASS_RecordGetInputName(inputSource) == "Stereo Mix")
{
break;
}
inputSource++;
}
Bass.BASS_RecordSetInput(inputSource, BASSInput.BASS_INPUT_ON, 0.5F)
int recChannel = Bass.BASS_RecordStart(44100, 2, BASSFlag.BASS_RECORD_PAUSE, 50, _myRecProc, IntPtr.Zero);
...
// really start recording
Bass.BASS_ChannelPlay(recChannel, false);
...
// the recording callback
private bool MyRecording(int handle, IntPtr buffer, int length, IntPtr user)
{
return true;
}
По сути, вы инициализируете BASS. Затем вы просматриваете все возможные источники входного сигнала в поисках «What U Hear» или «Stereo Mix». Название канала, представляющего собой комбинацию всех выходных сигналов динамика, варьируется от звуковой карты к звуковой карте, поэтому вам придется получить список общих имен. После того, как вы нашли подходящий канал, вы начнете запись. Метод MyRecording будет иметь буфер для анализа.
Это всего лишь один из способов сделать это с одной библиотекой. Посмотрите вокруг и посмотрите, какая библиотека предоставляет вам данные в нужном вам формате.