<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://tangl99.spaces.live.com/mmm2008-07-24_12.50/rsspretty.aspx?rssquery=en-US;http%3a%2f%2ftangl99.spaces.live.com%2fcategory%2f%e7%a7%bb%e5%8a%a8%e5%bc%80%e5%8f%91%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Tang Liang's notebook: 移动开发</title><description /><link>http://tangl99.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=cat%25E7%25A7%25BB%25E5%258A%25A8%25E5%25BC%2580%25E5%258F%2591</link><language>en-US</language><pubDate>Mon, 18 Aug 2008 14:23:05 GMT</pubDate><lastBuildDate>Mon, 18 Aug 2008 14:23:05 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://tangl99.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>-508484562895931526</live:id><live:alias>tangl99</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>令人激动的Google手机操作系统Android</title><link>http://tangl99.spaces.live.com/Blog/cns!F8F17FFBEED1777A!1073.entry</link><description>&lt;p&gt; 做过几年的Symbian手机游戏开发，也做过几年J2ME上的程序开发，对于手机上的应用开发，一向都是我比较关注的。然而，似乎这一切都没有让Google推出的GPhone让人如此激动和兴奋。GPhone的手机操作系统Android终于在2007年11月13日正式发布了，而且还是一个开源的操作系统，内核为Linux。以往的各种手机平台，都过于封闭，都是传统手机制造厂商把持了其应用程序的主流开发，而第三方软件提供商很难在上面施展拳脚，不过Google推出的Android却是如此开放，估计会吸引不少的开发人员为其编写应用软件。其开发平台也是最流行的Eclipse，开发语言也是流行的Java，所以只要你有心，就能为它做任何应用软件。 &lt;p&gt;  关于Android的官方开发首页在Google的&lt;a href="http://code.google.com/android/"&gt;http://code.google.com/android/&lt;/a&gt;，其Youtube上还有一个关于GPhone的视频介绍，看看真正的GPhone跑起来是什么样的。&lt;br&gt;&lt;a title="http://www.youtube.com/watch?v=1FJHYqE0RDg&amp;amp;eurl=http://code.google.com/android/" href="http://www.youtube.com/watch?v=1FJHYqE0RDg&amp;amp;eurl=http://code.google.com/android/"&gt;http://www.youtube.com/watch?v=1FJHYqE0RDg&amp;amp;eurl=http://code.google.com/android/&lt;/a&gt; &lt;p&gt; CSDN上已经有博客在撰写中文的Android开发入门了:Android程序开发初级教程(一)(二)(三) &lt;p&gt;&lt;a title="http://blog.csdn.net/k7sem/archive/2007/11/15/1886871.aspx" href="http://blog.csdn.net/k7sem/archive/2007/11/15/1886871.aspx"&gt;http://blog.csdn.net/k7sem/archive/2007/11/15/1886871.aspx&lt;/a&gt;&lt;br&gt;&lt;a title="http://blog.csdn.net/k7sem/archive/2007/11/15/1887437.aspx" href="http://blog.csdn.net/k7sem/archive/2007/11/15/1887437.aspx"&gt;http://blog.csdn.net/k7sem/archive/2007/11/15/1887437.aspx&lt;/a&gt;&lt;br&gt;&lt;a title="http://blog.csdn.net/k7sem/archive/2007/11/15/1887499.aspx" href="http://blog.csdn.net/k7sem/archive/2007/11/15/1887499.aspx"&gt;http://blog.csdn.net/k7sem/archive/2007/11/15/1887499.aspx&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-508484562895931526&amp;page=RSS%3a+%e4%bb%a4%e4%ba%ba%e6%bf%80%e5%8a%a8%e7%9a%84Google%e6%89%8b%e6%9c%ba%e6%93%8d%e4%bd%9c%e7%b3%bb%e7%bb%9fAndroid&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=tangl99.spaces.live.com&amp;amp;GT1=tangl99"&gt;</description><comments>http://tangl99.spaces.live.com/Blog/cns!F8F17FFBEED1777A!1073.entry#comment</comments><guid isPermaLink="true">http://tangl99.spaces.live.com/Blog/cns!F8F17FFBEED1777A!1073.entry</guid><pubDate>Sat, 17 Nov 2007 06:42:05 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://tangl99.spaces.live.com/blog/cns!F8F17FFBEED1777A!1073/comments/feed.rss</wfw:commentRss><wfw:comment>http://tangl99.spaces.live.com/Blog/cns!F8F17FFBEED1777A!1073.entry#comment</wfw:comment><dcterms:modified>2007-11-17T06:56:15Z</dcterms:modified></item><item><title>Series60的2.1版本的模拟器编码转换的一个小bug</title><link>http://tangl99.spaces.live.com/Blog/cns!F8F17FFBEED1777A!145.entry</link><description>&lt;div&gt;Symbian Series 60的2.1中文版本的SDK是个比较不错的开发选择。最大的特色就是支持了TCP/IP Network，可以不用插件情况，很方便地进行网络模拟了。 不过2.1的中文版本在进行GBK转换到UNICODE的API似乎有个BUG。也就是这行的代码： 
&lt;p&gt; CCnvCharacterSetConverter::PrepareToConvertToOrFromL(KCharacterSetIdentifierGbk, Fs)
&lt;p&gt;  在2.1的中文版本的模拟器上，它始终返回一个错误代码(-12)，但是呢，Symbian 6.1的中文手机就已经支持这个API了。如果编译成ARMI代码，放在真机上是没有问题的，只是模拟器的问题，而且只是2.1的中文版模拟器的问题。我后来在2.2的中文版模拟器上跑过，也没有问题。
&lt;p&gt;  不过，有点奇怪的是，Symbian 2.x后的模拟器都支持直接加宽GBK编码在模拟器上的显示，也就是直接使用_L宏就可以了，比如_L(&amp;quot;大家好！&amp;quot;)，但是真机上显示出来的还是乱码，那么怎么办呢？
&lt;p&gt;  我的办法就是使用宏嘛，条件编译嘛，比如下面一个条件，我就是直接加宽字符：
&lt;p&gt;#if defined(__WINS__) &amp;amp;&amp;amp; defined(__SERIES60_21__)&lt;br&gt;   ...  // 直接加宽Windows上常规字符串&lt;br&gt;#else&lt;br&gt;  ... // 调用CCnvCharacterSetConverter的API进行GBK=&amp;gt;Unicode的编码转换&lt;br&gt;#endif
&lt;p&gt;  直接加宽字符串呢，可以解决英文ASCII编码到Unicode的转换，因为Unicode下，英文的编码值还是一样的，只是从8为变成16位，高8位为0。而中文的就不一样了，WINDOWS上使用的都是GB2312的汉字编码，属于GBK的大集合，这种编码的特点就是可以和ASCII兼容，因为它的一个字节的最高位为1，而ASCII编码最高位是0。Windows上可以直接通过MultiByteToWideChar(CP_ACP, 0, ...)这个API进行转换成UNICODE了。
&lt;p&gt;  或者直接用WINDOWS的记事本也可以“另存”为Unicode的编码，不过小心的是，它会在文件头增加FF FE两个字节的标记。
&lt;p&gt;  讨论了这么久的编码问题，说到最后，其实直接升级你的SYMBIAN SDK到2.2版本，或许是最佳的选择。&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-508484562895931526&amp;page=RSS%3a+Series60%e7%9a%842.1%e7%89%88%e6%9c%ac%e7%9a%84%e6%a8%a1%e6%8b%9f%e5%99%a8%e7%bc%96%e7%a0%81%e8%bd%ac%e6%8d%a2%e7%9a%84%e4%b8%80%e4%b8%aa%e5%b0%8fbug&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=tangl99.spaces.live.com&amp;amp;GT1=tangl99"&gt;</description><comments>http://tangl99.spaces.live.com/Blog/cns!F8F17FFBEED1777A!145.entry#comment</comments><guid isPermaLink="true">http://tangl99.spaces.live.com/Blog/cns!F8F17FFBEED1777A!145.entry</guid><pubDate>Fri, 23 Dec 2005 01:18:17 GMT</pubDate><slash:comments>4</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://tangl99.spaces.live.com/blog/cns!F8F17FFBEED1777A!145/comments/feed.rss</wfw:commentRss><wfw:comment>http://tangl99.spaces.live.com/Blog/cns!F8F17FFBEED1777A!145.entry#comment</wfw:comment><dcterms:modified>2006-01-26T16:20:09Z</dcterms:modified></item><item><title>Symbian Series60上实现混音的办法</title><link>http://tangl99.spaces.live.com/Blog/cns!F8F17FFBEED1777A!140.entry</link><description>&lt;div&gt;在Symbian 6.1的CMdaAudioPlayer是无法实现混音的。如果你当前正在播放一段音乐，那么此时如果再播放另外一段音乐，那么之前的音乐就会被迫停止了。那么Symbian Series60上就无法实现混音了吗？不是的，我们看到很多游戏里面都实现了混音，那么他们是怎么做的呢？ 
&lt;p&gt;  显然，我们只能从底层下手。Symbian提供了一个直接播放PCM音频编码的接口，CMdaAudioOutputStream。这个接口是可以直接播放PCM音频编码的。关于PCM编码，请查看一下关于数字通讯方面的资料，其实就是对于连续的波进行离散地采用量化，最后形成的数字编码型号。WAV里面的音频数据大部分都是PCM编码的。
&lt;p&gt; 
&lt;p&gt; 混音的实现方法有两个。
&lt;p&gt; 
&lt;p&gt;  第一个就是直针对两个采样的PCM编码进行线性插值。其实在图像上，图像的混合也是通过有名的alpha混合实现的，alpha混合是一个典型线性插值。&lt;br&gt; &lt;strong&gt; &lt;font color="#993300"&gt;color3 = color1 * alpha + color2*(1-alpha)&lt;/font&gt;&lt;/strong&gt;
&lt;p&gt;  不过声音和图像有点不同，声音是波动信号。图像是静态的。也就是说，声音的产生是根据PCM编码的变化值（换句话说，是根据其一阶导数）呈现出来的。声音并不会因为PCM编码的大小而呈现不同的声音，而是根据一个连续区间内的PCM编码的变化幅度来呈现的。
&lt;p&gt;  这第一个算法就是类似图像上的alpha混合算法：
&lt;p&gt;  &lt;font color="#800000"&gt;If the range of 8-bit sampling is between -127 to 128 &lt;br&gt;&lt;br&gt;   If both A and B are negative      &lt;/font&gt;&lt;font color="#800000"&gt;&lt;strong&gt; Y = A +B - (A * B / (-127)) &lt;br&gt;&lt;/strong&gt;   Else                                       &lt;/font&gt;&lt;font color="#800000"&gt;&lt;strong&gt;Y = A + B - A * B / 128 &lt;br&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;Similarly for the nbit (ex 16bit data)&lt;br&gt;&lt;br&gt;   For  n-bit sampling audio signal &lt;br&gt;&lt;br&gt;&lt;br&gt;   If both A and B are negative      &lt;/font&gt;&lt;font color="#800000"&gt;&lt;strong&gt; Y = A + B - (A * B  /  (-(2 pow(n-1) -1))) &lt;br&gt;&lt;/strong&gt;   Else                                       &lt;strong&gt;Y = A + B - (A * B /  (2 pow(n-1)) &lt;/strong&gt;&lt;/font&gt;&lt;br&gt;
&lt;p&gt; 
&lt;p&gt; 
&lt;p&gt; 第二个办法，就不需要进行类似的数学运算了。这个办法有点类似我们很早以前的那种布置网点的图像混合办法。在以前画漫画的时候经常用到的。以前还专门有卖网点纸的呢，用来实现漫画中的半透明效果。
&lt;p&gt;  在混音上，这个办法更加有效。简单来说，就是分成很多微小的时间片，然后在不同的时间片内播放不同的音乐。也有点类似CPU的并发执行一样。从整体上来看，似乎就是几段音乐同时播放了。而为什么在音频上实现效果比图像上更好呢？还是上次那个原因，因为声音是动态播放的。人的耳朵就很难分析来两个那么微小的时间片内的音乐了。
&lt;p&gt;  关于这个办法具体的实现，其实在NOKIA的官方网站上已经有了。&lt;a href="http://direct.www.forum.nokia.com/info/sw.nokia.com/id/70a2bde5-9b14-41b3-89ae-198b0d8d380d/SoundMixer_Example_v1_0.zip.html"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://direct.www.forum.nokia.com/info/sw.nokia.com/id/70a2bde5-9b14-41b3-89ae-198b0d8d380d/SoundMixer_Example_v1_0.zip.html&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;
&lt;p&gt;  相信很多人在Symbian实现混音的办法都是直接抄袭这个NOKIA实现的例子。它支持16个不同的Channel来混音。首先新开一个线程，然后这个线程就是把多个要播放的PCM编码缓冲合成到一个缓冲区，然后再不断地把这个缓冲区的数据写给CMdaAudioOutputStream里面去。
&lt;p&gt;  &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-508484562895931526&amp;page=RSS%3a+Symbian+Series60%e4%b8%8a%e5%ae%9e%e7%8e%b0%e6%b7%b7%e9%9f%b3%e7%9a%84%e5%8a%9e%e6%b3%95&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=tangl99.spaces.live.com&amp;amp;GT1=tangl99"&gt;</description><comments>http://tangl99.spaces.live.com/Blog/cns!F8F17FFBEED1777A!140.entry#comment</comments><guid isPermaLink="true">http://tangl99.spaces.live.com/Blog/cns!F8F17FFBEED1777A!140.entry</guid><pubDate>Wed, 30 Nov 2005 01:41:50 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://tangl99.spaces.live.com/blog/cns!F8F17FFBEED1777A!140/comments/feed.rss</wfw:commentRss><wfw:comment>http://tangl99.spaces.live.com/Blog/cns!F8F17FFBEED1777A!140.entry#comment</wfw:comment><dcterms:modified>2006-01-26T16:40:58Z</dcterms:modified></item></channel></rss>