1. 引言
GstAlsaPlugin 是Gstreamer中的重要插件,其代码位于 gst-plugin-base 中,应用可以通过它来实现音频的采集和播放。 它是通过ALSA libary API封装实现的,相较于 gst-plugin-good 包中的GstPulsePlugin 实现更高效,延迟更低。在分析GstAlsaSink 和GstAlsaSrc 实现之前我们先了解一下他们的继承关系和另外一个重要的类:GstAudioRingBuffer。
2. GstAlsaSink 详细信息
在终端输入“gst-inspect-1.0 alsasink”便会打印出alsasink的详细信息,
Plugin Details:
Name alsa
Description ALSA plugin library
Filename /usr/local/lib/gstreamer-1.0/libgstalsa.so
Version 1.5.0.1
License LGPL
Source module gst-plugins-base
Source release date 2014-11-12 06:24 (UTC)
Binary package GStreamer Base Plug-ins git
Origin URL Unknown package origin
其中,
libgstalsa.so 是AlsaPlugin的库文件,
GObject
+----GInitiallyUnowned
+----GstObject
+----GstElement
+----GstBaseSink
+----GstAudioBaseSink
+----GstAudioSink
+----GstAlsaSink
以上为GstAlsaSink的继承关系树,其直接父类为GstAudioSink,对于需要自己写AudioPlugin的开发者来说Gstreamer推荐直接继承GstAudioSink这个基类,因为该类为其子类提供了一个简明的向下接口(如,open(),prepare(),write()等),子类只要按照功能复写这些虚函数即可,比较简便。在这个继承关系树中,我们只需要关心GstElement一下的各类,GstObject及以上的类属于GObject对象编程的范畴,对于初接触GObject的人有必要了解一下,对于理解该体系的代码很有帮助,请参考
https://developer.gnome.org/gobject/stable/ 。
Element Implementation:
Has change_state() function: gst_audio_base_sink_change_state
这里给出了AlsaSink 的Element实现函数change_state,它是在GstAudioBaseSink类中实现的。该函数根据pipleline的状态变化执行相应的配置、预处理和播放等操作。
3. GstAlsaSrc 详细信息
GstAlsaSrc的详细信息内容和Sink的类似,不同的是在Src的继承关系树中多了GstPushSrc类,该类多在没有随机访问能力或访问速度较慢的场合使用,且多以push模式工作,alsasrc没有用到该类,所以在此就不多细述。
Plugin Details:
Name alsa
Description ALSA plugin library
Filename /usr/local/lib/gstreamer-1.0/libgstalsa.so
Version 1.5.0.1
License LGPL
Source module gst-plugins-base
Source release date 2014-11-12 06:24 (UTC)
Binary package GStreamer Base Plug-ins git
Origin URL Unknown package origin
GObject
+----GInitiallyUnowned
+----GstO