2010-12-17 9 views
2

開閉PCM私はありませんプログラムを持って、次のALSA:オンザフライ

  1. snd_pcm_open()
  2. は、サウンドを再生するためにサンプルを送り機能をデフォルトPCMを開きます
  3. snd_pcm_close()機能でPCMを閉じ

プログラムは、定期的に任意のサウンドは、それが再要求し再生されますオープンが失敗し、 "Device or resource busy"エラーが返されることがあります。これは通常、多くのサウンドファイルがある場合に発生します。ただし、クローズコールは常に成功します。私は、クローズが成功した場合、PCMが他の誰かがすぐに利用できるようになると考えています。私は、音を使ってシステム上に他に何もないことを付け加えるべきです。

終了後にALSAがまだ一部のリソースをクリーンアップする必要がありますか? PCMインターフェイスは頻繁に開閉するように設計されていませんか?インターネット上のほとんどの例は、起動時にPCMストリームを開き、シャットダウン時にPCMストリームを閉じます。

答えて

1

これを頻繁に閉じたり開いたりしないでください。あなたは一度だけ

snd_pcm_open()snd_pcm_close()を使用します(起動して、アプリケーションの終了)、あなたのストリームをリセットしたいときにこれを使用することもできます。

snd_pcm_drop() 

snd_pcm_prepare() 

通常、このshouldn」 dmixは複数のストリームを扱うことができるため、まったく問題になりません。しかし、直接hw:0アクセスを使用している場合、close()ステップは何らかの方法で非同期である可能性があり、即時のopen()がうまく動作しない可能性があります。

+0

DAPMコアでSND_SOC_DAPM_PRE_PMDウィジェットイベントを生成できる唯一の方法は、pcmを閉じることです(私の動機は節電です)。 alsa-libでこれを引き起こす別の方法がありますか? – waffleman

+1

@Maister:ストリームでのサンプリングレートの変化をどうやって管理できますか?例えば、私は44.1KHzと48KHzのサンプリングレートのPCMの2つのストリームを持っており、私はこのオーディオを出力したい(つまり、ある時間44.1とある時間48)。私は、この切り替えの間にAlsaを閉じて開いておく必要があると思います。それには他の方法がありますか? – jjb

関連する問題