2020年5月18日月曜日

[Linux] snd_pcm_wait()から先に進まない

こんにちは

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


今回は、組み込み製品の試験を長時間していると、音が鳴り終わったと同時に


フリーズしているような現象になっていました。


こちらを調査してみましたので記載します。


環境としては以下です。


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


言語: C言語

CPU: Arm Cortex-A9をコアに持つCPU

開発している環境: Ubuntu 14.04

コンパイラ: arm用gnuコンパイラ

カーネル: linux-3.10.31

音: ALSAライブラリ"libasound バージョン2.0.0"を使用


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


まず、フリーズに見えていた現象は、


実は "snd_pcm_wait()"から返ってこなかったのが原因でした。


タイムアウトの引数として-1を


指定することで、永遠にreadyになるまで待っていました。


snd_pcm_wait()を実行中にスレッドが入って処理してしまうと


タイミングによってreadyにならないケースがあるようです。


今回の対策としては、タイムアウト時間を指定することで、


フリーズ状態を避けるようにしました。

(エラーになっているのか分からないので、

syslogにsnd_pcm_state_tの状態を出力するようにしました。)


以下、サンプルです。

(動作保証は無しと致します。)


===============================================================


void test(snd_pcm_t* pcm, int timeout)

{

    int rtc;

   

    rtc= snd_pcm_wait((snd_pcm_t *)pcm, timeout);

    if(rtc!= 1)

    {// not ready

        snd_pcm_state_t state = snd_pcm_state((snd_pcm_t *)pcm);

        syslog(LOG_ERR, "status: %d \n", (int)state);

    }

}

===============================================================


今日のひとこと


暑かったり寒かったりで体調が悪くなる季節です。


筋肉トレーニングや、逆立ちなどして


体軸や外面を整えて乗り切りましょう。



0 件のコメント:

コメントを投稿