前幾章我們分析了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;
}