免费高清特黄a大片,九一h片在线免费看,a免费国产一级特黄aa大,国产精品国产主播在线观看,成人精品一区久久久久,一级特黄aa大片,俄罗斯无遮挡一级毛片

分享

第十八篇 ANDROID的聲音管理系統(tǒng)及服務(wù)

 kkq292 2014-06-04

第十八篇 ANDROID的聲音管理系統(tǒng)及服務(wù)

分類: android 143人閱讀 評(píng)論(0) 收藏 舉報(bào)

         聲音管理系統(tǒng)用來實(shí)現(xiàn)聲音的輸入和輸出、聲音的控制和路由等功能,包括主和各種音源的音量調(diào)節(jié)、聲音焦點(diǎn)控制,聲音外設(shè)的檢測(cè)和狀態(tài)管理,聲音源輸入和輸出的策略管理、音效的播放、音軌設(shè)置和播放、錄音設(shè)置和啟動(dòng)等功能。

整個(gè)聲音管理系統(tǒng)相關(guān)類圖如下:主要由JAVA端的系統(tǒng)服務(wù)AudioService及兩個(gè)本地服務(wù)聲音輸入輸出策略管理服務(wù)AudioPolicyService及聲音輸出投射服務(wù)AudioFlinger來實(shí)現(xiàn)相關(guān)功能。

