我遇到了VLC和alsa-lib的问题。
上下文如下:
我的问题如下: 在运行我的应用程序时,如果我在分叉和启动VLC之前使用alsa-lib设置音量,则VLC以高于已过期的音量(即我设置的音量)开始。
如果我从程序中删除更改卷的代码,VLC将以全局系统卷集开始(我测试时将卷设置为0)。
当我从控制台运行VLC时,我得到相同的行为,它从当前设置的全局系统卷开始。
添加更多精度:当我在程序中使用相同的代码片段再次设置不同的音量时,但在分叉并启动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 ++程序(有卷问题)还是从控制台启动
感谢您的帮助:)
答案 0 :(得分:1)
此问题是由于Raspberry PI固件中的错误造成的。它现在已经解决了(参见我打开的错误报告:https://github.com/raspberrypi/linux/issues/570)。
要获取最后一个固件,请运行以下命令:
sudo rpi-update
该错误已在3.10.38 +版本中修复#675 PREEMPT Sun Apr 27 18:15:12 BST 2014 armv6l
希望这会有所帮助!