【オーディオアプリケーション】Linux ALSAオーディオアプリケーションプログラミング

上: [オーディオ ドライバー] Linux ALSA サウンド カード、WAV ファイル関連の概念

Linux 用 ALSA オーディオ アプリケーション プログラミング

alsa-libs と alsa-utils を使用して .wav 形式ファイルの再生と録音を実現し、Linux のサウンド カードのアプリケーション層デバイス ノードを理解します。alsa-libs を使用したアプリケーション プログラミングの手順を紹介します。

1. ALSA アーキテクチャ

Advanced Linux Sound Architecture (ALSA) は、Linux オペレーティング システムにオーディオおよび MIDI 機能を提供します。

ALSA には次のような顕著な機能があります。

  • コンシューマー向けサウンドカードからプロフェッショナル向けマルチチャンネルオーディオインターフェースまで、あらゆるタイプのオーディオインターフェースを効率的にサポートします。

  • 完全にモジュール化されたサウンドドライバー。

  • SMP およびスレッドセーフ設計。

  • アプリケーション プログラミングを簡素化し、高度な機能を提供するユーザー空間ライブラリ (alsa-lib)。

  • 古い Open Sound System (OSS) API のサポートにより、ほとんどの OSS プログラムにバイナリ互換性が提供されます。

ALSA システムには 7 つのサブプロジェクトが含まれています。

  • ドライバーパッケージ alsa-driver

  • 開発パッケージ alsa-libs

  • 開発パッケージプラグイン alsa-libplugins

  • 管理ツールパッケージ alsa-utils を設定します。

  • OSS インターフェイスは、シミュレーション レイヤー ツール alsa-oss と互換性があります。

  • 特別なオーディオ ファームウェア サポート パッケージ alsa-finnware

  • その他のサウンド関連の小型パッケージ alsa-tools

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-tVm5tcyU-1682084270719)(image/Linux ALSA サウンド カード アプリケーション ドライバー/1681615020116.png) ]

alsa-libs は、Linux アプリケーション層の C 言語関数ライブラリのセットであり、オーディオ アプリケーション開発のための統一された標準インターフェイスのセットを提供します
。アプリケーション プログラムは、この API セットを呼び出すだけで、基礎となるアプリケーションの制御を完了できます。サウンドカードデバイス。

2、alsa-libs の移植

まず、ALSA の公式 Web サイトの公式 Web サイト http://www.alsa-project.org から alsa-lib と alsa-utils をダウンロードする必要があります。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-K9o1Fqhz-1682084270721)(image/Linux ALSA サウンド カード アプリケーション ドライバー/1681615443264.png) ]

具体的な手順の参照:

alsa-lib および alsa-utils の移植_alsa-utils ライブラリの移植

3、ALSA デバイスのファイル構造

/dev/snd


Linux カーネル デバイス ドライバー層に登録され、ALSA オーディオ ドライバー フレームワークに基づいたサウンド デバイスは、対応するデバイス ノード ファイルを/dev/snd ディレクトリに生成します。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-BWnihaaV-1682084270721)(image/Linux ALSA サウンド カード アプリケーション ドライバー/1681616247600.png) 】

次のデバイス ファイルが表示されます。

  • controlC0: チャンネル選択、ミキシング、マイク制御などのサウンドカード制御に使用されます。
  • midiC0D0 : MIDI オーディオの再生用
  • pcmC0D0c : 録音用のpcmデバイス
  • pcmC0D0p : 再生用のpcmデバイス
  • pcmC0D1p : 再生用のpcmデバイス
  • seq : シーケンサー
  • タイマー: タイマー

C0D0 はサウンド カード 0 のデバイス 0 を表し、pcmC0D0c の最後の c はキャプチャを表し、pcmC0D0p の最後の p は
再生を表し、これらは alsa-driver の命名規則です。上のリストからわかるように、サウンド カードには 7 つのデバイスが接続されています。サウンド カードの実際の機能に応じて、ドライバーは実際にはさらに多くの種類のデバイスを接続できます。include/sound/core.h では、次のようになります。デバイスは定義されたタイプです

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-bQ2NTLKT-1682084270722)(image/Linux ALSA サウンド カード アプリケーション ドライバー/1681616672104.png) 】

通常、私たちは pcm と control の 2 つのデバイスにもっと関心を持ちます。

/proc/asound

