Неправильный объем VLC при запуске после вызова alsa-lib

Я застрял в проблеме с 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++ (с проблемой громкости) или из консоли.

Спасибо за вашу помощь :)


person computer007    schedule 29.03.2014    source источник


Ответы (1)



Эта проблема возникла из-за ошибки в прошивке Raspberry PI. Теперь проблема решена (см. отчет об ошибке, который я открыл: https://github.com/raspberrypi/linux/issues/570 ).

Чтобы получить последнюю прошивку, выполните команду: sudo rpi-update

Ошибка была исправлена ​​в версии 3.10.38+ #675 PREEMPT вс 27 апр 18:15:12 BST 2014 armv6l

Надеюсь, это поможет!

person computer007    schedule 02.05.2014