Chinaunix首页 | 论坛 | 博客
  • 博客访问: 230006
  • 博文数量: 14
  • 博客积分: 167
  • 博客等级: 入伍新兵
  • 技术积分: 274
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-29 13:28
文章分类

全部博文(14)

文章存档

2014年(5)

2013年(4)

2012年(5)

我的朋友

分类: LINUX

2012-07-02 14:56:45

0,需求:

ubuntu12.04系统中的声音设置程序(gnome-control-center中的sound模块),移植到我们产品使用的系统中。

我们产品的桌面属于gnome2.xx版本,其上使用的声音设置程序是属于gnome-media包中(gnome-media中的gnome-volume-control)。

即:移植gnome-control-centersound gnome-media中。

 

这里遇到的问题有:

1. 运行方式和代码不同。

2. 依赖控件库的版本有差异。

3. 配置资源、图标资源、声音资源有差异。

4. 移植工作带来的一些错误。

 

以上,是在移植过程中一步步发现,并解决的。下面会依次记录下如何发现问题,并且如何去fix

 

1,拿到软件包。

首先,我们拿到两个包的代码:gnome-control-center gnome-media,方式依旧是apt-get source

gnome-media包目录:

gnome-media/gnome-volume-control/

gnome-media/gnome-volume-control/src/

gnome-media/gnome-volume-control/data/

gnome-media/gnome-volume-control/data/icons

其他文件....

 

gnome-control-center包目录:

gnome-control-center/panels/

gnome-control-center/panels/sound/

gnome-control-center/panels/sound/data/

gnome-control-center/panels/sound/data/icons

gnome-control-center/panels/sound/data/sounds

gnome-control-center/panels/sound/data/symbolic-icons

gnome-control-center/panels/sound-nua/

其他文件....

 

如上,gnome-media/gnome-volume-control/gnome-control-center/panels/sound/gnome-control-center/panels/sound-nua/这三个目录是我们最需关注的地方。

 

根据需求,以及在ubuntu 12.04的系统上对声音设置程序进程的分析,我们能够得出:需要将gnome-control-center/panels/sound-nua/这个模块移植到gnome-media中,代替gnome-volume-control/模块。

另外通过对相关Makefile.am的分析,我们猜测,可能还会用到gnome-control-center/panels/sound/下面的资源文件data(这一步是在后续工作才体会到的)。

了解了以上情况,就准备:

2,着手移植工作。

1)  观察两个模块的Makefile.am文件:

gnome-control-center/panels/sound-nua/Makefile.am规则是生成libsoundnua_la_LIBADD

gnome-media/gnome-volume-control/Makefile.am规则是生成 gnome-volume_control_LDADDgnome-volume_control_applet_LDADD(小图标)。

 

关于Makefile.am
编译时,autoconf会根据目录中的Makefile.amconfigure.ac生成Makefile.inconfigure文件。

 

可见,在ubuntu12.04中,声音设置模块是编译成so库而在gnome2.xx版本系统中gnome-volume-control是编译成执行程序的。那意味着,程序的入口可能不一样。

 

2)  拷贝代码、Makefile并修改和编译:

 

a)  我们将gnome-control-center中的代码拷贝到gnome-media中,根据代码修改好Makelfile.am,以及程序的入口gvc_mixer_control_new; gtk2相关函数代替gtk3库。

 

b)  处理了信号(去掉gnome-mediaconnecting ready,直接接回调函数) 
在程序的入口处,老版本会将Object链接两个自建信号,connectingready。但新版的已经使用state-changed代替。这里我们舍弃掉connecting信号的操作,保留ready的操作,但修改了调用callback的方法,直接调用。不用信号connect 
这样能够解决掉昨天编译出现的错误,但执行起来,没有出现程序窗口。 

 

c)  处理dialog的信号responseclose,新版的已经改成了vbox,故索性舍弃responseclose(这两个信号的回调都是gtk_main_quit),改成delete-event 
ready的回调函数中,有两个信号responseclose,链接在dialog中,这个"dialog"在新旧两个版本不是一个容器。旧版的是一个真正的dialog,而新版的实际上是一个vbox 
旧版代码中,responseclose两个信号的回调都是gtk_main_quit,故而我们将这个两个信号去掉,直接将delete-event链接到新版的vbox上(container一个window内)。 

 

3,资源问题

我们将gnome-control-center的资源,主要是sound以及symbolic-icons拷贝到旧版软件包gnome-media内。 

gnome-control-center
sound模块中,部分icons是不在软件包内的,而是依赖了gnome-icon-theme-symbolic包。如某些svg图片。 
我们将其中需要使用到的svg图片拷贝到gnome-media软件包内,再进行编译。可以使用。 
需要注意修改configure.ac文件(添加对拷贝过来的iconMakefile支持)以及Makefile.am文件。 

