让 RtAudio 使用 jack 进行音频采集

Making RtAudio use jack for audio capture

我正尝试在 Linux 中使用 RtAudio。首先,我在启用 jack 的情况下编译它:

$ ./configure --with-alsa --with-jack
$ make
$ make install

然后我找了一个小例子来测试RtAudio:

#include "RtAudio.h"
#include <iostream>
#include <cstdlib>
#include <cstring>

int record( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames,
            double streamTime, RtAudioStreamStatus status, void *userData )
{
    if ( status )
        std::cout << "Stream overflow detected! size:" << nBufferFrames << std::endl;
    // Do something with the data in the "inputBuffer" buffer.
    return 0;
}

int main( int argc, char* argv[] )
{
    RtAudio adc;
    if ( adc.getDeviceCount() < 1 ) {
        std::cout << "\nNo audio devices found!\n";
        exit( 1 );
    }
    adc.showWarnings( true );

    RtAudio::StreamParameters parameters;
    parameters.deviceId = adc.getDefaultInputDevice();
    parameters.nChannels = 2;
    parameters.firstChannel = 0;
    unsigned int sampleRate = 44100;
    unsigned int bufferFrames = 256; // 256 sample frames
    try {
        adc.openStream( NULL, &parameters, RTAUDIO_SINT16,
                        sampleRate, &bufferFrames, &record );
        adc.startStream();
    }
    catch ( RtAudioError& e ) {
        e.printMessage();
        if ( adc.isStreamOpen() ) adc.closeStream();
        exit( 1 );
    }

    char input;
    std::cout << "\nRecording ... press <enter> to quit.\n";
    try {
        // Stop the stream
        adc.stopStream();
    }
    catch (RtAudioError& e) {
        e.printMessage();
        if ( adc.isStreamOpen() ) adc.closeStream();
    }
    return 0;
}

这个例子没有做任何特别的事情。它只会尝试录制一些音频,甚至不会等待它捕获任何内容,它会立即退出。这是我第一次 运行 这段代码,它 运行 没有任何错误就退出了。但是第二次,会报错:

$ ./test 

RtApiAlsa::getDeviceInfo: snd_pcm_open error for device (hw:0,3), Device or resource busy.


RtApiAlsa::getDeviceInfo: snd_pcm_open error for device (hw:2,0), Device or resource busy.


Recording ... press <enter> to quit.

如果我想摆脱这个错误,我必须重新启动机器。

我必须承认,有时,它会在重新启动后再次运行。但在大多数情况下,它会出错。正如我一直试图了解问题所在,似乎可以使用 Linux jack 来确保没有软件会占用音频资源并且多个进程可以使用音频同时资源。如果是这样的话,考虑到我已经在启用 jack 的情况下编译了 RtAudio,为什么我仍然面临这个错误,我该如何解决它?

顺便说一句,即使我的代码遇到此错误,arecord 也可以毫无问题地录制声音。

对于可能遇到同样问题的任何其他人,以下是我解决问题的方法:

$ ./configure --with-alsa --with-jack --with-pulse
$ make
$ make install