ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Linux Gstreamer深度解析之gst_audio_src_get_type调用流程与实战(六十六)

Linux Gstreamer深度解析之gst_audio_src_get_type调用流程与实战(六十六) 简介CSDN博客专家、《Android系统多媒体进阶实战》作者博主新书推荐《Android系统多媒体进阶实战》Android Audio工程师专栏地址Audio工程师进阶系列【原创干货持续更新中……】Android多媒体专栏地址多媒体系统工程师系列【原创干货持续更新中……】专题一 二AAOS车载系统AOSP14系统攻城狮入门视频实战课专题三Android14 Binder之HIDL与AIDL通信实战课专题四Android15快速自定义与集成音效实战课专题五Android15音频策略实战课专题六Android15音频性能实战课(无声/杂音/断音/爆音实战案例)人生格言人生从来没有捷径只有行动才是治疗恐惧和懒惰的唯一良药.更多原创,欢迎关注Android系统攻城狮文章目录1.前言2.应用场景和用法2.1获取音频源类型2.2函数原型与返回语义3.调用流程剖析3.1注册并取得GType3.2把类型标识用于继承和检查4.实战案例4.1准备类型查询程序4.2取得类型并检查关系4.3完整代码5.总结1.前言本篇目的理解gst_audio_src_get_type()如何向GLib类型系统提供GstAudioSrc的类型标识并通过类型查询确认它的父类型和抽象属性。创建GStreamer音频采集源时具体采集工作由源元素和底层设备实现负责。GstAudioSrc则提供音频源基类供具体采集元素继承。gst_audio_src_get_type()的职责是获取GstAudioSrc对应的GType。它不创建采集元素不打开声卡也不读取音频数据。类型查询请求gst_audio_src_get_type取得GstAudioSrc类型标识供类型检查或子类注册使用2.应用场景和用法2.1获取音频源类型gst_audio_src_get_type()常见于三类代码使用场景调用目的结果检查类型继承关系获取GstAudioSrc的GType可查询它是否继承自GstAudioBaseSrc定义具体音频源子类将GST_TYPE_AUDIO_SRC作为父类型新类型进入GObject类型体系编写类型测试检查类型名称和抽象属性确认基类不是可直接实例化的采集元素函数只负责类型注册和查询。调用它不会自动选择音频设备也不会启动采集。2.2函数原型与返回语义函数原型如下GTypegst_audio_src_get_type(void);项目含义参数无返回值GstAudioSrc对应的GType调用结果返回类型系统中的类型标识资源所有权不返回需要调用者释放的对象头文件中的GST_TYPE_AUDIO_SRC宏会调用gst_audio_src_get_type()通常用于声明子类的父类型G_DEFINE_TYPE(MyAudioSrc,my_audio_src,GST_TYPE_AUDIO_SRC);这里的宏参数描述MyAudioSrc的类型关系。实际的设备打开、音频格式准备和数据读取由具体子类及其父类接口完成。3.调用流程剖析3.1注册并取得GTypegst_audio_src_get_type()由GObject类型定义机制生成。类型第一次被查询时生成的实现会向GLib类型系统注册GstAudioSrc后续调用返回已经注册的类型标识。GstAudioSrc是抽象类型父类型是GstAudioBaseSrc。注册类型和创建实例是两件事取得GType不会创建GstAudioSrc对象。首次查询类型执行一次性类型注册关联父类型和类型初始化函数返回GstAudioSrc的GType类型系统保存父子关系和类型初始化入口。需要查询类信息或构造对象时GLib再依据类型系统中的注册信息处理相应操作。3.2把类型标识用于继承和检查具体音频采集源声明类型时将GST_TYPE_AUDIO_SRC传给类型定义宏。该宏通过父类型标识建立继承关系。运行时也可以用g_type_parent()查询父类型用G_TYPE_IS_ABSTRACT()检查类型是否为抽象类型。这些查询观察的是类型系统元数据不会触发采集。GST_TYPE_AUDIO_SRC具体采集源声明父类型GLib类型系统记录继承关系运行时查询父类型和抽象属性4.实战案例4.1准备类型查询程序这个案例直接查询GstAudioSrc的类型信息不访问声卡也不依赖具体音频采集设备。程序将检查三个结果类型名称、父类型名称以及该类型是否为抽象类型。4.2取得类型并检查关系调用gst_audio_src_get_type()取得类型标识后再使用GObject类型接口读取其元信息GType audio_src_typegst_audio_src_get_type();GType parent_typeg_type_parent(audio_src_type);g_print(type: %s\n,g_type_name(audio_src_type));g_print(parent: %s\n,g_type_name(parent_type));g_print(abstract: %s\n,G_TYPE_IS_ABSTRACT(audio_src_type)?yes:no);预期能观察到GstAudioSrc的父类型为GstAudioBaseSrc并且GstAudioSrc是抽象类型。4.3完整代码#includegst/gst.h#includegst/audio/audio.hintmain(intargc,char*argv[]){GType audio_src_type;GType parent_type;constgchar*type_name;constgchar*parent_name;gst_init(argc,argv);/* 获取GstAudioSrc在GObject类型系统中的标识 */audio_src_typegst_audio_src_get_type();if(audio_src_typeG_TYPE_INVALID){g_printerr(Failed to get GstAudioSrc type\n);return1;}/* 查询它的直接父类型 */parent_typeg_type_parent(audio_src_type);if(parent_typeG_TYPE_INVALID){g_printerr(GstAudioSrc has no parent type\n);return1;}type_nameg_type_name(audio_src_type);parent_nameg_type_name(parent_type);if(type_nameNULL||parent_nameNULL){g_printerr(Failed to get type name\n);return1;}/* 输出类型关系和抽象属性不创建采集对象 */g_print(type: %s\n,type_name);g_print(parent: %s\n,parent_name);g_print(abstract: %s\n,G_TYPE_IS_ABSTRACT(audio_src_type)?yes:no);return0;}5.总结gst_audio_src_get_type()用于取得并注册GstAudioSrc的GType标识供GObject类型检查和具体音频源子类建立继承关系。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进