Linux システムの /proc/asound ディレクトリには、システム内のサウンド カードに関連する情報を記録する多くのファイルがあります。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-zP8ZdmXX-1682084270723)(image/Linux ALSA サウンド カード アプリケーション ドライバー/1681617091453.png) 】

  • カード : カード ファイルの内容を表示します。システム内で使用可能および登録されているサウンド カードを一覧表示できます。

  • devices : システム内のすべてのサウンド カード登録デバイスをリストします。

  • pcm : システム内のすべての PCM デバイスをリストします。

  • timers : タイマーデバイスの選択

  • バージョン : ALSA ドライバーのバージョン

  • Card0: サウンド カードの名前やサウンド カードに登録されている PCM デバイスなど、サウンド カード 0 に関連する情報を記録します。

4、alsa-utils テストツール

Alsa-utils テストツール

  • 申し込み

  • レコード

  • アルサミキサー

  • ミキサー

  • アルサクト

  • アルサループ

aplay
aplay はオーディオ再生機能をテストするためのプログラムで、aplay を使用して wav 形式のオーディオ ファイルを再生できます。

一般的なコマンド:

aplay xxx.wav 

レコード

arecordツールは録音テストを行うためのアプリケーションです。

一般的なコマンド:

arecord -r 20000 -f S16_LE -c 1 -d 10 -D hw:0,1 6.wav

-r はサンプリング周波数 (最小 8000) を示します。

-f はサンプリング形式を示します。ここでは 16 ビット リトル エンディアン (通常は S16_LE、S32_LE) を指します。

-c はチャネル数 (1 または 2) を示します。

-d は録音時間を示します。

-D は、使用する録音デバイスを示します (hw:0,1: hw プラグイン、最初のパラメーターはサウンド カード番号を示し、2 番目のパラメーターはデバイス番号を示します)。

サンプリング周波数が高いほど、サウンドはよりクリアになり、.wav ファイルのサイズは大きくなります。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-HplWZx9E-1682084270724)(image/Linux ALSA サウンド カード アプリケーション ドライバー/1682049469753.png) 】

アルサループ

alsaloop はループバック テスト、録音中の再生に使用されます。

一般的なコマンド:

alsaloop -C hw:0,1 -t 100

5. ALSA アプリケーションを作成する

alsa-libに基づいて書かれています

API と例は、公式 Web サイトALSA プロジェクト - C ライブラリ リファレンス: インデックス、プリアンブル、およびライセンス (alsa-project.org)を参照しています。

1. PCMデバイスの電源を入れます

int snd_pcm_open(snd_pcm_t **pcmp, const char *name, snd_pcm_stream_t stream, int mode)

2. ハードウェアパラメータを設定する

snd_pcm_hw_params_t オブジェクトをインスタンス化する

int snd_pcm_hw_params_malloc(snd_pcm_hw_params_t **ptr);

snd_pcm_hw_params_t オブジェクトの初期化

int snd_pcm_hw_params_any(snd_pcm_t *pcm, snd_pcm_hw_params_t *params);

アクセスアクセスタイプを設定する

int snd_pcm_hw_params_set_access(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_t _access);

データ形式を設定する

int snd_pcm_hw_params_set_format(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_t val);

チャンネル数を設定する

int snd_pcm_hw_params_set_channels(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val);

サンプルレートサイズを設定する

int snd_pcm_hw_params_set_rate(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir);

期間サイズを設定する

int snd_pcm_hw_params_set_period_size(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t val, int dir);

バッファサイズを設定する

int snd_pcm_hw_params_set_buffer_size(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t val);int snd_pcm_hw_params_set_periods(snd_pcm_t *pcm, snd_pcm_hw_params_t *params,unsigned int val,int dir)

ハードウェア構成パラメータのインストール/ロード

int snd_pcm_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t *params);

3. データの読み取り/書き込み

snd_pcm_sframes_t snd_pcm_writei(snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size);

snd_pcm_sframes_t snd_pcm_readi(snd_pcm_t *pcm, void *buffer, snd_pcm_uframes_t size);

4. リソースを解放する

int snd_pcm_close(snd_pcm_t *pcm);

void snd_pcm_hw_params_free(snd_pcm_hw_params_t *obj)

5. 非同期インターフェース

int snd_async_add_pcm_handler(snd_async_handler_t **handler, snd_pcm_t *pcm, 
			      snd_async_callback_t callback, void *private_data);

int snd_pcm_poll_descriptors(snd_pcm_t *pcm,struct pollfd *pfds,unsigned int space);

参考文献

時間厳守のアトミック ドキュメント
ALSA プロジェクト - C ライブラリ リファレンス: インデックス、プリアンブル、およびライセンス (alsa-project.org)

おすすめ

転載: blog.csdn.net/m0_61737429/article/details/130297466