Android FM模块学习之四源码学习(2)

前几章我们分析了FM模块的几个主要的类文件,今天要分析的是:FMTransceiver.java   // 某些工程中名称为FMRadioService.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;
   }

/**
   *  注册一个回调为调频接收机事件通知。
   *    <p>
   *   这是一个同步调用注册用于调频接收机的事件通知司机。自调频驱动异步执行一些任务,该功能允许客户端异步接收信息。
   *    <p>
   *   在调用该函数时,客户机必须通过一个回调函数用来实现异步事件。必须非空值参数的回调。如果一个NULL值传递给这个函数,注册将会失败。
   *    <p>
   *    客户端可以选择哪些事件将从接收器发送司机只需实现事件希望接收的功能。
   *    <p>
@param回调事件回调处理事件的调频接收机。
@return真如果回调注册,假如果回调注册失败了。
@see #acquire
@see # unregisterClient
   *
   */

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;
   }

/**
   *    注册一个回调为调频发射机事件通知。

*    <p>

*    这是一个同步调用注册用于事件通知的调频发射机的司机。 自调频驱动异步执行一些任务,该功能允许客户端异步接收信息。

*    <p>

*    在调用该函数时,客户机必须通过一个回调函数用来实现异步事件。 必须非空值参数的回调。 如果一个NULL值传递给这个函数,注册将会失败。

*    <p>

*   客户端可以选择哪些事件将从接收器发送司机只需实现事件希望接收的功能。

*    <p>

*    @param 回调事件回调处理事件的调频发射机。

*    @return true 如果回调注册,假回调注册失败。

*    @see #acquire

*    @see #unregisterTransmitClient

*

*/

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;
   }

/**
   *    注销发射机事件通知回调。

*    <p>

*    这是一个同步调用用于注销发射机客户的事件回调。

*    <p>

*    @return true always.

*

*    @see  #acquire

*    @see  #release

*    @see  #registerTransmitClient

*

*/

public boolean unregisterTransmitClient () {
      mTxEvents.stopListener();
      return true;
   }

/**
   *   初始化 FM .
   *    <p>
   *  这是一个同步调用用于初始化调频tranceiver。如果已经初始化该函数将intialize tranceiver默认设置。只有在成功地调用这个函数的许多调频设备接口可以使用。
   *    <p>
   *    使接收者时,客户机还必须提供的区域设置接收器将运作。这些设置(包括在configSettings)通常用于设置调频接收机操作在一个特定的地理区域。这些设置可以更改后启用调频驱动程序通过使用#配置功能。
   *    <p>
   *    这个电话只能出具一个调频接收器的所有者。发行这个调用,客户机必须首先成功地调用#qcquire。
   *    <p>
   *    @param configSettings  the settings to be applied when
   *                             turning on the radio
   *    @return true if Initialization succeeded, false if
   *            Initialization failed.
   *    @see   #registerClient
   *    @see   #disable
   *
   */

 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;
   }

/**

*    禁用 FM .

*    <p>

*   这是一个同步调用用于禁用调频装置。 时这个函数将使用客户端不再需要使用调频装置。 曾称,大多数调频装置提供的功能将被禁用,直到客户端通过#设备再次启用。

*    <p>

*    @return true if disabling succeeded, false if disabling

*            failed.

*    <p>

*    @see   #enable

*    @see   #registerClient

*/

public boolean disable(){
      mControl.fmOff(sFd);
      return true;
   }

/**
   *    重新配置设备的区域设置

*    (FM Band, De-Emphasis, Channel Spacing, RDS/RBDS mode).

*    <p>

*  这是一个同步调用用于调频设备上的配置设置。 包含在结构通过设置通常不同于一个地理区域到另一个地方。

*    <p>

*    @param configSettings    Contains settings for the FM radio

*                             (FM band, De-emphasis, channel

*                             spacing, RDS/RBDS mode)

*    <p>

*    @return      true if configure succeeded, false if

*                 configure failed.

*/

 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;
   }

/**
    *   音乐调频设备指定的FM频率。

*    <p>

*    这种方法音乐电台的调频装置提供指定的频率。 唯一有效频率带内启用或设定的配置可以通过这个功能来调谐。 试图调整频率集之外的乐队将导致一个错误。

*    <p>

*   一旦完成调到指定的频率,事件回调FmRxEvRadioTuneStatus将被调用。

*

*    @param frequencyKHz  Frequency (in kHz) to be tuned

*                         (Example: 96500 = 96.5Mhz)

*   @return true if setStation call was placed successfully,

*           false if setStation failed.

*/

public boolean setStation (int frequencyKHz) {
      int ret;

      mControl.setFreq(frequencyKHz);
      ret = mControl.setStation(sFd);
      if(ret < 0 )
      {
         return false;
      }
      else
      {
         return true;
      }
   }

/**
    *    设置所需的WAN避免陷波滤波器。

*    <p>

*  这个方法设置所需的陷波滤波器基于当前WAN带频率达到FM-WAN并发性。 应用程序应该听数据调用事件和调用函数在每个数据调用连接让u,实现FM-WAN并发性。

*

*/

 public void setNotchFilter(boolean value) {
	FmReceiverJNI.setNotchFilterNative(sFd, V4L2_CID_PRIVATE_TAVARUA_SET_NOTCH_FILTER, value);
   }

