1. 程式人生 > >Android FM模組學習之四原始碼解析(三)

Android FM模組學習之四原始碼解析(三)

     由於最近一直忙專案,沒有時間來更新文件,今天抽空來寫一點,希望大家可以學習使用!

     這一章當然還是來分析FM模組的原始碼。FmReceiver.java

publicFmReceiver(String devicePath,FmRxEvCallbacksAdaptor callback) throwsInstantiationException {

      mControl = new FmRxControls();

      mRxEvents = new FmRxEventListner();

      //registerClient(callback);

      mCallback = callback;

   }

/**註冊一個回撥為調頻接收機事件通知。
* < p >

*這是一個同步命令用於註冊的事件通知調頻接收機的司機。自調頻驅動非同步執行一些任務,該功能允許客戶端非同步接收資訊。
* < p >

*在呼叫該函式時,客戶機必須通過一個回撥函式用來實現非同步事件。必須非空值引數的回撥。如果一個NULL值傳遞給這個函式,註冊將會失敗。
* < p >

*客戶端可以選擇哪些事件將從接收器傳送司機只需實現事件希望接收的功能。
* < p >

* @param回撥事件回撥處理事件的調頻接收機。

* @return真如果回撥註冊,假如果回撥註冊失敗了。
*
初始化失敗。
* < p >


* @see #收購
*@see # unregisterClient

**/

public boolean registerClient(FmRxEvCallbacks callback){
      boolean status;
      status = super.registerClient(callback);
      /* Do Receiver Specific Stuff here.*/

      return status;
   }

 /**
   *   使調頻裝置在接收模式。
   *    <p>
   *    這是一個同步的方法用於初始化調頻接收機。
如果已經初始化該函式將intialize接收者使用預設設定。只有在成功地呼叫這個函式的許多調頻裝置介面可以使用。
   *    <p>
   *    使接收者時,客戶機還必須提供的區域設定接收器將運作。這些設定(包括引數configSettings)通常用於設定調頻接收機操作在一個特定的地理區域。這些設定可以更改後啟用調頻驅動程式通過使用函式{ @link #配置}。
   *    <p>

*    這個命令只能出具一個調頻接收器的所有者。發出這個命令,客戶機必須首先成功叫{ @link #獲得}。
   *    <p>
   *    @param configSettings設定開啟收音機時應用
   *    @return真如果初始化成功了,假如果初始化失敗。
   *    <p>
   *@see #啟用
  *@see # registerClient
  *@see #禁用
   *
   */

public boolean enable (FmConfig configSettings)


