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
alsa-libs は、Linux アプリケーション層の C 言語関数ライブラリのセットであり、オーディオ アプリケーション開発のための統一された標準インターフェイスのセットを提供します
。アプリケーション プログラムは、この API セットを呼び出すだけで、基礎となるアプリケーションの制御を完了できます。サウンドカードデバイス。
2、alsa-libs の移植
まず、ALSA の公式 Web サイトの公式 Web サイト http://www.alsa-project.org から alsa-lib と alsa-utils をダウンロードする必要があります。
具体的な手順の参照:
alsa-lib および alsa-utils の移植_alsa-utils ライブラリの移植
3、ALSA デバイスのファイル構造
/dev/snd
Linux カーネル デバイス ドライバー層に登録され、ALSA オーディオ ドライバー フレームワークに基づいたサウンド デバイスは、対応するデバイス ノード ファイルを/dev/snd ディレクトリに生成します。
次のデバイス ファイルが表示されます。
- controlC0: チャンネル選択、ミキシング、マイク制御などのサウンドカード制御に使用されます。
- midiC0D0 : MIDI オーディオの再生用
- pcmC0D0c : 録音用のpcmデバイス
- pcmC0D0p : 再生用のpcmデバイス
- pcmC0D1p : 再生用のpcmデバイス
- seq : シーケンサー
- タイマー: タイマー
C0D0 はサウンド カード 0 のデバイス 0 を表し、pcmC0D0c の最後の c はキャプチャを表し、pcmC0D0p の最後の p は
再生を表し、これらは alsa-driver の命名規則です。上のリストからわかるように、サウンド カードには 7 つのデバイスが接続されています。サウンド カードの実際の機能に応じて、ドライバーは実際にはさらに多くの種類のデバイスを接続できます。include/sound/core.h では、次のようになります。デバイスは定義されたタイプです
通常、私たちは pcm と control の 2 つのデバイスにもっと関心を持ちます。
/proc/asound
Linux システムの /proc/asound ディレクトリには、システム内のサウンド カードに関連する情報を記録する多くのファイルがあります。
-
カード : カード ファイルの内容を表示します。システム内で使用可能および登録されているサウンド カードを一覧表示できます。
-
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 ファイルのサイズは大きくなります。
アルサループ
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)