パルスオーディオ出力を取得するには?

パルスオーディオ出力を取得するには?

最初のオーディオプロジェクトを作りたいです。 OpenGLを使って可視化ツールを作成したいと思います。私を信じてください。私はビジュアライゼーションツールで見栄えの良いユニークなデザインをたくさん作りました。

私はpulseaudioの出力を取得してFFTを実行し、それに基づいてパターンを描きたいと思います。しかし、最初のポイントは、パルスオーディオ出力を取得する方法を理解していません。

simplescreenrecorderやcli-visualizerprogrammerなどのプログラムは、完全に機能する2つの例です。

パルスオーディオの生出力をFFTする方法を提案できる人はいますか?

答え1

私が書いたDecterの答えに基づいて小さなプログラム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;
    }
}

内部にコールバックを読むデータはで確認できますpa_stream_peek()。ぜひ参考にしてくださいpa_stream_peek() ドキュメントpa_stream_drop()覗いてから行く時!

プログラミング中に発見したPulseAudio API ドキュメント非常に便利でよく書かれています。

答え2

Pulseaudio出力を「雑誌」しません。

pavucontroloutputタップパワーレベルメーターと同じことを行います。.monitor受信機の入力に接続し、ここからサウンドデータを読み、目的の方法で視覚化します。必要に応じてシンクを処理します。

ソースコードはpavucontrol始めるのに十分です。

関連情報