Я застрял на проблеме с VLC и alsa-lib.
Контекст следующий:
Моя проблема заключается в следующем:
Когда при запуске моего приложения я устанавливаю громкость с помощью alsa-lib перед разветвлением и запуском VLC, VLC запускается с громкости, превышающей указанную (т. Е. Ту, которую я установил).
Если я удаляю код, изменяющий громкость из моей программы, VLC запускается с установленным глобальным системным томом (я тестировал с громкостью, установленной на 0).
Когда я запускаю VLC из консоли, я получаю то же самое поведение, оно начинается с текущего глобального тома системы.
Чтобы добавить больше точности: когда я снова установил другой том с тем же фрагментом кода в моей программе, но после того, как после запуска и запуска VLC, уровень громкости был применен правильно. Поскольку я думаю, что проблема связана с вызовом alsa-lib, я попробовал несколько функций в alsa-lib для освобождения памяти, но это не решило проблему.
Вот код, который я использую (удалите обработку ошибок, чтобы сделать его более читабельным), чтобы установить громкость с помощью alsa-lib (вдохновлено Установить основной объем ALSA из кода C):
// ALSA mixer handle
snd_mixer_t *m_handle;
snd_mixer_elem_t* m_elem;
long volume = -1000; // This volume is in the allowed range specified by "amixer"
// Open an empty mixer
snd_mixer_open(&m_handle), SND_MIXER_ELEM_SIMPLE);
snd_mixer_attach(m_handle, "hw:0");
snd_mixer_selem_register(m_handle, NULL, NULL);
// Load the mixer elements
snd_mixer_load(m_handle);
// Configure the simple element we are looking for
snd_mixer_selem_id_t *simpleElemId; // mixer simple element
snd_mixer_selem_id_alloca(&simpleElemId);
snd_mixer_selem_id_set_index(simpleElemId, 0);
snd_mixer_selem_id_set_name(simpleElemId, "PCM");
m_elem = snd_mixer_find_selem(m_handle, simpleElemId);
// Here is set the global system volume
snd_mixer_selem_set_playback_volume_all(m_elem, volume);
snd_mixer_detach(m_handle, "hw:0");
snd_mixer_close(m_handle);
Я проверяю с другой открытой консолью, что уровень громкости правильно установлен с помощью команды alsamixer. Так что я могу сказать, что громкость правильно установлена перед запуском VLC. Поэтому я не понимаю, почему у него проблемы с уровнем громкости при запуске …
Я в порядке с кодом, вызывающим alsa-lib? Я забыл освободить или удалить элемент?
Примечание 1: тот alsamixer показывает, что VLC не изменяет глобальный системный том при запуске.
Примечание 2: опция verbose (-vvv) дает ту же самую трассировку, какую бы она ни запускала из моей программы на C ++ (с проблемой громкости) или из консоли
Спасибо за вашу помощь 🙂
Эта проблема была из-за ошибки в прошивке Raspberry PI. Теперь это было решено (см. Отчет об ошибке, который я открыл: https://github.com/raspberrypi/linux/issues/570 ).
Чтобы получить последнюю прошивку, запустите команду:
sudo rpi-update
Ошибка была исправлена в версии 3.10.38+ # 675 PREEMPT Sun 27 апреля 18:15:12 BST 2014 armv6l
Надеюсь, это поможет!
Других решений пока нет …