簡體   English   中英

從啟動腳本運行應用程序時,ALSA snd_pcm_hw_params_any 崩潰

[英]ALSA snd_pcm_hw_params_any crashed when run the application from startup script

我下載了 ALSA 示例源代碼( https://gist.github.com/ghedo/963382 )並在 putty 窗口下測試運行,它工作正常。 然而,當放入帶有或不帶有“sudo”的啟動腳本(例如 rc.local)時,它崩潰了。

注意:應用程序只有在開機自動運行后才會崩潰; 如果在膩子(命令行)中運行腳本,沒問題。

在每次 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(&params);

    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)
...

收集core dump文件並使用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 中運行和從開機啟動腳本運行有什么區別,以及如何解決此故障。 不勝感激,如果你能建議...

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: %s\n", 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 < inputfile\n", 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM