こんにちは
ソフトな道をほのぼのと今日も歩きます。
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 件のコメント:
コメントを投稿