Основываясь на ответе dirkt, я написал небольшую программу , которая захватывает приемник PulseAudio по умолчанию и записывает необработанные данные PCM в файл. Предполагая, что у вас есть клиент PulseAudio, вам нужно сначала запросить информацию о сервере PA :
.
pa_context_get_server_info(ctx, &pa_server_info_cb, nullptr /*userdata*/);
Структура информации о сервере содержит имя приемника по умолчанию. Это «куда идет звук» на пути к звуковой карте. Как заявил dirkt, мы можем подключиться к sink_name.monitor
, чтобы прослушать указанный приемник.
Для этого сначала создайте новый поток, затем настройте обратные вызовы и, наконец, подключите его для записи.
void pa_server_info_cb(pa_context *ctx, const pa_server_info *info, void* /*userdata*/)
{
pa_sample_spec spec;
spec.format = PA_SAMPLE_S16LE;
spec.rate = 44100;
spec.channels = 1;
pa_stream *stream = pa_stream_new(ctx, "output monitor", &spec, nullptr);
pa_stream_set_state_callback(stream, &pa_stream_notify_cb, nullptr /*userdata*/);
pa_stream_set_read_callback(stream, &pa_stream_read_cb, nullptr /*userdata*/);
std::string monitor_name(info->default_sink_name);
monitor_name += ".monitor";
if (pa_stream_connect_record(stream, monitor_name.c_str(), nullptr, PA_STREAM_NOFLAGS) != 0) {
std::cerr << "Failed to connect for recording\n";
return;
}
}
В обратном вызове read данные доступны через pa_stream_peek()
. Обязательно обратитесь к pa _stream _peek ()docs , чтобы узнать, когда pa_stream_drop()
после просмотра!
При программировании я нашел документацию по API PulseAudio очень полезной и хорошо написанной.
Обновление :похоже на ошибку в tcsh. Я собрал последнюю версию tcsh 6.23.00 с нуля, и классы персонажей работают, как и ожидалось. Сообщено в Debian , уже исправлено в восходящем направлении по адресу https://github.com/tcsh-org/tcsh/commit/4679bde3e1ceca63d6eb4de5ce41c996405e61aa, как указано в списке рассылки