您可以使用 PortAudio 回调来写回流的输入缓冲区吗?

Can you use a PortAudio callback to write back to a stream's input buffer?

总的来说,我的目标是从一个流中获取麦克风输入,对其进行一些处理,然后将其复制到另一个流中的麦克风输入。后者是我的默认设备,我的其他应用程序(由于我无法控制的原因,无法指定任何其他设备)可以从默认设备记录并仍然获得处理的输入。

这是我的代码片段:

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;
    }

    //...
}

所以我想知道回调的输入缓冲区是否真的可写。或者如果有其他(更好的)方法可以写入另一个设备的输入。

一般情况下,捕获设备不能写入;他们直接进入硬件。

为了能够将您自己的示例数据注入捕获设备,必须编写其驱动程序以允许这样做。这是环回驱动程序的情况,snd-aloop.