應(yīng)用主要通過AudioManage接口來使用AudioService提供的服務(wù)。系統(tǒng)服務(wù)AudioService與兩個(gè)本地服務(wù)之間通過AudioSystem類提供的接口借助JNI進(jìn)行交互。

     系統(tǒng)服務(wù)AudioService使用藍(lán)牙監(jiān)聽對(duì)象BluetoothProfile.ServiceListener來監(jiān)聽藍(lán)牙框架服務(wù)HeadsetProfileHeadsetProfile的連接,并獲得兩個(gè)藍(lán)牙框架服務(wù)的客戶端對(duì)象BluetoothHeadsetBluetoothA2dp來與對(duì)應(yīng)的藍(lán)牙框架服務(wù)實(shí)現(xiàn)交互。使用一個(gè)AudioServiceBroadcastReceiver廣播接收對(duì)象來監(jiān)聽基座狀態(tài)事件、藍(lán)牙連接狀態(tài)改變事件、外設(shè)插拔事件、聲音狀態(tài)改變事件、屏幕打開關(guān)閉事件、配置改變事件、用戶切換事件等事件并進(jìn)行相應(yīng)處理。

           當(dāng)檢測(cè)到需要切換聲音路由時(shí),由相關(guān)應(yīng)用通過AudioManage接口調(diào)用AudioService系統(tǒng)服務(wù)提供的setWiredDeviceConnectionState、setBluetoothA2dpDeviceConnectionState()接口來發(fā)起或AudioService系統(tǒng)服務(wù)本身檢測(cè)到相關(guān)的事件來觸發(fā)媒體路由切換,并通過IAudioRoutesObserver接口調(diào)用dispatchAudioRoutesChanged()函數(shù)來通知媒體路由切換相關(guān)進(jìn)程和服務(wù)進(jìn)行相應(yīng)處理。

           

    

         聲音焦點(diǎn)控制主要有AudioService系統(tǒng)服務(wù)提供的MediaFocusControl對(duì)象進(jìn)行控制。聲音焦點(diǎn)控制實(shí)現(xiàn)同時(shí)只有一個(gè)應(yīng)用能夠獲得焦點(diǎn)播放同種類型的聲音,ANDROID提供和支持STREAM_VOICE_CALL(電話呼叫)、STREAM_SYSTEM(系統(tǒng))、STREAM_RING(振鈴和消息提示)、STREAM_MUSIC(音樂媒體播放)、STREAM_ALARM(警報(bào)聲)、STREAM_NOTIFICATION(通知音)、STREAM_BLUETOOTH_SCO(藍(lán)牙電話)、STREAM_SYSTEM_ENFORCED(強(qiáng)制系統(tǒng)聲音)、STREAM_DTMFDTMF撥號(hào)音)及STREAM_TTS(文本識(shí)別音)九種聲音流類型,每種類型可以獨(dú)立的調(diào)節(jié)聲音大小,其中除了STREAM_MUSIC類型是應(yīng)用播放媒體使用的類型外其它都是系統(tǒng)要處理的聲音類型。MediaFocusControl對(duì)象的相關(guān)類圖如下:

      

       本地服務(wù)AudioPolicyService提供不同聲音流類型對(duì)應(yīng)的輸入輸出設(shè)備的策略獲取及策略的選擇和控制(輸入輸出選擇、輸入輸出設(shè)備的打開和停止、關(guān)閉等)、設(shè)置和獲取聲音設(shè)備的連接狀態(tài)以及不同流類型對(duì)應(yīng)的設(shè)備的音量的設(shè)置和獲取、音頻參數(shù)的設(shè)置、音效設(shè)置等功能。類圖如下:

       

      AudioPolicyService有一個(gè)內(nèi)部線程類AudioCommandThread,顧名思義,所有的命令(音量控制,輸入、輸出的切換等)最終都會(huì)在該線程中排隊(duì)執(zhí)行;

       

            AudioPolicyService實(shí)例化時(shí)調(diào)用audio_policy_dev_open函數(shù)打開一個(gè)聲音策略設(shè)備,并通過聲音策略設(shè)備的create_audio_policy接口返回一個(gè)audio_policy策略函數(shù)結(jié)構(gòu)體指針,AudioPolicyService對(duì)應(yīng)的函數(shù)通過這個(gè)audio_policy函數(shù)結(jié)構(gòu)體指針調(diào)用聲音策略設(shè)備的對(duì)應(yīng)函數(shù)實(shí)現(xiàn)設(shè)備的策略控制,在AudioPolicyService調(diào)用create_audio_policy函數(shù)時(shí)也把AudioPolicyService內(nèi)部的一個(gè)audio_policy_service_ops函數(shù)結(jié)構(gòu)體傳給聲音策略設(shè)備對(duì)象,供聲音策略設(shè)備對(duì)象內(nèi)部調(diào)用。聲音策略設(shè)備使用create_audio_policy函數(shù)除了為audio_policy策略函數(shù)結(jié)構(gòu)體函數(shù)指針賦值以外,還實(shí)例了兩個(gè)對(duì)象,一個(gè)AudioPolicyClientInterface對(duì)象,作為AudioPolicyService客戶端使用,聲音策略設(shè)備使用AudioPolicyClientInterface對(duì)象通過AudioPolicyService的內(nèi)部接口audio_policy_service_op調(diào)用AudioPolicyService的相關(guān)函數(shù);另外一個(gè)對(duì)象為具體的實(shí)現(xiàn)相關(guān)聲音策略接口的AudioPolicyInterface對(duì)象,這里采用的是設(shè)計(jì)模式的策略模式,這也是AudioPolicyService稱為聲音策略服務(wù)的原因吧, AudioPolicyInterface接口的具體實(shí)例的創(chuàng)建采用了工廠方法。


           下面以AudioPolicyServicegetInput函數(shù)為例子具體說明整個(gè)調(diào)用流程。AudioPolicyServicegetInput函數(shù)實(shí)現(xiàn)根據(jù)函數(shù)傳進(jìn)來的聲音輸入類型、采樣率、聲音格式、通道掩碼參數(shù)打開一個(gè)輸入設(shè)備,整個(gè)流程為:


  1. AudioPolicyServicegetInput首先通過create_audio_policy獲得的audio_policy函數(shù)結(jié)構(gòu)體指針調(diào)用其get_input函數(shù);

  2. get_input函數(shù)然后調(diào)用create_audio_policy內(nèi)部采用工廠方法createAudioPolicyManager創(chuàng)建的具體AudioPolicyInterface對(duì)象的getInput函數(shù)。

  3. AudioPolicyInterface對(duì)象的getInput函數(shù)內(nèi)部首先調(diào)用getDeviceForInputSource函數(shù)根據(jù)函數(shù)傳進(jìn)來的輸入源類型獲得對(duì)應(yīng)的audio_devices_t設(shè)備類型,然后調(diào)用getInputProfile函數(shù)根據(jù)傳進(jìn)來的聲音采樣率、聲音格式、通道掩碼等參數(shù)與獲得的設(shè)備支持的Input Profile比較返回一個(gè)與設(shè)備Profile匹配的IOProfile,然后根據(jù)返回的IOProfile對(duì)象構(gòu)造一個(gè)AudioInputDescriptor對(duì)象添加到輸入描述數(shù)組中,并調(diào)用create_audio_policy內(nèi)部創(chuàng)建的一個(gè)具體AudioPolicyClientInterface對(duì)象的openInput函數(shù);

  4. AudioPolicyClientInterface對(duì)象的openInput函數(shù)調(diào)用AudioPolicyService內(nèi)部audio_policy_service_op函數(shù)結(jié)構(gòu)體的open_input_on_module函數(shù);

  5. audio_policy_service_op函數(shù)結(jié)構(gòu)體的open_input_on_module函數(shù)指針指向AudioPolicyServiceaps_open_input_on_module函數(shù),因此調(diào)用aps_open_input_on_module,aps_open_input_on_module內(nèi)部首先AudioSystem類的get_audio_flinger函數(shù)獲得IAudioFlinger接口,然后通過IAudioFlinger接口調(diào)用AudioFlinger服務(wù)的openInput函數(shù),打開選擇的輸入設(shè)備,返回AudioPolicyServicegetInput函數(shù)一個(gè)audio_io_handle_t句柄;

            AudioPolicyServicegetInput函數(shù)接著根據(jù)傳進(jìn)來的audioSession參數(shù)構(gòu)造一個(gè)InputDesc對(duì)象根據(jù)getInput函數(shù)返回的audio_io_handle_t句柄添加到向量數(shù)組中,根據(jù)輸入源類型從支持的輸入源向量列表獲得該輸入源支持的EffectDesc數(shù)組,并對(duì)每一個(gè)EffectDesc根據(jù)EffectDescUuid、返回的audio_io_handle_t句柄及audioSession參數(shù)實(shí)例化一個(gè)AudioEffect對(duì)象,并調(diào)用AudioEffect對(duì)象的setParameter函數(shù)為每一個(gè)EffectDesc設(shè)置聲音參數(shù)。每個(gè)AudioEffect對(duì)象也添加到InputDesc對(duì)象AudioEffect的數(shù)組中。完成整個(gè)流程。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多