試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

/dev/dspを使用するアプリケーションからaossを使用してALSAで音を鳴らすときの設定

GNU/Linux上で音を出すアプリケーションには、新しいALSAライブラリ経由で出すものと、古いOSS APIを使用して出すものとがある。*1
ALSAにはOSSエミュレーションモードがあり、snd-pcm-oss,snd-seq-oss,snd-mixer-ossといったカーネルモジュールが読み込まれているか、これらの機能をカーネルに組み込んでビルドして使っている場合、そのままでも音は鳴らせるし、シーケンサやミキサーもエミュレーションで使用できる。
しかし、その場合、OSS APIを使用したアプリケーションがデバイス/dev/dspを握ってしまい、そのアプリケーションが動作している間、他のアプリケーションからは音が出せなかったりする。更に、ミキサーの設定がALSA用と完全互換でなかったりなど制約もあるため、OSSサウンドAPIアプリからALSAライブラリ経由で音を出す「alsa-oss」というパッケージに含まれる、aossというコマンドを使用するとよい。
aossを使用した場合、ALSAのデフォルトのPCMデバイスは使用されず、pcm.dsp0というデバイスが使用される*2。Web上の設定例を参考に、ソフトウェアボリューム(softvol)と、多重再生をするためのdmixを通して使用するための設定を作成した。

ファイル名: ~/.asoundrc

pcm.dsp0
{
  type plug
  slave.pcm
  {
    type softvol  # ALSAのソフトウェアボリュームコントロールを使用
      # 必要に応じてdmixへの引数(CARD, DEV, SUBDEV, FORMAT, RATE)を指定
      # 「slave.pcm "dmix"」だけで不具合が無ければそれでもOK
    slave.pcm "dmix:0,0,-1,S16_LE,44100"
    control
    {
      name "PCM Playback Volume"
      card 0
    }
  }
}

ctl.mixer0
{
  type hw
  card 0
}

上の設定では、dmixで多重再生する場合、先にALSA対応プレーヤーで音声を再生していると、dmixのレートがデフォルト値(defaults.pcm.dmix.rate)=48000Hzで使用されるため、後から入るaoss経由の音声(44100Hz)は途切れ途切れになる(逆の順番の場合はALSAのプレーヤーが44100Hzに合わせて綺麗に音が出る)。これを防ぎたい場合は
ファイル名: ~/.asoundrc

defaults.pcm.dmix.rate 44100

と、dmixのデフォルトのレートを44100Hzにする設定を追加する。
なお、この設定では、予め定義されているdmixデバイス「pcm.dmix」を使用し、独自のdmixデバイスの定義はしていない(手抜きのためと、設定を短くするため)。
(2011/1/20)出力先のPCM名は環境変数ALSA_OSS_PCM_DEVICEでも指定可能で、${HOME}/.asoundrcの記述よりも優先順位が高い。まとめドキュメントも参照。

まとめドキュメント:

*1:プレーヤーなどで、どちらにも対応している場合もあるし、各種サウンドサーバを経由して音を出すようなものもある

*2:環境変数ALSA_OSS_PCM_DEVICEでPCMデバイス名は変更可能