
Descargué los códigos fuente de muestra de ALSA (https://gist.github.com/ghedo/963382) y pruebe la ejecución en la ventana de PuTTY, funciona. Sin embargo, cuando se coloca en el script de inicio (por ejemplo, rc.local) con o sin "sudo", falla.
Nota: La aplicación sólo falla después de la ejecución automática desde el encendido; Si ejecuta el script en PuTTY (línea de comando), no hay problema.
Después de agregar el registro antes de cada llamada a la función snd_xxx, encontré que la aplicación se detiene después de llamar a snd_pcm_hw_params_any, lo que significa que falla después de snd_pcm_open y snd_pcm_hw_params_alloca. El siguiente es el código:
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)
...
Después de recopilar el archivo de volcado del núcleo y usar gdb "bt full" para verificar, el resultado es:
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.
Tenga en cuenta que "snd_pcm_hw_refine" no se llama directamente desde la aplicación.
Me pregunto cuál es la diferencia entre ejecutar PuTTY y ejecutar desde un script de inicio, y cómo resolver este error. Agradecería si pudiera aconsejar...