关于schemas 
schema
sound的问题:在"声音效果""选择警报音量"没有对各种风格警报声的支持。 

1
,声音,警报音:gsettings-desktop-schemas_3.0.0-0ubuntu1.1_all.deb 
2
,警报音的默认声音:ubuntu-sounds_0.13_all.deb 

 

4,引用:

新的声音设置程序来自ubuntu 12.04,与当前系统的声音设置程序相比,更加简洁易懂。然而两边程序有较大差异,例如分别来自不同的软件包,运行方式有差异,图形控件版本不同。

 

因此本次移植工作代码层面主要是上述差异的处理,例如兼容老的运行方式,所使用的图形控件使用回退到前一个主要版本等等,这个过程也经历了不少问题,最后均被调试解决。

 

在资源层面,两边程序所使用的配置资源、图标资源、声音资源均有差异。主要通过分析Linux下最常见的构建系统“autoconf/automake”,来分析,改动内建资源的变化。外部依赖资源则通过了strace,以及分析源代码来定位。最后也都处理完毕。

 

上述移植工作为确保全面,均又进行了系统检查,确保没有遗漏问题

 

另外,还处理了ubuntu程序本身的段错误以及因移植而产生的段错误的情况。

 

5,附:

在移植过程中,发现gnome-control-center-3.4.1源代码的一个潜在bug

gnome-control-center-3.4.1/panels/sound-nua/gvc-speaker-test.c的第436行,g_free (output_name);

源份代码如下:

 


  1. static void

  2. update_channel_map (GvcSpeakerTest *speaker_test)

  3. {

  4.         guint i;

  5.         const GvcChannelMap *map;

  6.         char *output_name;

  7.  

  8.         g_return_if_fail (speaker_test->priv->control != NULL);

  9.         g_return_if_fail (speaker_test->priv->stream != NULL);

  10.  

  11.         g_debug ("XXX update_channel_map called XXX");

  12.  

  13.         map = gvc_mixer_stream_get_channel_map (speaker_test->priv->stream);

  14. /*

  15.         map = get_channel_map_for_stream (speaker_test->priv->control,

  16.                                         speaker_test->priv->stream,

  17.                                         &output_name);

  18. */

  19.         g_return_if_fail (map != NULL);

  20.  

  21.         ca_context_change_device (speaker_test->priv->canberra,

  22.                                   gvc_mixer_stream_get_name (speaker_test->priv->stream));

  23.         g_free (output_name);

  24.  

  25.         for (i = 0; i < G_N_ELEMENTS (position_table); i += 3) {

  26.                 gtk_widget_set_visible (speaker_test->priv->channel_controls[position_table[i]],

  27.                                         gvc_channel_map_has_position(map, position_table[i]));

  28.         }

  29. }



看来,这帮家伙也有不够严谨的时候。
阅读(4199) | 评论(9) | 转发(0) |
给主人留下些什么吧!~~

SZ_DIV82013-10-09 09:34:59

快活王怜花:确实是没有,我粗略搜了下,恐怕不是这个研究方向?

您好:   
          我装了Fedora 18 是可以 实现切换 声音输出到 HDMI/DP port 选项的 ,  而 fedora 14 ,16, 17 都没有这个选项. 

           所以我下载了 一个  Fedora 18 的gnome-control-center  的代码 ,  想看看他的 sound 模块 是怎么去做这个事情,但是 没有看明白, 能否指点一下, 同时  我将 我的fedora 14 的内核升级为 3.6.2 (和fedora 18 一样),  

回复 | 举报

快活王怜花2013-10-08 16:27:44

SZ_DIV8:您好,请教一个问题,:
   gnome-control-center  sound 模块 中 切换 声音从 intel 声卡 的 HDMI/DP port 输出 怎么做的呢 ??  


   我现在有这样一个 需求 :  
   系统 :  fedora 14  
 
   现在 ,  有一台显示器 带 Display port 的声音输出 ,  需要 通过设置将声音 切换到这台 显示器上. 而 gnome-volumn-control 工具 并没有这个切换到DP的选项 .

我装了一个  fedora&nbs

确实是没有,我粗略搜了下,恐怕不是这个研究方向?

回复 | 举报

SZ_DIV82013-10-08 10:53:28

您好,请教一个问题,:
   gnome-control-center  sound 模块 中 切换 声音从 intel 声卡 的 HDMI/DP port 输出 怎么做的呢 ??  


   我现在有这样一个 需求 :  
   系统 :  fedora 14  
 
   现在 ,  有一台显示器 带 Display port 的声音输出 ,  需要 通过设置将声音 切换到这台 显示器上. 而 gnome-volumn-control 工具 并没有这个切换到DP的选项 .

我装了一个  fedora&nbs