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

Я застрял на проблеме с VLC и alsa-lib.

Контекст следующий:

  • Приложение C ++
  • Запустить на малиновом пи
  • Версия: 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: опция verbose (-vvv) дает ту же самую трассировку, какую бы она ни запускала из моей программы на C ++ (с проблемой громкости) или из консоли

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

1

Решение

Эта проблема была из-за ошибки в прошивке 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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector