我下载了ALSA示例源代码(https://gist.github.com/ghedo/963382)并在油灰窗下试运行,效果良好。然而,当放入启动脚本(例如rc.local(时;sudo";,它坠毁了。
注意:应用程序只有在开机自动运行后才会崩溃;如果在putty(命令行(中运行脚本,没有问题。
在每次snd_xxx函数调用之前添加日志记录后,发现应用程序在调用snd_pcm_hw_params_any后停止,这意味着它在snd_pcc_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. %sn", 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满";检查,结果是:
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";不是直接从应用程序调用的。
我想知道在腻子中运行和在开机脚本中运行之间有什么区别,以及如何解决这个故障。如果你能提供建议,不胜感激。。。
对snd_pcm_open()
open的调用失败。由于pcm
未签名,因此错误代码检查失败。snd_pcm_hw_params_any()
然后崩溃,因为pcm_handle
为NULL。
那个代码中还有很多其他错误。忘掉它吧。使用类似的东西:
#include <stdio.h>
#include <stdlib.h>
#include <alsa/asoundlib.h>
static void alsa_check(int result, const char *call)
{
if (result < 0) {
fprintf(stderr, "%s failed: %sn", call, snd_strerror(result));
exit(1);
}
}
#define CHECK(f) alsa_check(f, #f)
static void play(snd_pcm_t *pcm, int frame_size)
{
#define FRAMES 50000
void *buf, *data;
int frames, rest;
buf = malloc(FRAMES * frame_size);
for (;;) {
frames = fread(buf, frame_size, FRAMES, stdin);
if (frames <= 0)
break;
rest = frames;
data = buf;
while (rest > 0) {
frames = snd_pcm_writei(pcm, data, rest);
if (frames < 0)
CHECK(snd_pcm_recover(pcm, frames, 0));
else {
rest -= frames;
data += frames * frame_size;
}
}
}
free(buf);
}
int main(int argc, char *argv[])
{
const char *device = "default";
snd_pcm_format_t format = SND_PCM_FORMAT_S16_LE;
snd_pcm_access_t access = SND_PCM_ACCESS_RW_INTERLEAVED;
unsigned int channels, rate;
unsigned int latency = 500000; /* 0.5 s */
snd_pcm_t *pcm;
if (argc != 3) {
fprintf(stderr, "Usage: %s rate channels < inputfilen", argv[0]);
return 1;
}
rate = atoi(argv[1]);
channels = atoi(argv[2]);
CHECK(snd_pcm_open(&pcm, device, SND_PCM_STREAM_PLAYBACK, 0));
CHECK(snd_pcm_set_params(pcm, format, access, channels, rate, 1, latency));
play(pcm, channels * snd_pcm_format_physical_width(format));
CHECK(snd_pcm_drain(pcm));
snd_pcm_close(pcm);
return 0;
}