天天看點

Android FM子產品學習之四源碼分析(五)

      前幾章我們分析了FM子產品的幾個主要的類檔案,今天要分析的是:FMTransceiver.java

public class FmTransceiver
{
   /* Primary FM States :
    * FM will be in one of the 4 states at any point of time
    *    '0'  - FMState_Turned_Off
    *    '1'  - FMState_Rx_Turned_On
    *    '2'  - FMState_Tx_Turned_On
    *    '3'  - FMState_Srch_InProg
   */
<pre name="code" class="java">   public static final int FMState_Turned_Off   = 0;
   public static final int FMState_Rx_Turned_On = 1;
   public static final int FMState_Tx_Turned_On = 2;
   public static final int FMState_Srch_InProg  = 3;
           

/ *FM狀态:

*FM 在任何時候都處于以下四種狀态中的一種:

*“0”——FMState_Turned_Off

* ' 1 ' - FMState_Rx_Turned_On

* ' 2 ' - FMState_Tx_Turned_On

“3”——FMState_Srch_InProg

* /

/ * *

*允許通路V4L2 FM裝置。

*這種同步調用允許用戶端使用V4L2調頻裝置。這一定是第一次調用之前釋出的用戶端可以使用任何接收器接口。

*

*這也叫權力的調頻子產品。

*

* @param裝置路徑字元串,無線電裝置

*

* @return真

如果V4L2調頻裝置了,假如果V4L2調頻裝置不能被收購,可能被其他客戶

* @see #釋放

*

* /

protected boolean acquire(String device){
      boolean bStatus = true;
      if (sFd <= 0) { // if previous open fails fd will be -ve.
         sFd = FmReceiverJNI.acquireFdNative(V4L2_DEVICE);

         if (sFd > 0) {
            Log.d(TAG, "Opened "+ sFd);
            bStatus = true;
         }
         else {
            Log.d(TAG, "Fail to Open "+ sFd);
	    bStatus = false;
         }
           

/ * *

*釋出通路V4L2調頻裝置。

* < p >

這個同步調用允許用戶端版本控制V4L2調頻裝置。 這個函數應該被稱為調頻裝置時不再需要。 這應該是最後一次調頻客戶發行的調用。 一旦調用,用戶端必須調用#acquire來重新請求 V4L2裝置控制調頻裝置,可以再次使用。

* < p >

之前用戶端可以釋放控制調頻接收機接口,它必須禁用調頻接收器,如果用戶端啟用它,并登出注冊的回調函數。 如果用戶端接收方的所有權,它将自動傳回到系統。

* < p >

*這也叫權力的調頻子產品。

* < p >

* @param無線電裝置路徑字元串,

* @return真 如果V4L2調頻裝置釋放,假如果V4L2調頻裝置不能被釋放

* @see #收購

* /

static boolean release(String device) {
      if (sFd!=0)
      {
         FmReceiverJNI.closeFdNative(sFd);
         sFd = 0;
         Log.d("FmTransceiver", "Turned off: " + sFd);
      } else
      {
         Log.d("FmTransceiver", "Error turning off");
      }
      return true;
   }
           
public boolean registerClient(FmRxEvCallbacks callback){
      boolean bReturnStatus = false;
      if (callback!=null)
      {
         mRxEvents.startListner(sFd, callback);
         bReturnStatus = true;
      } else
      {
         Log.d(TAG, "Null, do nothing");
      }
      return bReturnStatus;
   }
           

/**

   *    登出客戶的事件通知回調。

   *    <p>

   *   這是一個同步調用用于登出客戶的事件回調。

   *    <p>

   *    @return true always.

   *    @see  #acquire

   *    @see  #release

   *    @see  #registerClient

   *

public boolean unregisterClient () {
      mRxEvents.stopListener();
      return true;
   }
           
public boolean registerTransmitClient( FmTransmitterCallbacks callback){
      boolean bReturnStatus = false;
      if (callback!=null)
      {
         mTxEvents.startListner(sFd, callback);
         bReturnStatus = true;
      } else
      {
         Log.d(TAG, "Null, do nothing");
      }
      return bReturnStatus;
   }
           
public boolean unregisterTransmitClient () {
      mTxEvents.stopListener();
      return true;
   }
           
public boolean enable (FmConfig configSettings, int device){

      boolean status;
      //Acquire the deviceon Enable
      if( !acquire("/dev/radio0")){
         return false;
      }
      Log.d(TAG, "turning on " + device);
      mControl.fmOn(sFd, device);

      Log.d(TAG, "Calling fmConfigure");
      status = FmConfig.fmConfigure (sFd, configSettings);
      if (!status) {
          Log.d(TAG, "fmConfigure failed");
          FmReceiverJNI.closeFdNative(sFd);
          sFd = 0;
      }
      return status;
   }
           
public boolean disable(){
      mControl.fmOff(sFd);
      return true;
   }
           
public boolean configure(FmConfig configSettings){
      boolean status=true;
      int lowerFreq = configSettings.getLowerLimit();
      Log.d(TAG, "fmConfigure");
      status = FmConfig.fmConfigure (sFd, configSettings);
      status = setStation (lowerFreq);
      return status;
   }
           
public boolean setStation (int frequencyKHz) {
      int ret;

      mControl.setFreq(frequencyKHz);
      ret = mControl.setStation(sFd);
      if(ret < 0 )
      {
         return false;
      }
      else
      {
         return true;
      }
   }
           
public void setNotchFilter(boolean value) {
	FmReceiverJNI.setNotchFilterNative(sFd, V4L2_CID_PRIVATE_TAVARUA_SET_NOTCH_FILTER, value);
   }
           
public boolean setAnalogMode(boolean value) {
        int re = mControl.setAudioPath(sFd, value);
        re = FmReceiverJNI.setAnalogModeNative(value);
        if (re == 1)
            return true;
        return false;
   }
           
public boolean getInternalAntenna()
   {

       int re = FmReceiverJNI.getControlNative (sFd, V4L2_CID_PRIVATE_TAVARUA_ANTENNA);

       if (re == 1)
         return true;

       return false;
   }
           
public boolean setInternalAntenna(boolean intAnt)
   {

       int iAntenna ;

       if (intAnt)
          iAntenna = 1;
       else
          iAntenna = 0;


       int re = FmReceiverJNI.setControlNative (sFd, V4L2_CID_PRIVATE_TAVARUA_ANTENNA, iAntenna);

       if (re == 0)
         return true;

       return false;
   }
           
static void setFMPowerState(int state)
   {
      FMState = state;
   }
           
public static int getFMPowerState()
   {
      return FMState;
   }