Предотвращение сбоя в случае сбоя утверждения (alsa настроена неправильно)

если микшер alsa настроен неправильно из-за сбоя пользователя с alsa_get_unmute_volume: утверждение `elem' не удалось

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/Line, default/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;
}

Спасибо


person user1840007    schedule 07.02.2013    source источник
comment
Вы можете построить с -DNDEBUG, чтобы отключить утверждения... но если elem здесь NULL, я бы не ожидал, что код, который вы разместили, сделает что-то разумное.   -  person FatalError    schedule 07.02.2013


Ответы (1)


Вам придется перекомпилировать ALSA, чтобы отключить утверждения. Когда вы определили NDEBUG, утверждения отключены.

Обратите внимание, что если утверждение не удалось, даже если вы отключите утверждения, вероятно, ваша программа рухнет или получит нежелательное поведение.

Утверждение — это то, что всегда должно быть истинным, если оно ложно, то кто-то где-то ошибся.

person André Puel    schedule 07.02.2013