前几章咱们分析了FM模块的几个主要的类文件,今天要分析的是:FMTransceiver.javajava
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状态:app
*FM 在任什么时候候都处于如下四种状态中的一种:异步
*“0”——FMState_Turned_Off函数
* ' 1 ' - FMState_Rx_Turned_Onui
* ' 2 ' - FMState_Tx_Turned_Onspa
“3”——FMState_Srch_InProg.net
* /版本控制
/ * *code
*容许访问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>
*/
/**
* 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; }