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

Posted

技术标签:

【中文标题】调用 alsa-lib 后启动时出现错误的 VLC 卷【英文标题】:Wrong VLC volume at launch after calling alsa-lib 【发布时间】:2014-05-09 05:15:05 【问题描述】:

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

上下文如下:

C++ 应用程序 在树莓派上运行 版本:VLC 媒体播放器 2.0.3 Twoflower(修订 2.0.2-93-g77aa89e) 首先在应用程序中,我使用 alsa-lib 设置全局系统音量(代码 下面提供) fork 进程以在控制台 (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】:

此问题是由于 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 中修复

希望这会有所帮助!

【讨论】:

以上是关于调用 alsa-lib 后启动时出现错误的 VLC 卷的主要内容,如果未能解决你的问题,请参考以下文章

modelsim 启动时出现错误

重新启动后尝试连接 TFS 时出现错误

在 Android 应用中重新启动后尝试打开文件夹时出现权限错误

使用令牌标头进行后 API 调用时出现 405 错误

设置堆栈后在 C 中调用 printf 时出现分段错误

使用 Snap 重新安装后,启动时出现 PyCharm 错误“插件需要缺少‘Python’的类加载器”