Pulseaudio C API: создайте нулевой приемник

Я пытаюсь создать 2 простые программы, которые в основном являются примерами parec-simple и pacat-simple из документация пульсаудио. Единственная разница в том, что я хотел бы создать нулевую раковину, эквивалентную

pactl load-module module-null-sink sink_name=steam 

(см. пример здесь), который я затем использовал бы вместо устройства по умолчанию на оба конца - воспроизведение и запись.

Мой вопрос: как я могу создать этот нулевой приемник с помощью C API-интерфейса pulseaudio? Из того, что я видел, pulse/simple.h не содержит никакого определения функции для этого, поэтому я думаю, что мне придется использовать libpulse.


person Copil tembel    schedule 08.05.2020    source источник
comment
Эй, Копил, ты нашел способ сделать это?   -  person Barthy    schedule 16.01.2021
comment
@Barthy: да, см. ответ ниже.   -  person Copil tembel    schedule 17.01.2021


Ответы (1)


Я не смог найти для него API pulseaudio, поэтому я просто использую интерфейс pactl напрямую.

Кому интересно, вот пример кода, который работал у меня. Я только что использовал popen для выполнения команды pactl для создания (нулевой) раковина:

static bool createNullPaSink(const std::string& sinkName, int* paHandleId) {

    // this is the command to create the null sink with some specific setup (format, channels, rate, etc.0
    std::string pacmd = "pactl load-module module-null-sink latency_msec=100 format=s16le rate=48000 channels=2 channel_map=front-left,front-right sink_properties=device.description=QM sink_name=" + sinkName;
    // execute the pactl command
    FILE* f = popen(pacmd.c_str(), "r");
    if (!f) {
        // creating the sink failed
        return false;
    }
    
    // now get the handle of the sink by reading the output of the popen command above
    std::array<char, 128> buffer;
    std::string spaHandleId;
    while (fgets(buffer.data(), 128, f) != NULL) {
        spaHandleId += buffer.data();
    }
    auto returnCode = pclose(f);
    if (returnCode) {
        return false;
    }

    *paHandleId = std::stoi(spaHandleId);
    
    return true;
}
person Copil tembel    schedule 17.01.2021