0

ALSA を使用して Debian を実行しており、オーディオ入力ラインからオーディオ サンプルを抽出する必要があります。これらのサンプルでバッファを埋めることができるようにしたいので、サンプルが来たら操作を実行します。

ALSA 呼び出しを直接調べてみましたが、多くのリソースがかなり古いため、減価償却された機能の問題に直面しています。

この問題に関する方向性に関して、何か良い参考文献やアドバイスはありますか?

4

2 に答える 2

1

http://jackaudio.org/をご覧ください

ウィキペディアによると:

JACK Audio Connection Kit (または JACK) は、その API を実装するアプリケーション間で、オーディオ データと MIDI データの両方にリアルタイムで低遅延の接続を提供するプロフェッショナル サウンド サーバー デーモンです。JACK は再帰的な頭字語です。JACK は、Paul Davis (この作品で 2004 年にオープン ソース アワードを受賞) が率いるオープン ソース開発者のコ​​ミュニティによって開発されており [3]、インフラストラクチャの重要な部分であり、Linux 上のプロフェッショナル オーディオ ソフトウェアのデファクト スタンダードとなっています。サーバーはフリー ソフトウェアであり、GNU GPL の下でライセンスされていますが、ライブラリはより寛容な GNU LGPL の下でライセンスされています。

于 2013-04-12T00:58:38.033 に答える
1

次のような最新の例を使用します。

#include <alsa/asoundlib.h>

static char *device = "default"; /* capture device */

unsigned short buffer[2 * 24000];

int main(void)
{
    int err;
    snd_pcm_t *handle;
    snd_pcm_sframes_t frames;

    if ((err = snd_pcm_open(&handle, device, SND_PCM_STREAM_CAPTURE, 0)) < 0) {
        printf("open error: %s\n", snd_strerror(err));
        exit(EXIT_FAILURE);
    }
    if ((err = snd_pcm_set_params(handle,
                                  SND_PCM_FORMAT_S16,
                                  SND_PCM_ACCESS_RW_INTERLEAVED,
                                  2,
                                  48000,
                                  1,
                                  500000)) < 0) { /* 0.5 sec */
        printf(" open error: %s\n", snd_strerror(err));
        exit(EXIT_FAILURE);
    }

    for (;;) {
        frames = snd_pcm_readi(handle, buffer, 24000);
        if (frames < 0)
            frames = snd_pcm_recover(handle, frames, 0);
        if (frames < 0) {
            printf("snd_pcm_readi failed: %s\n", snd_strerror(err));
            break;
        }

        // ...
    }

    snd_pcm_close(handle);
    return 0;
}
于 2013-04-12T06:43:29.063 に答える