/**
    *   启用/禁用模拟低电力模式。
    *    <p>
    *   这种方法启用/禁用模拟低电力模式。
    *
    */

public boolean setAnalogMode(boolean value) {
        int re = mControl.setAudioPath(sFd, value);
        re = FmReceiverJNI.setAnalogModeNative(value);
        if (re == 1)
            return true;
        return false;
   }

/**
   *  返回true,如果内部调频天线
   *
   *    <p>
   *   该方法返回true内部FM天线可用,否则假
   *    <p>
   *    @return    true/false
   */

 public boolean getInternalAntenna()
   {

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

       if (re == 1)
         return true;

       return false;
   }

/**

*   否则返回true,如果成功,则返回false

*    <p>

*  该方法内部天线类型设置为true / false

*

*    @param intAntenna true is 内部天线存在

*

*    <p>

*    @return    true/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;
   }

/**
   *  设置FM 电源状态

*

*    <p>

*   该方法集调频电源状态。

*    <p>
   */

static void setFMPowerState(int state)
   {
      FMState = state;
   }

/**
   *    Returns :

*

*        FMOff        - If the FM Radio is turned off

*        FMRxOn       - If the FM Receiver is currently turned on

*        FMTxOn       - If the FM Transmitter is currently turned on

*        FMReset      - If the FM Radio is reset

*

*    Gets the FM power state

*

*    <p>

*    This method gets the FM power state.

*

*    <p>

*/

 public static int getFMPowerState()
   {
      return FMState;
   }

总结:总体来说比较单一,结构清晰,简单易懂。
时间: 2024-11-03 22:51:24

Android FM模块学习之四源码学习(2)的相关文章

Android FM模块学习之四源码解析(二)

上一章我们了解了FM主activity:FMRadio.java,若没查看的,请打开链接Android FM模块学习之四源码解析(一) 查看fmradio.java源码注释.接下来我们来看看FM重要的一个类:FMRadioService.java 由上一章我们已经知道,打开FM时,在OnStart函数中会bindToService来开启服务, public boolean bindToService(Context context, ServiceConnection callback) { L

python 协程库gevent学习--gevent源码学习(二)

在进行gevent源码学习一分析之后,我还对两个比较核心的问题抱有疑问: 1. gevent.Greenlet.join()以及他的list版本joinall()的原理和使用. 2. 关于在使用monkey_patchall()之后隐式切换的问题. 下面我将继续通过分析源码及其行为来加以理解和掌握. 1. 关于gevent.Greenlet.join()(以下简称join)先来看一个例子: import gevent def xixihaha(msg): print(msg) gevent.sl

Android FM模块学习之四源码解析(三)

由于最近一直忙项目,没有时间来更新文档,今天抽空来写一点,希望大家可以学习使用! 这一章当然还是来分析FM模块的源码.FmReceiver.java publicFmReceiver(String devicePath,FmRxEvCallbacksAdaptor callback) throwsInstantiationException { mControl = new FmRxControls(); mRxEvents = new FmRxEventListner(); //registe

Android FM模块学习之四源码分析(3)

接着看FM模块的其他几个次要的类的源码.这样来看FM上层的东西不是太多. 请看android\vendor\qcom\opensource\fm\fmapp2\src\com\caf\fmradio\Settings.java protected void onCreate(BundlesavedInstanceState) 从FMRadio.java用使用Intent跳转携带参数过来,在onCreate获取携带数据. protected void onCreate(Bundle savedIn

Android FM模块学习之四源码解析(一)

前一章我们了解了FM手动调频,接下来我们要分析FM模块用到的源码.此源码是基于高通平台的,别的平台都大同小异,只不过是平台自己作了些小改动而已. 首先要看的当然是主activity, FMRadio.java fmradio类启动FMRadioService.java类调用FmSharedPreferences类进行存储数据,PresetStation调整频率 setVolumeControlStream(AudioManager.STREAM_MUSIC);音乐回放即媒体音量 LoadedDa

Android FM模块学习之四源码解析(四)

我今天想分享的是FM模块的保存方法,即FmSharedPreferences.java FmSharedPreferences(Context context)在构造方法中加载Load()方法, public void  Load(){       Log.d(LOGTAG, "Load preferences ");       if(mContext == null)       {          return;       } SharedPreferences sp = m

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' -

前端学习-jQuery源码学习

jQuery 2 的版本与jQuery 1的版本相比,没有再考虑IE6,7,8的兼容问题,因此使用时如果不用考虑IE6,7,8就用jQuery 2的版本,如果需要考虑IE6,7,8就使用jQuery 1的版本. jQuery对象是一个以DOM为对象的特殊数组,并包含大量方法,简单可以理解为: function jQuery(){     var jquery = [dom1, dom2, dom3];     jquery.fn1 = function(){-};     jquery.fn2

菜鸟学习Fabric源码学习 — 背书节点和链码容器交互

Fabric 1.4 源码分析 背书节点和链码容器交互 本文档主要介绍背书节点和链码容器交互流程,在Endorser背书节点章节中,无论是deploy.upgrade或者调用链码,最后都会调用ChaincodeSupport.LaunchInit()/Launch()以及ChaincodeSupport.execute()方法.其中Launch()方法启动链码容器,execute()方法调用链码. 1. 准备 ChaincodeSupport.Launch()首先进行判断,根据peer侧该版本链