Чтение выходного аудиосигнала системы - PullRequest
2 голосов
/ 22 июля 2011

В настоящее время я делаю компонент осциллографа для XNA и мне нужно немного помочь. Я хотел бы получить аудиоинформацию от The Audio Output Output Stream, однако мне очень трудно это сделать. Я нашел некоторые ресурсы, но ничего, что не помогает мне до конца или помогает так, как я не могу понять. Вот следующие ресурсы, которые я нашел до сих пор.

Как программно получить текущий уровень звука?

http://msdn.microsoft.com/en-us/library/ms712636

http://social.msdn.microsoft.com/Forums/en/xnagamestudioexpress/thread/6a3ea3da-849b-475d-a2a4-7cf7c27347d5

Поскольку я не в состоянии полностью понять, что делать, я смиренно обратился к вам за помощью. Большое спасибо.

Ответы [ 2 ]

5 голосов
/ 23 июля 2011

В 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 будет иметь буфер для анализа.

Это всего лишь один из способов сделать это с одной библиотекой. Посмотрите вокруг и посмотрите, какая библиотека предоставляет вам данные в нужном вам формате.

0 голосов
/ 24 июля 2011

XNA включает в себя класс MediaPlayer, который дает вам доступ к некоторым «данным визуализации» (выборка частот и их объемы).Взгляните на this для учебника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...