0
如果ALSA混合器未正確通過用戶碰撞與 alsa_get_unmute_volume配置:斷言`ELEM」失敗防止崩潰,如果斷言失敗(ALSA配置不正確)
static const char alsa_core_devnames[] = "default";
static char *card, *channel;
static int muted = 0;
static int mutecount = 0;
static snd_mixer_t *handle = NULL;
static snd_mixer_elem_t *elem = NULL;
static long alsa_min, alsa_max, alsa_vol;
static int alsa_get_unmute_volume(void)
{
long val;
assert(elem);
if (snd_mixer_selem_is_playback_mono(elem)) {
snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_MONO, &val);
return val;
} else {
int c, n = 0;
long sum = 0;
for (c = 0; c <= SND_MIXER_SCHN_LAST; c++) {
if (snd_mixer_selem_has_playback_channel(elem, c)) {
snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_FRONT_LEFT, &val);
sum += val;
n++;
}
}
if (! n) {
return 0;
}
val = sum/n;
sum = (long)((double)(alsa_vol * (alsa_max - alsa_min))/100. + 0.5);
if (sum != val) {
alsa_vol = (long)(((val * 100.)/(alsa_max - alsa_min)) + 0.5);
}
return alsa_vol;
}
}
碰撞
alsa_get_unmute_volume: Assertion `elem' failed. Aborted (core dumped)
有可能在代碼中防止這種情況?
我認爲這個問題就在這裏。當用戶手動設置,在gtkentry中,設備和通道的值錯誤,例如/ dev/mixer:line,然後按回車,程序崩潰
設置混頻器設備和通道的代碼(正確的值,例如:hw: 0 /線,默認/ CD,......)是這樣的:
static int alsa_set_device(const char *devname)
{
int i;
if (card) free(card);
card = strdup(devname);
if(!card) return -1;
i = strcspn(card, "/");
if(i == strlen(card)) {
channel = "Line";
} else {
card[i] = 0;
channel = card + i + 1;
}
alsa_open_mixer();
if (!handle) {
fprintf(stderr, "mixer: Can't open mixer %s, "
"mixer volume and mute unavailable.\n", card);
return -1;
}
return 0;
}
感謝
你可以用-DNDEBUG構建來禁用斷言...但是如果elem在這裏是NULL,我不會期望你發佈的代碼做任何明智的事情。 – FatalError