C++ Portaudio输入缓冲区始终为空
我正在学习DSP编程,尝试创建自己的吉他效果,我正在使用Portaudio库来实现这一点。我遇到的问题是,无论我做什么,每当我在回调中读取输入缓冲区时,它都是空的。我已经尝试了几种不同的portaudio示例程序,但它们都不起作用。我还尝试了不同的输入,从音频接口到内部麦克风 我尝试过的基本回调代码:C++ Portaudio输入缓冲区始终为空,c++,macos,audio,signal-processing,portaudio,C++,Macos,Audio,Signal Processing,Portaudio,我正在学习DSP编程,尝试创建自己的吉他效果,我正在使用Portaudio库来实现这一点。我遇到的问题是,无论我做什么,每当我在回调中读取输入缓冲区时,它都是空的。我已经尝试了几种不同的portaudio示例程序,但它们都不起作用。我还尝试了不同的输入,从音频接口到内部麦克风 我尝试过的基本回调代码: #define SAMPLE_RATE (44100) #define PA_SAMPLE_TYPE paFloat32 #define FRAMES_PER_BUFFE
#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;
}
我的代码或设置是否有任何问题导致出现这种情况?对我来说,这个问题似乎是通过IDE运行应用程序造成的。Catalina拥有严格的权限,并且Visual Studio代码未被授予访问(或提示访问)麦克风的权限。当我直接运行可执行文件时,它会按预期工作
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
}