c++ - 调用 alsa-lib 后启动时 VLC 音量错误

标签 c++ vlc volume alsa

我遇到了 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/

相关文章:

c++ - 如何编写异步操作?

contextmenu - 如何删除 VLC 媒体播放器中的右键菜单?

google-chrome - VLC 网络播放器在 Google chrome 浏览器中不起作用

c++ - 线程构建 block : Deadlocks because all threads used up

c++ - 尽管链接正确,但未定义的 boost 引用

c++ - LAPACK 矩阵乘法与 C++

compiler-errors - 错误交叉编译vlc Linux(Ubuntu 12.04)64以赢得64

android - 如何仅在我的 Android 应用中静音按下音量键的声音?

javascript - 无控制地降低音量

audio - 如何在 AutoIt 中使用 WMI 将系统音量静音?