我遇到了 VLC 和 alsa-lib 的问题。
上下文如下:
- C++ 应用
- 在树莓派上运行
- 版本:VLC 媒体播放器 2.0.3 Twoflower(修订版 2.0.2-93-g77aa89e)
- 首先在应用程序中,我使用 alsa-lib(代码 下文提供)
- fork 进程以在控制台 (cvlc) 中运行 VLC
- 稍后设置不同的音量
我的问题如下: 在运行我的应用程序时,如果我在 fork 和启动 VLC 之前使用 alsa-lib 设置音量,VLC 以高于预期的音量(即我设置的音量)开始。
如果我从我的程序中删除更改音量的代码,VLC 将以全局系统音量集启动(我测试时将音量设置为 0)。
当我从控制台运行 VLC 时,我得到了相同的行为,它从当前设置的全局系统卷开始。
为了提高精度:当我在我的程序中使用相同的代码段再次设置不同的音量时,但是在 fork 并启动 VLC 之后,音量级别被正确应用。由于我认为问题与alsa-lib调用有关,我尝试了alsa-lib中的几个函数来释放内存,但没有解决问题。
这是我使用(删除错误处理以提高可读性)使用 alsa-lib 设置音量的代码(受 Set ALSA master volume from C code 启发):
// 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++ 程序(有音量问题)还是从控制台启动的
感谢您的帮助:)
最佳答案
此问题是由于 Raspberry PI 固件中的错误造成的。现在已经解决了(参见我打开的错误报告:https://github.com/raspberrypi/linux/issues/570)。
要获取最新的固件,请运行命令:
sudo rpi-更新
该错误已在 3.10.38+ 版本中修复 #675 PREEMPT Sun Apr 27 18:15:12 BST 2014 armv6l
希望这会有所帮助!
关于c++ - 调用 alsa-lib 后启动时 VLC 音量错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22734921/