前几章我们分析了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;
} 总结:总体来说比较单一,结构清晰,简单易懂。

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

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

    在进行gevent源码学习一分析之后,我还对两个比较核心的问题抱有疑问: 1. gevent.Greenlet.join()以及他的list版本joinall()的原理和使用. 2. 关于在使用mon ...

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

    接着看FM模块的其他几个次要的类的源码.这样来看FM上层的东西不是太多. 请看android\vendor\qcom\opensource\fm\fmapp2\src\com\caf\fmradio\ ...

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

    Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 前一章我们了解了FM手动调频,接下 ...

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

    转自:http://blog.csdn.net/tfslovexizi/article/details/41516149?utm_source=tuicool&utm_medium=refer ...

  5. 以太坊的crypto模块--以太坊源码学习

    以太坊的crypto模块 该模块分为两个部分一个是实现sha3,一个是实现secp256k1(这也是比特币中使用的签名算法). 需要说明的是secp256k1有两种实现方式,一种是依赖libsecp2 ...

  6. 以太坊系列之三: 以太坊的crypto模块--以太坊源码学习

    以太坊的crypto模块 该模块分为两个部分一个是实现sha3,一个是实现secp256k1(这也是比特币中使用的签名算法). 需要说明的是secp256k1有两种实现方式,一种是依赖libsecp2 ...

  7. 菜鸟学习Fabric源码学习 — Endorser背书节点

    Fabric 1.4 源码分析 Endorser背书节点 本文档主要介绍fabric背书节点的主要功能及其实现. 1. 简介 Endorser节点是peer节点所扮演的一种角色,在peer启动时会创建 ...

  8. 菜鸟学习Fabric源码学习 — kafka共识机制

    Fabric 1.4源码分析 kafka共识机制 本文档主要介绍kafka共识机制流程.在查看文档之前可以先阅览raft共识流程以及orderer服务启动流程. 1. kafka 简介 Kafka是最 ...

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

    Fabric 1.4 源码分析 背书节点和链码容器交互 本文档主要介绍背书节点和链码容器交互流程,在Endorser背书节点章节中,无论是deploy.upgrade或者调用链码,最后都会调用Chai ...

随机推荐

  1. [转]NPOI 单元格级别应用

    原文地址:http://hi.baidu.com/linrao/item/fadf96dce8770753d63aaef2 HSSFWorkbook hssfworkbook = new HSSFWo ...

  2. Flowplayer-Subtitle

    SOURCE URL: https://flowplayer.org/docs/subtitles.html Setting up Subtitles are loaded with a <tr ...

  3. assigning to 'id<UIGestureRecognizerDelegate> _Nullable' from incompatible

    tip:参考 http://stackoverflow.com/questions/9861538/assigning-to-iddelegate-from-incompatible-type-vie ...

  4. mysql多表查询例子

    [理解方式]先分别找出每个表中查询出来的结果,然后再将两个结果合并. create database test charset utf8 collate utf8_bin;use test;creat ...

  5. struts入门初步(一)

      struts2.0与struts1.0运用了不同的框架,有一定的不兼容性. struts2.0借鉴了webwork的框架思想. Struts2的基本步骤: 1.拷贝struts的jar到项目中(导 ...

  6. static代码块与{}代码块的比较

    第一个例子: public class StaticDemo { { System.out.println("{} 代码块"); } static{ System.out.prin ...

  7. windows下的Nodejs及npm的安装、常用命令,Nodejs开发环境配置

    http://www.cnblogs.com/webstorm/p/5744942.html ***************************************** 第一步:下载Nodej ...

  8. java中获取ServletContext常见方法

    http://blog.sina.com.cn/s/blog_3fe961ae0100wjnf.html 1.在javax.servlet.Filter中直接获取 ServletContext con ...

  9. 【ros】rplidar Hector Slam

    想用rplidar跑一下hector slam,在网上发现了几个教程写的都不错,但是亲测发现都有点不足,综合了一下,进行补充. 1. 安装ros 和 创建工作空间 http://blog.csdn.n ...

  10. 安卓设备通过USB接口读取UVC摄像头权限问题

    libusb for Android================== Building:--------- To build libusb for Android do the following ...