关于编写模块的文档,http://www.pulseaudio.org/wiki/WritingModules ,有关于编译模块的说明,下面这样
gcc -g -shared -o module-<yourmodule>.so module-<yourmodule>.c
但是这样很明显是不行的。
第一:有些库文件是没有办法找到的,必须在后面增加选项
-lpulse -lpulsecommon-0.9.21 -lpulsecore-0.9.21
第二:有些头文件也是没有办法找到的,还要增加选项
-I ./pulseaudio-0.9.21/src 等等
第三:这个是最麻烦的,./configure自动生成的Makefile中定义这一些宏定义,也需要加入。
第一种方法:独立编译
1. 这里我们需要将pulseaudio的pulsecore目录的头文件cp到系统头文件目录:/usr/include/pulsecore/
2. 直接使用gcc
gcc -g -shared -o module-<yourmodule>.so module-<yourmodule>.c -lpulse -lpulsecommon-0.9.21 -lpulsecore-0.9.21
如果使用了协议扩展的话还需要 -lprotocol-native.
需要注意的是,在pulseaudio编译安装的时候,libprotocol-native.so被安装到/usr/lib/pulse-0.9.21/modules/这个目录,所以必须要在加载我们模块的时候指定这个目录,方法有三:
a> 修改系统默认的搜索路径
b> 修改系统环境变量:LD_LIBRARY_PATH
c> 编译的时候指定rpath,例如
gcc --share -g -o module-audio.so -I../ -DHAVE_ATOMIC_BUILTINS -DHAVE_CONFIG_H *.c -lpulse -lpulsecore-0.9.21 -L/usr/lib/pulse-0.9.21/modules -lprotocol-native -Wl,-rpath -Wl,/usr/lib/pulse-0.9.21/modules/ -fPIC -DPIC
3. 可以替代#2, 使用automake
这个和#2有类似之处,这里省略了autoconf的一些过程,下面是Makefile.am
pulsecore = -lpulsecore-@PA_MAJORMINORMICRO@
pulsecommon = -lpulsecommon-@PA_MAJORMINORMICRO@
pulse = -lpulse
AM_LIBADD = $(DBUS_LIBS) $(GLIB20_LIBS) $(pulse) $(pulsecommon) $(pulsecore) -L/usr/lib/pulse-0.9.21/modules/
AM_CFLAGS = $(LIBPULSE_CFLAGS) $(DBUS_CFLAGS) $(GLIB20_CFLAGS) -I/usr/lib/include/pulse -I/usr/lib/include/ -I/usr/include
MODULE_LDFLAGS = -module -avoid-version
CFLAGS+=-Wl,-rpath -Wl,$(modlibexecdir)
#configdir = /etc/pulse
#config_DATA = policy.conf
#EXTRA_DIST = $(config_DATA)
#genarate SYMDEF files
SYMDEF_FILES = module-audiomanager-symdef.h
EXTRA_DIST = $(SYMDEF_FILES)
BUILT_SOURCES = $(SYMDEF_FILES)
$(SYMDEF_FILES): module-defs.h.m4
$(MKDIR_P) $(dir $@)
$(M4) -Dfname="$@" $< > $@
modlibexec_LTLIBRARIES = module-audiomanager.la
# AudioManager
module_audiomanager_la_SOURCES = module-audiomanager.c /
audio-streams.c /
audio-devices.c /
audio-userchooser.c /
audio-route.c /
audio-conflict.c /
audio-volume.c /
audio-voicecall.c /
audio-sinksource.c/
audio-protocolext.c
module_audiomanager_la_LDFLAGS = $(MODULE_LDFLAGS)
module_audiomanager_la_LIBADD = $(AM_LIBADD) $(GLIB20_LIBS) $(DBUS_LIBS) -lprotocol-native
#module_audiomanager_la_CFLAGS = $(AM_CFLAGS)
第二种方法:和pa统一编译
借助automake。比如我增加了一个sink,叫做:module-myalsa-sink, 相关的文件有 module-myalsa-sink.c 和 module-myalas-sink-symdef.h.
1. 修改 pulseaudio-0.9.21/src/Makefile.am
> 增加下面内容到适当位置,可以参考module-pipe-sink相关文件的位置
modlibexec_LTLIBRARIES += /
module-myalsa-sink.la
# These are generated by an M4 script
SYMDEF_FILES = /
...
modules/module-myalsa-sink-symdef.h /
...
module_myalsa_sink_la_SOURCES = modules/module-myalsa-sink.c
module_myalsa_sink_la_LDFLAGS = $(MODULE_LDFLAGS)
module_myalsa_sink_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la
2. 回到pulseaudio代码目录 pulseaudio-0.9.21
automake
这样就生成了Makefile.in文件
3. 在执行一般的编译过程, configure, make ,make install
这样就可以编译出我们需要的模块: module-myalsa-sink