接上一篇,今天我们来看看android\vendor\qcom\opensource\fm\qcom\fmradio\FmRxControls.java
/ *
*打开FM Rx / Tx。
* Rx = 1和Tx = 2
* /
public void fmOn(int fd, int device) {
int re;
FmReceiverJNI.setControlNative(fd, V4L2_CID_PRIVATE_TAVARUA_STATE, device );
setAudioPath(fd, false);
re = FmReceiverJNI.SetCalibrationNative(fd);
if (re != 0)
Log.d(TAG,"Calibration failed");
}
/ *
*关掉FM Rx / Tx
* /
public void fmOff(int fd){
FmReceiverJNI.setControlNative(fd, V4L2_CID_PRIVATE_TAVARUA_STATE, 0 );
}
/ *
*设置静音控制
* /
public void muteControl(int fd, boolean on) {
if (on)
{
int err = FmReceiverJNI.setControlNative(fd, V4L2_CID_AUDIO_MUTE, 3 );
} else
{
int err = FmReceiverJNI.setControlNative(fd, V4L2_CID_AUDIO_MUTE, 0 );
}
}
/ *
*获得干扰通道
* /
public int IovercControl(int fd)
{
int ioverc = FmReceiverJNI.getControlNative(fd, V4L2_CID_PRIVATE_TAVARUA_IOVERC);
Log.d(TAG, "IOVERC value is : "+ioverc);
return ioverc;
}
/ *
*获得IntDet
* /
public int IntDet(int fd)
{
int intdet = FmReceiverJNI.getControlNative(fd, V4L2_CID_PRIVATE_TAVARUA_INTDET);
Log.d(TAG, "IOVERC value is : "+intdet);
return intdet;
}
/ *
*获得MPX_DCC
* /
public int Mpx_Dcc(int fd)
{
int mpx_dcc = FmReceiverJNI.getControlNative(fd, V4L2_CID_PRIVATE_TAVARUA_MPX_DCC);
Log.d(TAG, "MPX_DCC value is : " + mpx_dcc);
return mpx_dcc;
}
/ *
*设置Hi-Low注入
* /
public int setHiLoInj(int fd, int inj)
{
int re = FmReceiverJNI.setControlNative(fd, V4L2_CID_PRIVATE_TAVARUA_HLSI, inj);
return re;
}
/ *
*set打开通道阈值
* /
public int setOnChannelThreshold(int fd, int sBuff)
{
int re = FmReceiverJNI.setControlNative(fd, V4L2_CID_PRIVATE_TAVARUA_ON_CHANNEL_THRESHOLD, sBuff);
if ( re < 0)
Log.e(TAG, "Failed to set On channel threshold data");
return re;
}
/ *
*set关闭通道阈值
* /
public int setOffChannelThreshold(int fd, int sBuff)
{
int re = FmReceiverJNI.setControlNative(fd, V4L2_CID_PRIVATE_TAVARUA_OFF_CHANNEL_THRESHOLD, sBuff);
if ( re < 0)
Log.e(TAG, "Failed to set Off channel Threshold data");
return re;
}
/ *
*设置音频路径模拟/数字
* /
public int setAudioPath(int fd, boolean value)
{
int mode;
if (value)
mode = FM_ANALOG_PATH;
else
mode = FM_DIGITAL_PATH;
int re = FmReceiverJNI.setControlNative(fd, V4L2_CID_PRIVATE_TAVARUA_SET_AUDIO_PATH, mode);
return re;
}
/ *
*优化调频核心指定的频率。
* /
public int setStation(int fd) {
Log.d(TAG, "** Tune Using: "+fd);
int ret = FmReceiverJNI.setFreqNative(fd, mFreq);
Log.d(TAG, "** Returned: "+ret);
return ret;
}
/ *
*获取FM频率
* /
public int getTunedFrequency(int fd) {
int frequency = FmReceiverJNI.getFreqNative(fd);
Log.d(TAG, "getTunedFrequency: "+frequency);
return frequency;
}
/ *
*获得SINR的价值
* /
public int getSINR(int fd)
{
return FmReceiverJNI.getControlNative(fd, V4L2_CID_PRIVATE_SINR);
}
/ *
*开始自动搜索预设列表
* /
public int searchStationList (int fd, int mode, int preset_num,
int dir, int pty )
{
int re;
/* set search mode. */
re = FmReceiverJNI.setControlNative (fd, V4L2_CID_PRIVATE_TAVARUA_SRCHMODE, mode);
if (re != 0) {
return re;
}
/* set number of stations to be returned in the list */re = FmReceiverJNI.setControlNative (fd, V4L2_CID_PRIVATE_TAVARUA_SRCH_CNT, preset_num);
if (re != 0) {
return re;
}
// RDS search list?
if (pty > 0 ){
re = FmReceiverJNI.setControlNative (fd, V4L2_CID_PRIVATE_TAVARUA_SRCH_PTY, pty);
}
if (re != 0) {
return re;
}
/* This triigers the search and once completed the FM core generates
* searchListComplete event */
re = FmReceiverJNI.startSearchNative (fd, dir );
if (re != 0) {
return re;
}
else {
return 0;
}
}
/ *从缓冲区读取搜索列表* /
public int[] stationList (int fd)
{
int freq = 0;
int i=0, j = 0;
int station_num = 0;
float real_freq = 0;
int [] stationList;
byte [] sList = new byte[100];
int tmpFreqByte1=0;
int tmpFreqByte2=0;
float lowBand, highBand;
lowBand = (float) (FmReceiverJNI.getLowerBandNative(fd) / 1000.00);
highBand = (float) (FmReceiverJNI.getUpperBandNative(fd) / 1000.00);
Log.d(TAG, "lowBand: " + lowBand);
Log.d(TAG, "highBand: " + highBand);
FmReceiverJNI.getBufferNative(fd, sList, 0);
if ((int)sList[0] >0) {
station_num = (int)sList[0];
}
stationList = new int[station_num+1];Log.d(TAG, "station_num: " + station_num);
for (i=0;i<station_num;i++) {
freq = 0;
Log.d(TAG, " Byte1 = " + sList[i*2+1]);
Log.d(TAG, " Byte2 = " + sList[i*2+2]);
tmpFreqByte1 = sList[i*2+1] & 0xFF;
tmpFreqByte2 = sList[i*2+2] & 0xFF;
Log.d(TAG, " tmpFreqByte1 = " + tmpFreqByte1);
Log.d(TAG, " tmpFreqByte2 = " + tmpFreqByte2);
freq = (tmpFreqByte1 & 0x03) << 8;
freq |= tmpFreqByte2;
Log.d(TAG, " freq: " + freq);real_freq = (float)(freq * 50) + (lowBand * FREQ_MUL);//tuner.rangelow * FREQ_MUL;
Log.d(TAG, " real_freq: " + real_freq);
if ( (real_freq < (lowBand * FREQ_MUL)) || (real_freq > (highBand * FREQ_MUL)) ) {
Log.e(TAG, "Frequency out of band limits");
}
else {
stationList[j] = (int)(real_freq);
Log.d(TAG, " stationList: " + stationList[j]);
j++;
}
} try {
// mark end of list
stationList[station_num] = 0;
}
catch (ArrayIndexOutOfBoundsException e) {
Log.d(TAG, "ArrayIndexOutOfBoundsException !!");
}
return stationList;
}