在高级别,我的目标是从一个流中获取麦克风输入,对其进行一些处理,然后将其复制到麦克风输入到另一个流。由于后者是我的默认设备,我的其他应用程序(出于我手中的原因,无法指定任何其他设备)可以从默认设备录制并仍然可以获得处理输入。
这是我的代码片段:
int stream1_callback(const void *card_capture, void *card_playback, unsigned long frameCount, const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, void *userData) {
main_t *data = (main_t *) userData;
// UNUSED(card_capture);
UNUSED(card_playback);
UNUSED(frameCount);
UNUSED(timeInfo);
UNUSED(statusFlags);
// UNUSED(userData);
deinterleave_i16_i16(card_capture, data->mic_unprocessed, NUM_MICS, BLOCKSIZE_48KHZ);
printf("De-interleaved!\n");
process_microphones(data->mic_unprocessed, data->mic_processed);
printf("Processed!\n");
return 0;
}
int stream2_callback(const void *inputBuffer, void *outputBuffer, unsigned long frameCount, const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, void *userData) {
main_t *data = (main_t *) userData;
// UNUSED(inputBuffer);
UNUSED(outputBuffer);
UNUSED(frameCount);
UNUSED(timeInfo);
UNUSED(statusFlags);
// UNUSED(userData);
interleave_i16_i16(data->mic_processed, (int16 *)inputBuffer, 1, BLOCKSIZE_16KHZ);
printf("Interleaved!\n");
return 0;
}
int main() {
// ...
/* -- setup stream1 -- */
err = Pa_OpenStream(&stream1, &stream1InputParams, NULL, 48000, BLOCKSIZE_48KHZ, paNoFlag, stream1_callback, &main_data);
if (err != paNoError) {
goto error;
}
/* -- setup stream2 -- */
err = Pa_OpenDefaultStream(&stream2, 1, 0, paInt16, 16000, BLOCKSIZE_16KHZ, stream2_callback, &main_data);
if (err != paNoError) {
goto error;
}
//...
}
所以我想知道回调的输入缓冲区是否实际可写。或者,如果有其他(更好)的方式,我可以写入另一个设备的输入。
答案 0 :(得分:2)
通常,捕获设备无法写入;他们直接进入硬件。
为了能够将您自己的样本数据注入捕获设备,必须编写其驱动程序以允许该数据。环回驱动程序snd-aloop
就是这种情况。