
ALSAサンプルソースコードをダウンロードしました(https://gist.github.com/ghedo/963382) を実行し、PuTTY ウィンドウで実行テストを行うと、動作します。ただし、"sudo" の有無にかかわらず、起動スクリプト (例: rc.local) に配置すると、クラッシュします。
注: アプリケーションは、電源投入後の自動実行後にのみクラッシュします。スクリプトを putty (コマンド ライン) で実行すると、問題はありません。
各 snd_xxx 関数呼び出しの前にログを追加した後、snd_pcm_hw_params_any の呼び出し後にアプリケーションが停止することがわかりました。つまり、snd_pcm_open と snd_pcm_hw_params_alloca の後にクラッシュします。以下はコードです。
g_pLog->LogInfo(LOG_SYS, "[audio]snd_pcm_open"); /////logged
if ((pcm = snd_pcm_open(&pcm_handle, acDev, /////PCM_DEVICE, acDev="default:0"
SND_PCM_STREAM_PLAYBACK, 0)) < 0)
{
sprintf(acLog, "[audio]Can't open \"%s\" PCM device. %s\n", acDev, snd_strerror(pcm));
g_pLog->LogInfo(LOG_SYS, acLog);
return -1;
}
g_pLog->LogInfo(LOG_SYS, "[audio]snd_pcm_hw_params_alloca"); /////logged
/* Allocate parameters object and fill it with default values*/
snd_pcm_hw_params_alloca(¶ms);
g_pLog->LogInfo(LOG_SYS, "[audio]snd_pcm_hw_params_any"); /////logged and is the last line
snd_pcm_hw_params_any(pcm_handle, params);
g_pLog->LogInfo(LOG_SYS, "[audio]snd_pcm_hw_params_set_access");
/* Set parameters */
if (pcm = snd_pcm_hw_params_set_access(pcm_handle, params,
SND_PCM_ACCESS_RW_INTERLEAVED) < 0)
...
コア ダンプ ファイルを収集し、gdb "bt full" を使用して確認すると、結果は次のようになります。
root@linaro-ubuntu-desktop:/test# gdb ./AudioPlayer /opt/core.AudioPlayer.6277.1604311455.6
GNU gdb (Ubuntu/Linaro 7.3-0ubuntu2) 7.3-2011.08
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "arm-linux-gnueabi".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /test/AudioPlayer...(no debugging symbols found)...done.
[New LWP 6277]
[Thread debugging using libthread_db enabled]
Core was generated by `/test/AudioPlayer'.
Program terminated with signal 6, Aborted.
#0 0x2ad8bed6 in ?? () from /lib/arm-linux-gnueabi/libc.so.6
(gdb) bt full
#0 0x2ad8bed6 in ?? () from /lib/arm-linux-gnueabi/libc.so.6
No symbol table info available.
#1 0x2ad9a0da in raise () from /lib/arm-linux-gnueabi/libc.so.6
No symbol table info available.
#2 0x2ad9c506 in abort () from /lib/arm-linux-gnueabi/libc.so.6
No symbol table info available.
#3 0x2ad951ec in __assert_fail () from /lib/arm-linux-gnueabi/libc.so.6
No symbol table info available.
#4 0x2ac6cb72 in snd_pcm_hw_refine () from /usr/lib/arm-linux-gnueabi/libasound.so.2
No symbol table info available.
#5 0x0000aca8 in main ()
No symbol table info available.
注意: 「snd_pcm_hw_refine」はアプリケーションから直接呼び出されません。
Putty で実行する場合と電源投入時の起動スクリプトから実行する場合の違いと、この障害を解決する方法を知りたいです。アドバイスをいただければ幸いです...