Chinaunix首页 | 论坛 | 博客
  • 博客访问: 225193
  • 博文数量: 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. }



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

快活王怜花2013-10-10 17:15:31

sz_div8:非常感谢您的建议,  因为对 上层的程序不是很熟悉,所以 来咨询下您,谢谢.

  fc  18 测试了 ,可以, 但是 项目上要求用fedora 14 ,当然,内核可以 升级 上去.

其中
gvc-mixer-ui-device.c中的get_profile_canonical_name()函数和gvc_mixer_ui_device_get_best_profile()函数;
gvc-mixer-control.c中的sync_devices()函数。
我感觉这3个函数,是操作output stream的,你可以关注一下。

由于时间关系,我没有深入研究代码,不确定是否还有其他地方操作到output。

以上,希望能够帮到您。

回复 | 举报

快活王怜花2013-10-09 17:37:58

sz_div8:非常感谢您的建议,  因为对 上层的程序不是很熟悉,所以 来咨询下您,谢谢.

  fc  18 测试了 ,可以, 但是 项目上要求用fedora 14 ,当然,内核可以 升级 上去.

那你恐怕跟我这个差不多,先找到fedora18上gnome-control-center实现这块的代码,再移植过去,14的是gnome2,18的是gnome3。
今天太忙,我忘了帮你看了。。。呃,我回头搞下。。。

回复 | 举报

sz_div82013-10-09 14:24:18

快活王怜花:我手头也没相关环境,给您提供个思路吧:
1,你可以转而使用fedora18,这个最快捷。
2,除去内核之外,您看看modules。这个我不是很确定。
3,我看了下fedora的changelog。桌面环境,fedora14使用的是gnome2.32,16、17、18分别是3.2、3.4、3.6。gnome2和gnome3自然有很大区别,但不知3.4到3.6的改动是什么。gnome3.6的log没提及sound。
您可以下一份fedora17的gnome-control-center,做下对比。

另外我一会下一份18的代码,帮你看一下。

非常感谢您的建议,  因为对 上层的程序不是很熟悉,所以 来咨询下您,谢谢.

  fc  18 测试了 ,可以, 但是 项目上要求用fedora 14 ,当然,内核可以 升级 上去.

回复 | 举报

快活王怜花2013-10-09 10:22:21

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

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

The Sound panel has been made easier to use by removing the Hardware tab. Instead, the device lists in the Input and Output tabs offer more fine-grained choices. This improvement relies on PulseAudio 2.0.

这是gnome3.6对sound模块改动的描述。

回复 | 举报

快活王怜花2013-10-09 10:19:41

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

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

我手头也没相关环境,给您提供个思路吧:
1,你可以转而使用fedora18,这个最快捷。
2,除去内核之外,您看看modules。这个我不是很确定。
3,我看了下fedora的changelog。桌面环境,fedora14使用的是gnome2.32,16、17、18分别是3.2、3.4、3.6。gnome2和gnome3自然有很大区别,但不知3.4到3.6的改动是什么。gnome3.6的log没提及sound。
您可以下一份fedora17的gnome-control-center,做下对比。

另外我一会下一份18的代码,帮你看一下。

回复 | 举报