Linux Audio Stack & ALSA

10270 ワード

Linux Audio Stack


oss

  • OSSはUNIXの「すべてがファイル」という概念を借りた.サウンドカードを1つの/dev/dspデバイスにシミュレートし、複数のサウンドカードはdsp 0、dsp 1...
  • である.
  • 音声を再生しますか?dspデバイスを開く.中にwriteデータを入れればいいです.
  • ビットレートを設定しますか?ioctlで設定すればよい.
  • 最も簡単なインターフェースであり、最も役に立たないインターフェースでもある.アプリケーションは音声の再生を全く制御ことができないためである.
  • OSSはブロックされたインターフェースで、write後、音声再生が完了してから戻る.明らかに悪いのは、writeと次のwriteの微小な時間間隔で音が不連続になったからだ.解決策は非同期のwrite.writeが終わったらioctlでポーリングして、どれだけのデータが残っているか見てみましょう.注意、ポーリングです.ポーリングは残り1 ms足らずで再生して遊んだので、すぐにもう1つのbufferをwriteして行きます.これがOSSインタフェースの下での再生です.

  • ALSA

  • もちろんOSSという音声インタフェースは本当に簡単すぎて、彼らはALSAインタフェースを作った.ALSAはいくつか先進的で、PLLインタフェースがあります.サウンドカードにデータを送信できるほか、
  • .
  • は、データにクロック情報を付随もよい.なお、データにはクロック情報を付帯もよい.つまり、1つの時間まで正確に待ってからデータを送信するのではなく、指定した時間に1つのデータを再生することを指定することができます.あるbyteに再生する際に、次のbufferを準備して再生を継続できるようにクロック信号通知プログラムを生成することもできる.
  • それからaslaはまた1つの高級なインタフェースを提供して、libasound.so, libasound.soは、/etc/asound.conf/usr/share/alsa/alsa.conf~/.asound.confのプロファイルを読み取ることができる、各種プラグインをロードすることもできるし、プラグインはプロファイルによって構成することもできる.かなりの高級alsaは専門的なオーディオアプリケーションのために準備されていると言える.
  • OSSもALSAも、民用サウンドカードには致命的な欠点がある:彼らは混音を支持しない.OSSもALSAもサウンドカードのインタフェースにすぎない.サウンドカード自体がハードウェアのミキシングをサポートするなければ、プログラムはサウンドカードを独占するしかない.1つのプログラムしか音声が出ないことを示す.幸いalsaにはlibasoundという救済策がありますso.
  • alsaはalsaのカーネルインタフェースを直接使用するプログラミングを推奨せずlibasoundを使用する.soのインタフェースlibasoundを使用している場合.soのインタフェースは、ユーザーが「dmix」というプラグインを構成することができる.そしてdmixがシミュレートしたサウンドカードをデフォルトのサウンドカードとする.みんなdmixに出力して、dmixは更に複数のプログラムの音を収集して、いっしょに混音してそれからハードウェアに出力します.
  • この問題は解決したようだ.実際には解決しなかった.alsaのインタフェースに制限、dmixの実現品質はかなり悪い.まず、dmixは混音のために強制的に再サンプリング.再サンプリングは音質の劣化を招く.次に、dmixにはC/S構造がない.共有メモリのコラボレーションによりミキシングと共有サウンドカードが完了する、1つのプログラムのdmixに問題が発生し、発声中のすべてのプログラムがクラッシュする.
  • ALSAのもう一つの欠点は、複数のサウンドカードを使用することによって(BluetoothやHDMIが普及しているのでしょうか)、露呈することにもなる.つまり、出力サウンドカードを動的に切り替えることができない.私はBluetoothイヤホンを持ってから、スピーカーから直接イヤホンに音を移して再生することを望んでいます.しかしALSAの先天的な欠陥はこの機能を実現できなかった.プレーヤーはBluetoothサウンドカードを再起動する必要があります.すなわち、出力切り替えの責任は全てプレーヤに任せる.プレーヤーは実現できるが、問題はすべてのプレーヤーが実現しなければならないことだ.もう1つの問題は、ユーザが各プレーヤの下で順次調整する必要があることである.面倒くさい

  • PulseAudio

  • ALSA固有の欠陥を解決する目的で、PulseAudioがまた現れた.PulseAudioの解決策もミキシングサービスを提供している.ミキシングサービスはバックグラウンドで実行され、サウンドカードのアクセス権を独占する.他のプログラムで音声を再生するにはpulseaudioに音声データを渡す必要がある.pulseaudioによってミキシングが実行する.
  • では、再サンプリング問題はどのように解決されますか?pulseaudioは動的サンプリングレートモードを提供する.動作原理を簡単に説明する
  • Aプログラムは44100 hzの音声を再生しpulseaudio
  • に提出する
  • pulseaudioは、サウンドカードが44100 hzサンプリングレート再生をサポートすることをクエリーし、
  • を直接出力する.
  • Aプログラムは次に48000 hzの音声を再生し、pulseaudio
  • に提出する.
  • pulseaudioは、サウンドカードが48000 hzサンプリングレート再生をサポートするかどうかを問い合わせる、サポートしない場合は44100に再サンプリングして出力.サウンドカードがサポートする場合は、そのまま出力.では、今サポートしています.はい、サウンドカードを48000モードに設定して、直接出力します.
  • Aプログラムは48000の音声を再生するとともに、Bプログラムは44100の音声の再生を開始する.
  • pulseaudioは、Bプログラムの音声を48000に再サンプリングし、ミックス出力する.
  • Aプログラムは終了し、Bプログラムは44100の音声
  • を再生し続ける.
  • pulseaudioは、Bプログラムの音声を48000に再サンプリングし、ミックス出力する.
  • Bプログラムは、再生を一時停止または停止した後、44100の音声
  • を再生または継続する.
  • pulseaudioは、設定サウンドカードを44100モードとし、そのまま出力.
  • Aプログラムはまた48000音
  • を再生する.
  • pulseaudioは、Aプログラムの音声を44100に再サンプリングし、ミックス出力する.
  • ユーザーはBluetoothイヤホンに切り替える.32000 hzのサンプリングレートのみをサポートする.
  • pulseaudioは、Aプログラムの48000 hzを32000 hzに再サンプリング、Bの44100を32000 hzに再サンプリングし、混音後にBluetoothイヤホンに出力する.

  • も同様にシステムミックスであり、pulseaudioは動的サンプリングレート調整をサポートする.現在のサウンドカードがサポートするサンプリングレートと現在のプログラムが提出したデータに基づいて、内部混音のサンプリングレートを動的に修正する.不要な再サンプリングプロセス
  • を最小限に抑える.
  • ちなみにgoogleのandroidはpulseaudioを使用せず、自分でAudioFlingerを作ったが、ダイナミックサンプリング率をサポートしていないのか、それとも44100 hzまで強制的に再サンプリングするのか.

  • ALSA Project


    ALSA高度Linuxオーディオアーキテクチャ

    ALSAアーキテクチャ

  • alsa-lib
  • Control Interface(/dev/snd/controlCX)制御インタフェース:サウンドカードの登録と利用可能なデバイスの要求を管理する汎用機能
  • を提供する.
  • PCM Interface(/dev/snd/pcmCXDX)PCMインタフェース:デジタルオーディオ再生(playback)と録音(capture)を管理するインタフェース.デジタルオーディオプログラムを開発するのに最もよく使われるインタフェースです.
  • Raw MIDIインターフェース(/dev/snd/midiCXDX)Raw MIDIインターフェース:MIDI(Musical Instrument Digitalインターフェース)をサポートし、標準的な電子楽器.これらのAPIは、サウンドカード上のMIDIバスへのアクセスを提供する.この元のインタフェースはMIDIイベントに基づいて動作し,プログラマがプロトコルおよび時間処理の管理を担当する.
  • Timer Interface(/dev/snd/timer)タイマ(Timer)インタフェース:同期オーディオイベントにサウンドカード上の時間処理ハードウェアへのアクセスを提供します.
  • Sequencer Interface(/dev/snd/seq)シーケンサ(Sequencer)インタフェース
  • Mixer Interface(/dev/snd/mixerCXDX)ミキサ(Mixer)インタフェース
  • alsa-utilsよく使われるツール
  • amixer:最下位レベルで提供されるalsaインタフェースを構成できます.
  • amixer contentsは、すべての制御インタフェースおよび現在の値
  • を表示することができる.
  • amixer controlsは、すべてのインターフェース
  • をリストすることができる.
  • amixer cget ( )は、指定インタフェース値
  • を取得することができる.
  • amixer cset ( )指定インタフェース値
  • を設定することができる.
  • aplay/arecord放音および録音用アプリケーション
  • alsactl:alsa構成を保存するための
  • alsamixer:alsamixerプログラムはamixerのncursesのバージョンです.
  • aconnect、aseqnetはMIDI接続と接続ポートのリストを表示します.

  • alsa-plugins
  • alsa-tools

  • 環境構築


    kernelはmozart linux-3.0.8[speaker-master,commit id:8334430651460305 e 884496 d 9356 b 6 f 132 ebaa]ボードに基づいてSP_を使用M150_V2.0
  • Sound card support
  • [*] Advanced Linux Sound Architecture —>
  • [*] ALSA for SoC audio support —>
  • [*] ASoC support for Ingenic —>
  • jz board type select —>
  • soc 4775 codec type select (Audio support for wattle with internal codec) = Audio support for wattle with internal codec
  • [*] Support DMIC for record
  • [*] JZ audio dma clear auto dirty memor
  • [*] JZ audio dma cyclic dma with hrtimer callback mode


  • [] Open Sound System (DEPRECATED) —>


  • テスト

  • まずamixer contentsを使用してインタフェースを表示し、amixer csetで対応する値
  • を設定します.
  • aplayを使用してwavオーディオを再生し、wavフォーマット
  • のみをサポートする.
  • arecord録音
  • を使用

    ALSAミックス


    Alsa自体もミックスのplugin,dmixを提供する.アプリケーションは変更する必要はありません.dmixを構成する/etc/asoundを追加します.confプロファイルの効果は、複数のアプリケーションが同時に放音できる構造です.
     App1 App2 -------------------------------------
    Alsa-lib (dmix) User Space -------------------------------------
    Alsa Kernel Space -------------------------------------
     sound driver -------------------------------------
     Hardware

    ALSAプログラミング


    カーネルAlsaコードが変更されるとアプリケーションのコード作成に影響するALSA放音の詳細例は、mozart_sdk/sources/application/molib_src/trunk/file-manager/player/mp3_utils.cを参照してください.
        snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, 0);
        snd_pcm_hw_params_alloca(&params); //  params   
        snd_pcm_hw_params_any(handle, params);//   params
        snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED);                                 //       
        snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE);             //  16      
        snd_pcm_hw_params_set_channels(handle, params, channels);  //    ,1     ,2     
        snd_pcm_hw_params_set_rate_near(handle, params, &rate, &dir);  //  >  
        snd_pcm_hw_params(handle, params);
        while(flag){
            ...
            snd_pcm_writei (handle, Output, n);  
        }
        snd_pcm_drain(handle);
        snd_pcm_close(handle);
    

    ALSA録音の詳細例はmozart_sdk/sources/application/molib_src/trunk/utils/librecord/alsa/record.cを参照
    ALSA構成パラメータ音量の調整、静音の設定については、/mozart_sdk/sources/application/molib_src/trunk/utils/volume/volume_alsa.cを参照してください.
        char *card = "default";
        snd_ctl_t *handle = NULL;
        snd_ctl_elem_value_t *ctl_elem_value;
        snd_ctl_open(&handle, card, 0);
        snd_ctl_elem_value_malloc (&ctl_elem_value);
        snd_ctl_elem_value_set_numid (ctl_elem_value, 11);
        snd_ctl_elem_value_set_interface (ctl_elem_value, SND_CTL_ELEM_IFACE_MIXER);
        snd_ctl_elem_value_set_name (ctl_elem_value, "Digital Playback mute");
        snd_ctl_elem_value_set_integer(ctl_elem_value, 0, val);
        snd_ctl_elem_write(handle, ctl_elem_value);
        snd_ctl_close(handle);
        snd_ctl_elem_value_free (ctl_elem_value);

    リファレンス
  • ALSA project homepage
  • ALSA project - the C library reference
  • linux 3.0でのミックス再生ソリューションblog
  • システムミキシングの動的サンプリングレートblog
  • Linux音声システムblog
  • stackedit