Я пытаюсь изучить программирование DSP, чтобы попытаться создать свои собственные гитарные эффекты, и я использую библиотеку Portaudio, чтобы это произошло. Проблема, с которой я сталкиваюсь, заключается в том, что независимо от того, что я делаю, всякий раз, когда я читаю входной буфер в обратном вызове, он пуст. Я пробовал несколько различных программ-примеров portaudio, но все они ничего не делают. Я также пробовал разные входы, от моего аудиоинтерфейса до моего внутреннего микрофона.
Basi c код обратного вызова, который я пробовал:
#define SAMPLE_RATE (44100)
#define PA_SAMPLE_TYPE paFloat32
#define FRAMES_PER_BUFFER (64)
static int paCallback( const void *inputBuffer,
void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData )
{
float *out = (float*)outputBuffer;
const float *in = (const float*)inputBuffer;
//unused variables
(void) timeInfo;
(void) statusFlags;
(void) userData;
for (int i = 0; i < FRAMES_PER_BUFFER; i+=2){
printf("%.1f ", in[i]);
}
printf("\r");
return paContinue;
}
Сначала я попытался записать входной буфер в выходной буфер, чтобы просто воспроизвести то, что он получал, затем попытался просто распечатать его, чтобы увидеть, получает ли он вообще какие-либо данные. Всегда 0,0 или -0,0.
Некоторые вещи, которые могут быть важны:
- Я использую macos Catalina.
- Пример кода для воспроизведения работал нормально, мог генерировать пилообразную волну и слышать ее.
- Я использую аудиоинтерфейс USB с двумя стереовходами и двумя стереовыходами.
- Я перепробовал все устройства, доступные на Pa_GetDeviceCount ( ) и повторение через Pa_GetDeviceInfo (i).
- Я возвращаюсь в C / C ++ после большого перерыва в любой работе разработчика, и это было с C# и JS, поэтому я ' я забыл много вещей нижнего уровня.
Мой код для инициализации потока:
PaStreamParameters getInputParameters(){
// input parameters
PaStreamParameters inPar;
inPar.device = Pa_GetDefaultInputDevice();// choose_device();
inPar.channelCount = 2; // stereo
inPar.sampleFormat = PA_SAMPLE_TYPE;
inPar.suggestedLatency = Pa_GetDeviceInfo( inPar.device )->defaultLowInputLatency;
inPar.hostApiSpecificStreamInfo = NULL;
return inPar;
}
PaError err;
printf("Initialising\n");
err = Pa_Initialize();
if( err != paNoError ) { printf( "PortAudio error: %s\n", Pa_GetErrorText( err ) ); }
printf("Getting parameters\n");
PaStreamParameters inputParameters = getInputParameters();
PaStreamParameters outputParameters = getOutputParameters();
printf("Opening stream\n");
PaStream *stream;
/* Open an audio I/O stream. */
err = Pa_OpenStream( &stream,
&inputParameters,
&outputParameters,
SAMPLE_RATE,
FRAMES_PER_BUFFER,
0, //paclipoff
paCallback,
NULL
);
if( err != paNoError ) { printf( "PortAudio error: %s\n", Pa_GetErrorText( err ) ); }
... // wait for input, close stream, etc
}
Что-то не так с моим кодом или моей настройкой, что могло бы вызвать это быть так?