Linuxの存在下でのオーディオプログラミングOSS とALSA 、この記事がしますALSAは、関連する記述。ALSAは、そのようなミキサーとしてセットベースのコマンドラインツール、の範囲提供する(ミキサー)、オーディオファイルプレーヤ(はaplay) 、ならびに特定の音声制御のツール固有のプロパティを。
、ALSA の :APIは、以下のインターフェイスに分割されている
( 1)制御インタフェース:登録カードを管理し、既存のサウンドカードを照会する柔軟な方法を提供します。
( 2)PCMインタフェース:デジタルオーディオ再生(再生)と記録(撮影)インタフェースを管理します。
(符号変調パルス(PCM)をこれはデジタル形式でアナログ信号を使用する方法を説明する用語である。この方法は、ほとんどすべてのコンピュータのサウンドカードによって使用された ALSAによってAPIいう「オーディオ」。 )
( 3)オリジナルの MIDIインターフェース:MIDI(楽器デジタルインタフェース)、標準的な電子音楽命令セットをサポートします。APIは、カード上のMIDIバスへのアクセスを提供します。MIDIイベントで直接動作するように、元の言い訳は、プログラマは唯一のプロトコルと時間を管理する必要があります。
( 4)タイムレコーディングインターフェイス:同期イベントサウンドをサポートしているサウンドカードにタイマーへのアクセスを提供します。
( 5)シーケンサインターフェース:1つのオリジナルより MIDIインタフェースは、MIDIプログラミングと音を前進して高レベルのインターフェイスステップ。それは多くの扱うことができる MIDIプロトコルとタイマーを。
( 6)ミキサーインタフェース:制御装置に制御信号及びサウンドカードのサイズを送信します。
II。
図1は、PCMのALSAは、デジタルオーディオストリームを記述するために使用されます。ALSAオーディオ再生/録音ができることで実現したPCMを。
2、カーネル、デバイスドライバ層は、 ALSAは、アプリケーション層ながら、ALSAは、ALSA-LIB、アプリケーション限り米国により提供コールALSA-LIB API、下層のオーディオハードウェアすなわち、完全な制御を提供し、ALSAドライバを提供しました。
3、実際に(等IIS / AC97、GPIO、DMA、)は、2つの層、例えばs3c24xx-iis.c s3c24xx-ac97.c等、メインオーディオハードウェアの初期化バスに分割ALSAドライバ、もうされwm8987.c主ミキサ装置等を作成して、レジスタ読み取りと書き込みインタフェース(I2C、等)を提供するために、チップ等を駆動します。
三、 PCM紹介
(A)簡単な
図1は、に従って単純なアプリケーションを作成するALSA PCM、我々は最初のPCMデバイスのためのハンドル(ハンドル)を開き、PCMストリームの方向を指定する必要が再生です。
図2は、PCM再生とキャプチャストリームの下に、各下再生とキャプチャサブを持っています。
( 1)再生方法アナログ音声を区別することができる人間の耳を形質転換送信ユーザ空間アプリケーション、PCMデータ。
( 2)アナログ信号を取得するマイクピックアップをキャプチャし、サンプリングされ、量子化され、バックユーザスペースアプリケーションに対してPCM信号に変換します。
(B)手順
( 1)プログラムのこの部分は、を指すことができます。
リンクを参照してください:https://blog.csdn.net/orz415678659/article/details/8995163 。
どこで:
snd_cardは、サウンドカード、複数のデバイスを含む、サウンドカードの一例を示す図です。
snd_deviceは、音響機器のコンポーネントを表しています。
snd_pcmは、PCM装置の一種で、再生及び記録のためのサウンドデバイスを表します。
制御snd_controlサウンドカードを制御する装置、音響装置、手段; snd_pcm_str再生に分割し、キャプチャされたPCMストリームを表します。
snd_pcm_substream PCMサブストリーム、オーディオ再生または記録;
PCMストリーム操作セットをsnd_pcm_ops。
特定の参照リンク:
https://www.cnblogs.com/hzl6255/p/9979377.html
( 2)pcm.c手順は、以下のリンクの場合:
https://github.com/tinyalsa/tinyalsa/blob/master/src/pcm.c
1、合理的な pcm_configは良く行うことができ、低レイテンシーと消費電力を。
構造体pcm_config {
unsigned int型のチャンネル。
unsigned int型率。
unsigned int型period_size。
unsigned int型period_count。
列挙型pcm_format形式。
unsigned int型START_THRESHOLD。
unsigned int型stop_threshold。
unsigned int型silence_threshold。
int型のavail_min。
}。
( 1)単位構造を各引数は、フレーム(= 1つの*チャネルサンプルビット深さフレーム)。
period_size。たびに、送信データの長さ。値が小さいほど、小さい遅延、より高いCPU使用。
( 2)period_count。バッファゾーン期間のバッファ番号。バッファ、XRUNの少ないチャンスも大きいです。
( 3)フォーマット、データフォーマットは、サンプルのビット深さ、端末の大きさとして定義されます。
( 4)START_THRESHOLD。この値は、バッファのデータを超えた場合、ハードウェアデータ転送が開始。あまりにも多くの場合は、遅延を打診して最初から再生しても、すべてのアウトで放送音につながる短すぎる、長すぎる、小さすぎる場合、彼らは簡単にXRUNにつながる可能性があります。
(バッファゾーンがアイドル値よりも大きい場合。5)stop_thresholdは、送信ハードウェアを停止します。デフォルトでは、この数は全体のバッファが空であるバッファの合計サイズは、送信を停止します。しかし、時折、このようなCPUビジーとして、バッファスペースの原因、再起動の伝送ハードウェア(通常はこの時点でクリアな音声カトン)を閉じることなく、あなたがより良い達成することができ、再生を継続する価値、過去のデータバッファを増やします経験。
( 6)silence_thresholdをこの値は、過去のデータを再生しないように、本来、無音データバッファを充填するために使用stop_thresholdに沿ったものです。しかし、silence_sizeを設定されていない場合
(場合7)avail_min。バッファにデータを書き込む前に、この値は、pcm_mmap_write()よりも大きいスペア領域をバッファー。値が大きいほど、時間の少ないデータの数がXRUNに直面する可能性も大きく、バッファに書き込まれます。screen_offは、チャンスXRUNを減らすためにscreen_onで値を下げる際にAndroidのサムスンマグロ装置は、消費電力を低減するために値を増やします。
別のシナリオでは、パラメータがバランスすることができる合理的なパフォーマンス、レイテンシ、電力消費の間です。
( 8)構造体のPCM pcm_open(unsigned int型カード、unsigned int型装置、unsinged INTフラグ、構造体pcm_configの設定)。
図2は、からすべての操作がハンドルによって行われた後、あなたは、このインターフェイスをpcm_open見ることができ、それは、いくつかのパラメータによってハンドルを取得します。パラメータの順序は、内部、カードは最初のいくつかのサウンドカードを表し、装置は、上述したデバイスインデックスであり、それは関連するドライバDAIリンクで構成され、flagsパラメータは、このタイプのデバイスは、キャプチャまたは再生タイプであることを示すであろう。三つのパラメータによって、対応するPCMデバイスファイルを見つけることができます。
3、PCMデバイスは、それぞれが複数のサブを持って、再生/録音二つの流れがあります。サブは一つだけのプロセスによって占められます。どの snd_pcm_substream できるオーディオ再生や録音を実現。次のように:
構造体snd_pcm_substream {
構造体snd_pcmの*のPCM。
構造体snd_pcm_str * PSTR。
void *型PRIVATE_DATA。/ * pcm-> PRIVATE_DATA * /からコピーされた
int型の数。
文字名[32]。/ *サブ名* /
int型のストリーム。/ *ストリーム(方向)* / / *录制/播放* /
構造体pm_qos_request latency_pm_qos_req。/ * pm_qosは、* /リクエスト
size_tのbuffer_bytes_maxを。/ *制限リングバッファサイズ* /
構造体snd_dma_buffer dma_buffer。
unsigned int型dma_buf_id。
size_tのdma_max;
/ * -ハードウェア動作- * /
constの構造体snd_pcm_ops * OPS。
/ * -ランタイム情報- * /
構造体snd_pcm_runtime *ランタイム。
/ * -タイマ部- * /
構造体snd_timer *タイマー。/ *タイマー* /
timer_running符号なし:. 1; / *時間稼働している* /
/ * -次のサブある- * /
構造体*次snd_pcm_substream;
/ * -リンクされたサブ- * /
ストラクトLIST_HEADのlink_list; / *リストのメンバーは、リンクされた* /
構造体snd_pcm_groupは、 self_group; / *非サブのための偽のグループがリンクされている(サブはインサイドロックであると)* /
構造体*グループsnd_pcm_group、現在のグループ* /に/ *ポインタ
/ * -割り当てられたファイル- * /
void *型ファイル; / *ポイントpcm_file * /
INT ref_count; / * O_APPENDを開くときに参照カウントが便利です* /
atomic_t mmap_count; / * mmapの参照カウント* /
unsigned int型f_flags; / * PCMオープンファイルマーク* /
無効(* pcm_release)(構造体snd_pcm_substream *)。
構造体PID * PID;場合/ *ここで、複数のサブストリームを選択するために使用されるプロセスのPID、* /使用
/ *その他フラグ* /
unsigned int型hw_opened:1; / *開いている場合、()* /閉じるを呼び出すサブリリースしたとき
};
第四に、コメントを追加しました:
ALSA 駆動型デバイスファイルができるのLinux システム、の/ dev / sndの ビューで。
前記 c0d0は音を表す0 デバイス0を、pcmC0D0c 最後のC の代表キャプチャ、pcmC0D0p 最後のp 代表再生。
controlC0 :音声制御のため、そのようなチャンネル選択など、マイク制御を混合します。
midiC0D0 :再生するために使用され、MIDI、オーディオを。
pcmC0D0c : PCM機器を記録します。
pcmC0D0p :再生用のPCM機器。
SEQ :シーケンサー。
タイマー:タイマー。