简介:CSDN博客专家、《Android系统多媒体进阶实战》作者
博主新书推荐:《Android系统多媒体进阶实战》🚀
Android Audio工程师专栏地址:Audio工程师进阶系列【原创干货持续更新中……】🚀
Android多媒体专栏地址:多媒体系统工程师系列【原创干货持续更新中……】🚀
专题一 二:AAOS车载系统+AOSP14系统攻城狮入门视频实战课🚀
专题三:Android14 Binder之HIDL与AIDL通信实战课🚀
专题四:Android15快速自定义与集成音效实战课🚀
专题五:Android15音频策略实战课🚀
专题六:Android15音频性能实战课(无声/杂音/断音/爆音实战案例)🚀
人生格言:人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
点击获取二维码
🍉🍉🍉文章目录🍉🍉🍉
- 🌻1.前言
- 🌻2.应用场景和用法
- 2.1单独控制静音状态
- 2.2函数原型与返回语义
- 🌻3.调用流程剖析
- 3.1把布尔值写入mute属性
- 3.2元素在音频处理路径应用静音
- 🌻4.实战案例
- 4.1创建音量元素并设置原始增益
- 4.2静音后读取两个属性
- 4.3完整代码
- 🌻5.总结
🌻1.前言
本篇目的:理解
gst_stream_volume_set_mute()如何通过GstStreamVolume对象的mute属性设置静音状态,并区分静音与音量增益。
音量增益和静音是两个独立控制项。音量增益描述样本缩放比例,静音描述是否关闭当前音频输出。
gst_stream_volume_set_mute()只设置对象的mute属性,不修改volume属性。对象对应的音频元素负责在实际处理样本时应用静音状态。
🌻2.应用场景和用法
2.1单独控制静音状态
播放界面的静音按钮可以调用gst_stream_volume_set_mute()切换静音状态。取消静音时,元素仍可使用原有音量增益,不需要应用重新恢复音量值。
这一点可以避免把“静音”实现成将音量设置为0.0。如果只把音量设为零,应用还需要另行记住静音前的音量,并在取消静音时恢复。
2.2函数原型与返回语义
voidgst_stream_volume_set_mute(GstStreamVolume*volume,gboolean mute);| 参数 | 含义 |
|---|---|
volume | 实现GstStreamVolume的对象 |
mute | TRUE表示静音,FALSE表示取消静音 |
该函数没有返回值。它检查对象接口后,使用g_object_set()写入mute属性。调用本身不修改音频Buffer,也不保证任何对象正在播放。
相邻接口的职责如下:
| 接口 | 职责 |
|---|---|
gst_stream_volume_set_mute() | 设置静音属性 |
gst_stream_volume_get_mute() | 读取静音属性 |
gst_stream_volume_set_volume() | 设置音量增益属性 |
| 音频元素处理函数 | 根据属性对样本应用增益或静音 |
🌻3.调用流程剖析
3.1把布尔值写入mute属性
实现逻辑很直接:
g_return_if_fail(GST_IS_STREAM_VOLUME(volume));g_object_set(volume,"mute",mute,NULL);接口不维护单独的静音状态,也没有独立的硬件静音调用。它把控制值交给实现对象的GObject属性。
因此,使用前应确认目标对象实现了GstStreamVolume。如果需要让静音影响真实PCM输出,目标对象还必须在自身的数据处理路径中使用该属性。
3.2元素在音频处理路径应用静音
以volume元素为例,它分别保存mute和volume属性。更新内部处理状态时,如果mute为真,元素会把当前处理增益设置为零;原有volume属性仍然保留。取消静音后,处理状态可以回到该属性表示的增益。
🌻4.实战案例
4.1创建音量元素并设置原始增益
创建volume元素后,先把线性增益设为0.4。这个值代表当前音量属性,后续静音操作不会用零覆盖它。
4.2静音后读取两个属性
调用gst_stream_volume_set_mute()开启静音,再分别读取mute和volume。预期静音状态为真,线性增益仍为0.4。
4.3完整代码
#include<gst/gst.h>#include<gst/audio/audio.h>#include<math.h>intmain(intargc,char*argv[]){GstElement*element;gdouble linear_volume;gboolean mute;gst_init(&argc,&argv);element=gst_element_factory_make("volume",NULL);if(element==NULL||!GST_IS_STREAM_VOLUME(element)){if(element)gst_object_unref(element);return1;}/* 设置一份非零音量,便于验证静音不会改写volume属性 */gst_stream_volume_set_volume(GST_STREAM_VOLUME(element),GST_STREAM_VOLUME_FORMAT_LINEAR,0.4);/* 静音只改变mute属性 */gst_stream_volume_set_mute(GST_STREAM_VOLUME(element),TRUE);mute=gst_stream_volume_get_mute(GST_STREAM_VOLUME(element));linear_volume=gst_stream_volume_get_volume(GST_STREAM_VOLUME(element),GST_STREAM_VOLUME_FORMAT_LINEAR);g_assert(mute);g_assert(fabs(linear_volume-0.4)<0.000001);/* 取消静音时,保留的volume属性仍可供元素使用 */gst_stream_volume_set_mute(GST_STREAM_VOLUME(element),FALSE);gst_object_unref(element);return0;}🌻5.总结
gst_stream_volume_set_mute()通过设置对象的mute属性控制静音状态,并把样本处理留给实现该接口的音频元素。