2016-02-25 3 views
0

Я основываю свой код на примере Portaudio paex_record_file.c. Одним из параметров в обратном вызове является inputBuffer, и я хотел использовать его данные для вычисления других чисел с использованием типа double/float. Я изменил файл с .raw на .txt, но блокнот все еще не может его прочитать, что заставило меня поверить, что его данные на самом деле не закодированы как число. Как хранятся данные в inputBuffer и как я могу выполнять арифметику с ним (добавлять, умножать, делить и т. Д.)?Интерпретация значения InputBuffer в обратном вызове

Это, как я инициализируется inputParameters:

inputParameters.device = Pa_GetDefaultInputDevice(); /* default input device */ 
if (inputParameters.device == paNoDevice) { 
    fprintf(stderr,"Error: No default input device.\n"); 
    goto error; 
} 
inputParameters.channelCount = 2;     /* stereo input */ 
inputParameters.sampleFormat = paFloat32; 
inputParameters.suggestedLatency = Pa_GetDeviceInfo(inputParameters.device)->defaultLowInputLatency; 
inputParameters.hostApiSpecificStreamInfo = NULL; 

Этот вопрос несколько связан с print floats from audio input callback function (без ответа).

ответ

1

Параметр inputBuffer обратного вызова - это void*. Фактический тип базового буфера зависит от параметров и флагов, которые вы передаете Pa_OpenStream.

Если вы указали paFloat32, то там будет float*. Однако возможны два варианта:

  1. Interleaved:inputParameters.sampleFormat = paFloat32;
  2. Non-Interleaved:inputParameters.sampleFormat = paFloat32|paNonInterleaved;

вы указали перемежаемое вариант. В этом случае inputBuffer указывает на один буфер перемеженных поплавков. Таким образом, вы можете написать:

float *samples = (float*)inputBuffer; 

В потоке samples в два канала будет содержать перемежаемые левые и правые образцы, например:

samples[0]; // first left sample 
samples[1]; // first right sample 
samples[2]; // second left sample 
samples[3]; // second right sample 
// etc. 

Для полноты: Если это было не чередование потока затем inputBuffer указывает на массив указателей на одноканальные буферы. Для извлечения указателей буфера можно было бы написать что-то вроде:

float *left = ((float **) inputBuffer)[0]; 
float *right = ((float **) inputBuffer)[1]; 

Обратите внимание, что во всех случаях framesPerBuffer отсчетов кадры не образцы. Кадр включает в себя один образец из каждого канала. Например, в стереопотоке кадр включает в себя как левый, так и правый каналы.

+0

Большое вам спасибо! – himty

Смежные вопросы