2020年2月6日木曜日

[Linux] サウンドがならない対応

こんにちは

ソフトな道をほのぼのと今日も歩きます。


Linuxにおけるアプリ開発をしています。


今回は、音が鳴らないという現象が発生しました。


ALSAを使用しての音声出力を行っています。


音ファイルはRIFF形式のものですが、


このファイルは一体どんな設定なんだろう。。


ということで調べてみたところ、以下のサイトが大変わかりやすかったです。


https://taku-o.hatenablog.jp/entry/20181120/1542726865


私が使用しているファイルをエディタでバイナリで開いてみて


リンク先内容と照らし合わせて書き出してみました。


---------------------------------------------

bits_per_sample : 16bits

num channels: 1チャネル(モノラル)

サンプリングレート: 22050

byte rate: ブロックサイズは44100

---------------------------------------------


この設定で音が鳴るはず。。と思っていたのですが、


まだ動作しませんでした。


調べてみたところ、バッファはmallocを使って行っていましたが、


これを以下のように、2バイトバス幅に設定した静的バッファに


したところ音が鳴りだしました。



static short buff[0x1000];



推測ですが、bits_per_sampleが16bitなので、アライメントがそれにあう


short型でメモリ確保しておかないとだめなのかもしれません。

そして、音が鳴るようになったところで、ターミナル(teraterm)をみたら、


なにやら、以下の表示がされていました。


“ALSA lib pcm.c:8432:(snd_pcm_recover) underrun occurred”


調べてみたところ、以下が参考になりました。


https://tutorialmore.com/questions-174806.htm


確かに、”snd_pcm_writei();”を連続して呼び出す際にウェイトを入れてあげると


上記”underrun ”は発生しなくなりました。


ウェイトを入れるのは美しくないので、それに代わる何かを探してみました。


そしてありました。



snd_pcm_set_params();のレイテンシの設定を変更してあげる。



こちらを行うことで、上記”underrun”の現象はなくなりました。


以上です。


[環境]

私の使用環境は VMware 上でUbuntu14.04を使用しています。

コンパイラ: arm-linux-gnueabihf-gcc


新型コロナウィルスが発生していますが、なんとか乗り切りましょう。


(マスクが少ないから、石鹸でよく洗って再度使うしかない状態です。


フリマの一部の人たちに買い占められて、高値を払うか、それとも死を選ぶかの


究極的選択になっていますが、私は買わないで使いまわす選択肢を選びます!


その分、武漢へ空からマスクを降らせましょう。)



0 件のコメント:

コメントを投稿