Я застрял в проблеме с VLC и alsa-lib.
Контекст следующий:
- Приложение С++
- Запуск на малине PI
- Версия: VLC media player 2.0.3 Twoflower (ревизия 2.0.2-93-g77aa89e)
- Сначала в приложении я установил глобальный системный том с помощью alsa-lib (код приведен ниже).
- Разветвить процесс для запуска VLC в консоли (cvlc)
- Установите другие объемы позже
Моя проблема заключается в следующем: при запуске моего приложения, если я устанавливаю объем с помощью 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. Подробная опция (-vvv) дает одинаковую трассировку независимо от того, запущена ли она из моей программы на C++ (с проблемой громкости) или из консоли.
Спасибо за вашу помощь :)