/ * *
*
重置調頻裝置。
* < p >
*
這是一個同步命令用於重置調頻裝置的狀態不可恢復的錯誤。這個函式時將使用客戶端收到意想不到的廣播通知禁用。曾稱,大多數調頻裝置提供的功能將被禁用,直到客戶端還可以重新開啟裝置再次通過{ @link #可用}。
* < p >

*@return真如果復位成功了,假如果重置失敗了。
@see #啟用
@see #禁用
@see # registerClient
* /

publicboolean reset()


/ * *
*
禁用調頻裝置。
* < p >

*這是一個同步命令用於禁用調頻裝置。時這個函式將使用客戶端不再需要使用調頻裝置。曾稱,大多數調頻裝置提供的功能將被禁用,直到客戶端還可以重新開啟裝置再次通過{ @link #可用}。
* < p >

* @return真如果禁用成功了,假如果禁用失敗了。
@see #啟用
@see # registerClient


* /

publicboolean disable()


/ * *
*
獲取當前搜尋操作的狀態。
* < p >

時這個函式將使用searchStations()函式想知道是否尋求/掃描/自動選擇操作已經正在進行。
如果一個尋求命令時發出一個已經正在進行,我們取消正在尋求命令和開始新的搜尋操作。
* < p >

* @return調頻搜尋操作的當前狀態:
* SRCH_COMPLETE

* SRCH_INPROGRESS
* SRCH_ABORTED
* /

static int getSearchState()


/ * *
*
設定搜尋操作的當前狀態。
* < p >

*這個函式是用於設定當前狀態的搜尋操作。如果一個尋求命令時發出一個已經正在進行,我們取消正在尋求命令,搜尋操作的狀態設定為SRCH_ABORTED和開始新的搜尋。
* < p >

* @return沒有
* /

static void setSearchState(int state)


/ * *
*
啟動基本的尋求和掃描操作。
*

* < p >
*使用此命令來呼叫一個基本尋求/ FM無線電頻段的掃描

* < p >
* < ul >
*這個API用於:<李>呼叫基本尋求操作({ @link # FM_RX_SRCH_MODE_SEEK })<李>呼叫基本的掃描操作({ @link # FM_RX_SRCH_MODE_SCAN })
* < / ul >

* < p >
*這個函式執行的最基本的操作是一個{ @link # FM_RX_SRCH_MODE_SEEK }的命令。遞增或遞減的尋求過程處理頻率在預定義的通道的步驟(由通道間隔定義)和測量得到的訊號電平。一旦成功調站,發現為了達到或超過這個訊號電平,尋求操作將完成和FmRxEvSearchComplete事件將返回給客戶端。如果沒有發現匹配搜尋標準站,頻率將會回到最初調諧。
* < p >

*由於尋求總是導致頻率調諧,每個尋求操作也將返回一個FmRxEvRadioTuneStatus事件到客戶機/應用程式層。
*

* < p >

就像{ @link # FM_RX_SRCH_MODE_SEEK },{ @link # FM_RX_SRCH_MODE_SCAN }命令可以比作許多背靠背尋求一段住在每個成功的追求。一旦釋出,掃描將增量或減量的頻率定義通道間隔直到找到站達到或超過搜尋閾值集。一旦發現本站,併成功地調整,FmRxEvRadioTuneStatus事件將返回給客戶端,車站仍將調整為特定的時間內由引數dwellPeriod表示。時間到期後,FmRxEvSearchInProgress事件將被髮送到客戶端和一個新的將開始尋找下一站符合搜尋閾值。後掃描整個樂隊,或取消後搜尋已經由客戶端發起,FmRxEvRadioTuneStatus事件將被髮送到客戶端。類似於尋求命令,每個掃描將導致至少一個站被調整,即使這是起始頻率。
* < p >

*每次司機啟動搜尋(尋求或掃描)客戶端將通過一個FmRxEvSearchInProgress事件通知。同樣,每次搜尋完成後,客戶端將通過一個FmRxEvRadioTuneStatus事件通知。
* < p >
*搜尋可以在任何時候被取消使用API cancelSearch()。一旦取消,每個搜尋將調到最後一站和生成FmRxEvSearchComplete和FmRxEvRadioTuneStatus事件。有效引數值“模式”:
* < ul >

   * <li>{@link #FM_RX_SRCH_MODE_SEEK}
   *  <li>{@link #FM_RX_SRCH_MODE_SCAN}
* < / ul >
* < p >
*有效引數值“dwellPeriod”:
* < ul >

   *    <li>{@link #FM_RX_DWELL_PERIOD_1S}
   *    <li>{@link #FM_RX_DWELL_PERIOD_2S}
   *    <li>{@link #FM_RX_DWELL_PERIOD_3S}
   *    <li>{@link #FM_RX_DWELL_PERIOD_4S}
   *    <li>{@link #FM_RX_DWELL_PERIOD_5S}
   *    <li>{@link #FM_RX_DWELL_PERIOD_6S}
   *    <li>{@link #FM_RX_DWELL_PERIOD_7S}
* < / ul >
* < p >
*有效引數值“方向”:
* < ul >

   *    <li>{@link #FM_RX_SEARCHDIR_DOWN}
   *    <li>{@link #FM_RX_SEARCHDIR_UP}
* < / ul >
* < p >
* @param模式調頻的搜尋模式。
@param dwellPeriod調頻掃描住時間。只有當使用
模式= { @link # FM_RX_SRCH_MODE_SCAN }
@param方向搜尋方向。


* < p >

* @return真如果搜尋啟動成功了,假如果搜尋啟動失敗。
@see # searchStations(int,int,int,int,int)
@see # searchStationList
* /

public boolean searchStations (int mode,int dwellPeriod,int direction)

public boolean searchStations (int mode,int dwellPeriod,int direction,int pty,int pi)


/ * *啟動站列表搜尋操作。
* < p >
該方法將初啟搜尋,生成基於強和弱電臺的頻率列表中發現的調頻樂隊。
* < p >

* < ul >
*這個API是用於生成站列表包括:
* <li>
強站(FM_RX_SRCHLIST_MODE_STRONGFM_RX_SRCHLIST_MODE_STRONGEST)
* <li>
弱站(FM_RX_SRCHLIST_MODE_WEAKFM_RX_SRCHLIST_MODE_WEAKEST)
* < / ul >

* < p >

*掃描的頻率範圍取決於當前組樂隊。司機搜尋所有有效站在樂隊和完成後,返回一個頻道列表基於客戶的選擇。客戶端可以選擇搜尋中最強的電臺列表樂隊,樂隊最弱的電臺,或第N強弱。通過設定maximumStations引數,客戶端可以限制返回的頻率數在列表中。如果使用者指定引數maximumStations 0,搜尋將生成站的最大數量。


* < p >

*驅動每次啟動一個基於列表的搜尋,客戶端將通過一個FmRxEvSearchInProgress事件通知。類似地,每一次基於列表搜尋完成後,客戶端將通過一個FmRxEvSearchListComplete事件通知。
* < p >

*完成搜尋,最初調諧站將調諧和事件將生成如下:FmRxEvSearchListComplete——搜尋完成。FmRxEvRadioTuneStatus——re-tuned最初的頻率。


* < p >

*一旦發出搜尋命令,多個命令從客戶機可能不允許,直到搜尋完成或取消。
* < p >

搜尋可以在任何時候被取消使用API cancelSearch()。取消搜尋視為完成搜尋和事件將生成如下:FmRxEvSearchComplete——搜尋完成。FmRxEvRadioTuneStatus——re-tuned最初的頻率。
* < p >

* 有效引數值“模式”:
* < ul >

* <li> { @link #FM_RX_SRCHLIST_MODE_STRONG }
* <li> { @link #FM_RX_SRCHLIST_MODE_WEAK }
* <li> { @link #FM_RX_SRCHLIST_MODE_STRONGEST }
* <li> { @link #FM_RX_SRCHLIST_MODE_WEAKEST }
* <li> FM_RX_SRCHLIST_MODE_PTY(將來會實現嗎)
* < / ul >

* < p >
*有效引數值“方向”:

* < ul >   *    <li>{@link #FM_RX_SEARCHDIR_DOWN}
   *    <li>{@link #FM_RX_SEARCHDIR_UP}
* < / ul >
* < p >
* 有效引數值“maximumStations”:1 - 12

< p >
*
@param模式調頻的搜尋模式。
@param方向搜尋方向。
@param maximumStations站的最大數量,可以從搜尋返回。這個引數被忽略和12站返回FM_RX_SRCHLIST_MODE_STRONGEST或FM_RX_SRCHLIST_MODE_WEAKEST如果搜尋模式
@param企業調頻RDS搜尋程式型別(目前不使用)
* < p >

* @return真如果搜尋啟動成功了,假如果搜尋啟動失敗。
@see # searchStations(int,int,int)
@see # searchStations(int,int,int,int,int)
* /

public boolean searchStationList (int mode,int direction,int maximumStations,int pty)


/ * *
*
取消正在進行的搜尋操作 (掃描,尋找searchlist等等)。
* < p >

*這種方法應該用於取消之前啟動搜尋(例如基本尋求/掃描,RDS尋求/掃描、搜尋列表,等)。
* < p >

一旦完成,這個命令將生成一個FmRxEvSearchCancelledtr事件所有註冊的客戶。這個事件後,客戶端還可以接收搜尋事件正在進行相關搜尋正在完成。
*

* < p >
* @return真如果取消搜尋啟動成功,假如果取消搜尋啟動失敗。
@see # searchStations(int,int,int)
@see # searchStations(int,int,int)
@see # searchStationList
* /

關閉搜尋更改狀態

publicboolean cancelSearch ()


/ * *
*
允許調頻接收機靜音和非靜音。
* < p >

*這是一個同步命令用於靜音或un-mute FM音訊。這個命令減弱來自FM音訊裝置。重要的是要注意,這隻會影響調頻音訊而不是其他音訊系統被使用。
* < p >

* @param沉默的模式設定應用模式
* < p >

@return真如果setMuteMode呼叫放置成功,假如果setMuteMode失敗了。
@see #啟用
@see # registerClient
* /

public boolean setMuteMode (int mode)


/ * *

*FM的單聲道/立體聲模式設定。
*

* < p >
*此命令允許使用者設定的單聲道/立體聲模式調頻裝置。使用此功能,使用者可以允許單聲道/立體聲混音或單聲道音訊的接待。
@param stereoEnable如此:支援立體聲,Mono錯誤的:力量
@return真如果setStereoMode呼叫放置成功,假如果setStereoMode失敗了。
* /

public boolean setStereoMode (booleanstereoEnable)


返回當前的RDS / RBDS計劃服務

publicFmRxRdsData  getPSInfo()


/ * *
*
此函式返回一個頻率的列表。
*

* < p >
*該方法獲得的結果{ @link # searchStationList }。這種方法應該呼叫FmRxEvSearchListComplete時呼叫。
* < p >
*@return整數陣列,對應的頻率搜尋電臺
@see # searchStationList
* /

public int[] getStationList ()


/ * *
*
此函式返回當前裝置的訊號強度

*
* < p >

*該方法返回當前的訊號強度調諧。
* < p >
* 目前@return RSSI的調諧
* /

public intgetRssi()


相關推薦

Android FM模組學習原始碼解析

     由於最近一直忙專案,沒有時間來更新文件,今天抽空來寫一點,希望大家可以學習使用!      這一章當然還是來分析FM模組的原始碼。FmReceiver.java publicFmReceiver(String devicePath,FmRxEvCallbacks

Android FM模組學習原始碼解析

  前一章我們瞭解了FM手動調頻,接下來我們要分析FM模組用到的原始碼。此原始碼是基於高通平臺的,別的平臺都大同小異,只不過是平臺自己作了些小改動而已。    首先要看的當然是主activity,

Android FM模組學習原始碼解析

     我今天想分享的是FM模組的儲存方法,即FmSharedPreferences.java FmSharedPreferences(Context context)在構造方法中載入Load()方法, public void  Load(){       Log.d(

Java併發ThreadPoolExecutor原始碼解析

Worker 先前,筆者講解到ThreadPoolExecutor.addWorker(Runnable firstTask, boolean core),在這個方法中工作執行緒可能建立成功,也可能建立失敗,具體視執行緒池的邊界條件,以及當前記憶體情況而定。 那麼,如果執行緒池當前的狀態,是允許建立Worke

一篇文章徹底讀懂HashMapHashMap原始碼解析

就身邊同學的經歷來看,HashMap是求職面試中名副其實的“明星”,基本上每一加公司的面試多多少少都有問到HashMap的底層實現原理、原始碼等相關問題。 在秋招面試準備過程中,博主閱讀過很多關於HashMap原始碼分析的文章,漫長的拼湊式閱讀之後,博主沒有看到過

Deep Learning學習 CNN程式碼解析MATLAB

MATLAB實現CNN一般會用到deepLearnToolbox-master。但是根據Git上面的說明,現在已經停止更新了,而且有很多功能也不太能夠支援,具體的請大家自習看一看Git中的README。 deepLearnToolbox-master是一個深度

Android音視訊學習——Camera2官方demo解析1

本篇內容主要解決螢幕旋轉和Surface旋轉之間的關係,使相機的預覽畫面與螢幕旋轉方向一致。 在官方demo的開始,定義了一個SparseIntArray,用來儲存螢幕旋轉的key和value: private static final Sparse

Android音視訊學習——Camera2官方demo解析2

本篇主要就幾個關鍵的類進行解釋,並且對需要注意的點註釋,此外再總結一下如何使用Camera2進行拍照和預覽的流程。附上官方demo。 上面是Camera2的流程示意圖,由於我喜歡從整體思路上分析程式碼,所以下面先就整個呆萌的思路拓展一下。 首先肯

MyBatis原始碼解析——Transaction事務模組

1、回顧   之前介紹了Environment環境類,這其實是一個單例類,在MyBatis執行開啟後只會存在一個唯一的環境例項,雖然我們可以在Configuration配置檔案中配置多個環境,但是專案執行中只會存在其中的一個,一般專案會存在開發環境和測試環境、生產環境三

死磕 java同步系列ReentrantLock原始碼解析——公平鎖、非公平鎖

問題 (1)重入鎖是什麼? (2)ReentrantLock如何實現重入鎖? (3)ReentrantLock為什麼預設是非公平模式? (4)ReentrantLock除了可重入還有哪些特性? 簡介 Reentrant = Re + entrant,Re是重複、又、再的意思,entrant是enter的名詞或

死磕 java同步系列ReentrantLock原始碼解析——條件鎖

問題 (1)條件鎖是什麼? (2)條件鎖適用於什麼場景? (3)條件鎖的await()是在其它執行緒signal()的時候喚醒的嗎? 簡介 條件鎖,是指在獲取鎖之後發現當前業務場景自己無法處理,而需要等待某個條件的出現才可以繼續處理時使用的一種鎖。 比如,在阻塞佇列中,當佇列中沒有元素的時候是無法彈出一個元素

Spring原始碼解析——元件註冊3

@Scope設定元件作用域 import com.ken.domain.Person; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Config

java集合原始碼解析--List

今天給大家帶來有序集合的介面List,我想也應該是大家在工作中用的比較多的 先來看看介面的定義: public interface List<E> extends Collection<E>可以看出介面List直接繼承於介面Collection,並且一樣使用了

Android編譯系統分析幾個關鍵點

已開通新的部落格,後續文字都會發到新部落格 http://www.0xfree.top Android 編譯系統解析系列文件 解析lunch的執行過程以及make執行過程中include檔案的順序 Android編譯系統分析之lunch分析 Android

Spring原始碼解析:父子容器的概念

  相信大家現在在使用spring專案開發時可能不只是單單使用spring一個框架進行開發, 可能會用到現在主流的ssm,spring和springmvc一起使用。   而在一起使用的時候我就發現了一個問題,在web.xml配置spring容器初始化的時候存在一個問題。     一般我們在配置sprin

JavaScript學習小白篇

好好學習 ,天天向上。Are you ready? 一、什麼是迴圈結構? 滿足一定條件 ,(重複)執行一段程式碼。 二、迴圈思想是什麼? 從哪開始迴圈(迴圈起點) 到哪裡結束(迴圈終點) 步進(步長)(促使迴圈結束) 三、實現迴圈的語句有哪些? while 迴圈,當型迴圈 格

Redis5.0原始碼解析----------字典詳細

基於Redis5.0 在字典中, 一個鍵(key)可以和一個值(value)進行關聯(或者說將鍵對映為值), 這些關聯的鍵和值就被稱為鍵值對 字典中的每個鍵都是獨一無二的, 程式可以在字典中根據鍵查詢與之關聯的值, 或者通過鍵來更新值, 又或者根據鍵來刪除整個鍵值對

OKHttp 3.10原始碼解析:快取機制

本篇我們來講解OKhttp的快取處理,在網路請求中合理地利用本地快取能有效減少網路開銷,提高響應速度。HTTP報頭也定義了很多控制快取策略的域,我們先來認識一下HTTP的快取策略。 一.HTTP快取策略 HTTP快取有多種規則,根據是否需要向伺服器發起請求來分類,我們將其分為兩大類:強制

基於django 開發的框架 jumpserver 原始碼解析

   基於 rest_framework 的 url 路由 跟 資料 跟 前端互動。   為了要讓 django 支援 RESTful 風格 的 介面 需要 用到 第三方元件,來 分析下rest_framework  對 request 做了什麼 ,又對

ElasticSearch原始碼解析:索引建立

我們先來看看索引建立的事例程式碼: Directory directory = FSDirectory.getDirectory("/tmp/testindex"); // Use standard analyzer Analyzer analyzer = new