• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            franksunny的個(gè)人技術(shù)空間
            獲得人生中的成功需要的專注與堅(jiān)持不懈多過天才與機(jī)會(huì)。 ——C.W. Wendte

             

            聲音提示和震動(dòng)提示的開發(fā)

             

            聲音提示可以采用兩種方法:一種是利用系統(tǒng)自帶的CoeSoundPlayer類來實(shí)現(xiàn)單音鈴聲的播放;另一種則是利用S60提供的多媒體框架CMda*類來實(shí)現(xiàn)音頻播放。

            關(guān)于聲音提示的使用

            CoeSoundPlayer類使用

            該類聲明于coesndpy.h頭文件,庫是cone.lib,最簡單的使用莫過于如下格式的代碼應(yīng)用

            TBaSystemSoundType a(KSystemSoundMessageUID);

            CoeSoundPlayer::PlaySoundNow(a);

            在以上代碼的使用時(shí),第一行聲明一個(gè)系統(tǒng)tone的類型,該類型聲明在bassnd.h文件中,同時(shí)在mmp中加上bafl.lib庫文件。通常這種簡單應(yīng)用,在模擬器上能夠聽到聲音(3rd MR版本的模擬器上都聽不到聲音),但是在真機(jī)上,基本聽不到聲音,一個(gè)原因據(jù)說是默認(rèn)的缺省音量被置成了KSystemSoundDefaultVolume,其值最大可以到100(我親測的結(jié)果是最小為0,沒有聲音,最大只能到10,超過10之后和傳負(fù)值一樣都會(huì)報(bào)MMFAudioClient 4的錯(cuò)誤,程序也會(huì)Crash。所以關(guān)于這點(diǎn)最好還是有高人指點(diǎn)下)。另外bassnd.h中定義的類型還有KSystemSoundRingUID, KSystemSoundAlarmUID, KUidSystemSoundError, KUidSystemSoundEvent等,具體的效果,可以自己親測下。

             

            稍微復(fù)雜一點(diǎn)的應(yīng)用代碼如下:

            TBaSystemSoundType soundType(KSystemSoundMessageUID);

            //TBaSystemSoundInfo::TTone soundTone(aFrequency, aDuration);

            TBaSystemSoundInfo::TTone soundTone(1500, 3*1000*1000);

            TBaSystemSoundInfo soundInfo(soundType, soundTone);

            BaSystemSound::SetSoundL(CCoeEnv::Static()->FsSession(), soundInfo);

            CoeSoundPlayer::PlaySoundNow(soundType);

            在這里,我對音調(diào)不是很懂,但是aFrequency的值,經(jīng)人測試1003400是工作正常,效果很好(可能10003000最好), 36003800就變?nèi)趿耍偻系?/span>4000基本上已經(jīng)聽不到了。這種方法一般在真機(jī)上還是可以感受出來的,并非像第一種情況,只有模擬器上有效果。

             

            只是長時(shí)間播放簡單的音調(diào)估計(jì)很刺耳,那么我們就可以通過事先設(shè)計(jì)好的rng文件來進(jìn)行播放單音鈴聲,具體代碼如下:

            _LIT(KRingToneFileName1, "\\Data\\Sounds\\simple\\alarm.rng");

            const TInt KRingingTypeSilent = 4; // Silent

            TInt tRingingType (0);

            CRepository* tRepository = CRepository::NewLC(KCRUidProfileEngine);

            User::LeaveIfError( tRepository ->Get(KProEngActiveRingingType, tRingingType ) );

            if ( tRingingType != KRingingTypeSilent )

            {

                   TBaSystemSoundType soundType(KSystemSoundRingUID);

                   TBaSystemSoundName soundName(KRingToneFileName1);

                   CompleteWithAppPath(soundName);

                   TBaSystemSoundInfo soundInfo(soundType, soundName, 10,
                    KSystemSoundDefaultPriority);

                   BaSystemSound::SetSoundL(CCoeEnv::Static()->FsSession(), soundInfo);

                   CoeSoundPlayer::PlaySoundNow(soundType);

                   //CoeSoundPlayer::PlaySound(soundType);

            }

            CleanupStack::PopAndDestroy(); // tRepository

            使用以上代碼需要注意的是alarm.rng文件必須要有,否則會(huì)沒有聲音傳出,該文件在FP2版本的模擬器路徑下沒有,可以在S60_3rd_MR\Epoc32\release\winscw\udeb\z\system\sounds\simple下找到,并將其拷貝到相應(yīng)的epoc32\release\winscw\udeb\z\system\sounds\simple下面即可。

            注:另外,在這里雖然對情景模式是否靜音進(jìn)行了判斷,其實(shí)不判斷也是可以的,因?yàn)榍榫澳J皆O(shè)為靜音,仍然是可以播放出聲音來的。這點(diǎn)很不同于震動(dòng)。

             

            多媒體框架的使用

            S60MMF(多媒體框架)提供了對音頻進(jìn)行播放、錄制和格式轉(zhuǎn)換等功能函數(shù),具體的功能類如下:

            CMdaAudioPlayerUtility:音頻播放;

            CMdaAudioRecorderUtility:音頻錄制;

            CMdaAudioConvertUtility:音頻格式轉(zhuǎn)換;

            CMdaAudioToneUtility:音調(diào)播放

            CMdaAudioInputUtility/ CMdaAudioOutputUtility:音頻流操作

            對于這一塊內(nèi)容的介紹在靈活使用EMCCsoft提供的AudioPlayer例子程序就會(huì)比較清楚,在這里就不多做展開了。唯一需要提醒的是,相應(yīng)的回調(diào)接口虛函數(shù)一定要實(shí)現(xiàn),否則不好控制。另設(shè)置音量的函數(shù)SetVolume也是只能在0~10之間,否則也會(huì)報(bào)MMFAudioClient 4錯(cuò)誤。

             在用CMdaAudioPlayerUtility進(jìn)行音樂文件比如*.wav格式播放時(shí),假如一個(gè)文件還沒有播放完,又開始播放一個(gè)新文件,也會(huì)引發(fā)MMFAudioClient 4的錯(cuò)誤。

            關(guān)于震動(dòng)提示的使用

            震動(dòng)這個(gè)接口的發(fā)展歷史很奇特,Symbian OS v8.x之前沒有提供震動(dòng)接口,之后開始使用CVibraControl類提供震動(dòng)接口,而在Symbian OS v9.x之后在保留原有接口基礎(chǔ)上又提供了新的CHWRMVibra類來提供震動(dòng)接口。

            網(wǎng)上的代碼很多,常見形式如下:

            // for S60 2nd FP2 and FP3

            #include <vibractrl.h>  // CVibraControl, VibraCtrl.lib

             

            void DoVibrateL( TUint16 aDuration )

            {

              CVibraControl* control = VibraFactory::NewL();

              // get vibration setting in the user profile

              if ( CVibraControl::EVibraModeON == control->VibraSettings() ) 

              {

                 control->StartVibraL( aDuration );

              }

             

              delete control;

              control = NULL;

            }

             

            // for S60 3rd

            #include <hwrmvibra.h>  // CHWRMVibra, HWRMVibraClient.lib

             

            void DoVibrateL( TInt aDuration )

            {

              CHWRMVibra* vibra = CHWRMVibra::NewLC();

              // get vibration setting in the user profile

              if ( CHWRMVibra::EVibraModeON == vibra->VibraSettings() ) 

              {

                 vibra->StartVibraL( aDuration );

              }

             

              CleanupStack::PopAndDestroy( vibra );

            }

            事實(shí)上如果原封不動(dòng)拷貝如上代碼是實(shí)現(xiàn)不了震動(dòng)功能的,因?yàn)椴还苁?/span>CHWRMVibra還是CVibraControl對象在被新建并調(diào)用完StartVibraL函數(shù)之后,立即就被析構(gòu)了,因?yàn)?/span>StartVibraL有類似異步函數(shù)的功能,并非阻塞在持續(xù)時(shí)間之內(nèi)才會(huì)返回,所以對象還沒起振就刪除了。

            震動(dòng)功能的實(shí)現(xiàn)代碼雖然簡單,但是要想震起來還是有點(diǎn)麻煩的,為此我在使用時(shí)除了以上問題,還遇到其它幾個(gè)問題:

            當(dāng)前情景模式里震動(dòng)提示設(shè)置為關(guān)時(shí),顯然會(huì)因?yàn)?/span>

            if ( CVibraControl::EVibraModeON == control->VibraSettings() )

            if ( CHWRMVibra::EVibraModeON == vibra->VibraSettings() )

            兩個(gè)條件判斷沒通過而沒有真實(shí)調(diào)用StartVibraL函數(shù),那么我如果將判斷去掉,始終讓其調(diào)用StartVibraL函數(shù)應(yīng)該也會(huì)震動(dòng)的吧?

            結(jié)果是震動(dòng)函數(shù)返回-21KErrAccessDenied(拒絕接受),這和播放聲音提示時(shí)的效果完全兩樣,所以說讀情景配置模式里的參數(shù)在這里完全是必要的。

            好,那就加判斷,總算執(zhí)行到了StartVibraL (TUint16 aDuration, TInt aIntensity)函數(shù),假如在這里aDuration超過KHWRMVibraMaxDuration,或者aIntensity不在-100100之間(這里的強(qiáng)度值是馬達(dá)的運(yùn)轉(zhuǎn)強(qiáng)度值,負(fù)值是馬達(dá)反轉(zhuǎn),有些文章說該值在+-30范圍內(nèi)會(huì)報(bào)-2KErrGeneral錯(cuò)誤,但是自己用E65親測過,在+-30以內(nèi),沒有報(bào)錯(cuò),震動(dòng)感不強(qiáng)烈而已,可能跟手機(jī)和具體硬件有關(guān)吧),那么震動(dòng)效果又沒有起來,此時(shí)的震動(dòng)函數(shù)返回為-6,即KErrAgument(錯(cuò)誤要求)。

            我們解決了以上兩個(gè)問題后,還有兩種特殊情況,一種是當(dāng)你的手機(jī)在充電時(shí),如果調(diào)用正確的StartVibraL會(huì)返回-22錯(cuò)誤,即KErrLocked(鎖閉)。以上幾種情況還好,雖然不震,但是你可以用TRAP機(jī)制捕獲錯(cuò)誤碼,但是如果當(dāng)你是通過數(shù)據(jù)線的手機(jī)PC模式裝上軟件后沒有拔出數(shù)據(jù)線,就算使用TRAP返回時(shí)KErrNone,但是手機(jī)還是沒有震動(dòng)起來,你就會(huì)頭大了,難道這個(gè)函數(shù)在當(dāng)前手機(jī)上不管用嗎?

            事實(shí)是,當(dāng)你拔掉數(shù)據(jù)線,居然震動(dòng)來了。

            唉,問題總算解決了,代碼雖簡單,但是實(shí)現(xiàn)卻并不簡單啊。

             

            posted on 2009-08-12 17:38 frank.sunny 閱讀(1898) 評論(1)  編輯 收藏 引用 所屬分類: symbian 開發(fā)

            FeedBack:
            # re: 聲音提示和震動(dòng)提示的開發(fā)
            2009-12-08 18:27 | 雨泥
            大哥!你最后是如何實(shí)現(xiàn)手機(jī)震動(dòng)的?我試了好多次東搞不定!請解答,最好附上代碼!  回復(fù)  更多評論
              

            常用鏈接

            留言簿(13)

            隨筆分類

            個(gè)人其它博客

            基礎(chǔ)知識鏈接

            最新評論

            閱讀排行榜

            評論排行榜

            国产精品久久国产精麻豆99网站| 久久久久亚洲精品无码网址| 亚洲AV日韩精品久久久久久| 久久精品国产99久久久古代| 久久er99热精品一区二区| 一本久久久久久久| 国产偷久久久精品专区| 久久精品国产亚洲av水果派| 91精品国产综合久久四虎久久无码一级 | 久久精品aⅴ无码中文字字幕重口| 久久人人爽人人爽人人片av高请| 亚洲综合精品香蕉久久网97| 久久99精品国产麻豆宅宅| 国产成人久久精品激情| 亚洲国产成人久久笫一页| 久久精品99久久香蕉国产色戒| 亚洲国产精品成人久久蜜臀 | 久久亚洲色一区二区三区| 亚洲国产另类久久久精品黑人 | 久久久久久久久66精品片| 热99re久久国超精品首页| 97精品伊人久久久大香线蕉| 久久se精品一区二区影院 | 久久精品女人天堂AV麻| 69久久精品无码一区二区| 久久人人爽人人人人片av| 超级碰久久免费公开视频| 色综合久久天天综合| 久久精品国产亚洲av麻豆色欲| 久久丫忘忧草产品| 亚洲精品无码久久久久AV麻豆| 国产精品免费久久久久电影网| 青青草原综合久久| 99久久精品免费看国产一区二区三区| 欧洲人妻丰满av无码久久不卡| 亚洲国产一成人久久精品| 国产美女亚洲精品久久久综合| 亚洲国产精品久久久天堂| 久久夜色精品国产噜噜麻豆| 久久99精品久久久久久久久久| 国产精品久久永久免费|