调用alsa-lib后启动时VLC卷错误

时间:2014-03-29 18:16:23

标签: c++ vlc volume alsa

我遇到了VLC和alsa-lib的问题。

上下文如下:

  • C ++ app
  • 运行覆盆子PI
  • 版本:VLC媒体播放器2.0.3 Twoflower(修订版 2.0.2-93-g77aa89e)
  • 首先在应用程序中,我使用alsa-lib设置全局系统卷(代码 (见下文)
  • 分叉进程以在控制台(cvlc)中运行VLC
  • 稍后设置不同的卷

我的问题如下: 在运行我的应用程序时,如果我在分叉和启动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 ++程序(有卷问题)还是从控制台启动

感谢您的帮助:)

1 个答案:

答案 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

希望这会有所帮助!