PortAudio: Как получить запись с микрофона (получить данные) - PullRequest
4 голосов
/ 12 июля 2011

Я пытаюсь использовать portaudio (кроссплатформенность) для чтения с микрофона, затем я хочу передать эти данные через БПФ, но я не совсем уверен, как это сделать.Множество людей сказали мне: 1. получить данные, 2. применить fft, но проблема в том, что я не уверен, как получить данные, у portaudio нет большого количества руководств по захвату ввода с микрофона, если вы знаете какой-либокод, учебные пособия или любой другой ресурс, это было бы здорово полный.Я искал это некоторое время сейчас.Пожалуйста, помогите

1 Ответ

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

В дистрибутиве portaudio есть документация в виде примеров программ на C.Они находятся в каталоге test и обычно называются patest_....Там много хорошего материала, и в документах содержится обзор с очень коротким описанием ,

. Вы хотите посмотреть на patest_record, который выполняет асинхронную запись через вызов.назад.Это путь, если вы хотите сделать что-то серьезное, ИМХО.Но есть также patest_read_record.c, который выполняет синхронный (блокирующий) ввод-вывод.

Код на самом деле очень прост, вот соответствующие части (много не учтено): 1 / вы используете malloc буфер 2 /Вы устанавливаете обратный вызов 3 / в обратном вызове, вы копируете данные в свой буфер

/* 1 */ 
data.recordedSamples = (SAMPLE *) malloc( numBytes );
/* 2 */
err = Pa_OpenStream(
          &stream,
          &inputParameters,
          NULL,                  /* &outputParameters, */
          SAMPLE_RATE,
          FRAMES_PER_BUFFER,
          paClipOff,      
          recordCallback,
          &data );  
 /* 3, in recordCallBack with rptr the input data and wptr our buffer */
 for( i=0; i<framesLeft; i++ )
 {
     *wptr++ = *rptr++;  /* left */
     if( NUM_CHANNELS == 2 ) *wptr++ = *rptr++;  /* right */
 }

Опять же, это упрощается, но вы поймете идею.Существует большое количество бухгалтерии, и пример кода не самый чистый, но его легко адаптировать к вашим целям.

...