Android FM模块学习之三 FM手动调频
前一章主要是FM的自动调频, 接下来我们就看看FM手动调频是如何进行的。如果不清楚FM自动调频的过程,请打开超链接查看FM搜索频率流程。
首先来看一下流程图:

2.滑动刻度盘HorizontalNumberPicker控件在监听事件里使用方法valueToFrequency(newVal)
1.长按左右箭头居中的频率字符串,弹出FrequencyPickerDialog调频对话框确定调用tuneRadio(frequency)调频。

获取到频率
protected int valueToFrequency(int value) {
       mFrequency = mPrefs.getLowerLimit() + value *
                             mPrefs.getFrequencyStepSize();
       return mFrequency;
   }
发送一个handler 回调一个tuneRadio(frequency)调频。
Runnable mRadioChangeFrequency = new Runnable(){
       public void run() {
           mUpdatePickerValue = false;
           tuneRadio(mFrequency);
       }
   };
3.手动点击按钮左右箭头, 通过监听调用:

int frequency =FmSharedPreferences.getNextTuneFrequency();
int frequency =FmSharedPreferences.getPrevTuneFrequency();
tuneRadio(frequency);进行调频
getNextTuneFrequency()方法通过判断频率最大限制范围,后加200(刻度)
getPrevTuneFrequency()方法通过判断频率最小限制范围,后减200(刻度)
调频方法分析
private void tuneRadio(int frequency)
private void tuneRadio(int frequency){
    /* Issue the tune command only if tuneCommand is already not active */
    if((mService != null) && (mCommandActive != CMD_TUNE) && isFmOn()) {
      boolean bStatus = false;
      try {
         bStatus = mService.tune(frequency);
         if (bStatus) {
            postTimeoutHandler(CMD_TUNE);
         }else {
          if (isFmOn()) {
            mCommandFailed = CMD_TUNE;
            Log.e(LOGTAG, "mService.tune failed");
            showDialog(DIALOG_CMD_FAILED);
          }
         }mTunedStation.setName("");
         mTunedStation.setPI(0);
         mTunedStation.setPty(0);
         updateStationInfoToUI();
      }catch (RemoteException e) {
        e.printStackTrace();
      }
    }else {
      Log.e(LOGTAG, "Delayed Tune handler stopped");
    }
  }
通过回调引用类调用FMRadioService类的tune()方法进行调频
bStatus = mService.tune(frequency);
发送一个广播连接是否超时
postTimeoutHandler(CMD_TUNE);
设置调频名字,更新FMRadioUI界面信息
mTunedStation.setName("");
mTunedStation.setPI(0);
mTunedStation.setPty(0);
updateStationInfoToUI()
(通过IFMRadioSrevice.aidl通信机制onbind返回的类的引用调用FMRadioService中的调频方法)
FMRadioService中的tune方法
public boolean tune(int frequency)
public boolean tune(int frequency) {
  boolean bCommandSent=false;
  double doubleFrequency = frequency/1000.00;
  Log.d(LOGTAG, "tuneRadio:  " + doubleFrequency);
  if (mReceiver != null)
  {
     mReceiver.setStation(frequency);
     bCommandSent = true;
  }
  return bCommandSent;
   }
调用FMReceiver类的setStation方法调频
public boolean setStation (intfrequencyKHz)
public boolean setStation (int frequencyKHz) {
  int ret;
  mControl.setFreq(frequencyKHz);
  ret = mControl.setStation(sFd);
  if(ret < 0 )
  {
     return false;
  }
  else
  {
     return true;
  }
   }
调用FMRxControls类(FM读取控制台信息)设置频率
mControl.setFreq(frequencyKHz);
设置优化调频核心指定的频率
ret = mControl.setStation(sFd);
public int setStation(int fd) {
      Log.d(TAG, "** Tune Using: "+fd);
      int ret = FmReceiverJNI.setFreqNative(fd, mFreq);
      Log.d(TAG, "** Returned: "+ret);
      return ret;
   }
最后调用FmReceiverJNI类
setFreqNative(fd, mFreq); 本地方法 JNI到 cpp文件
/*native interface */
static jint android_hardware_fmradio_FmReceiverJNI_setFreqNative
(JNIEnv * env, jobject thiz, jint fd, jint freq)
{
int err;
double tune;
struct v4l2_frequency freq_struct;
freq_struct.type = V4L2_TUNER_RADIO;
freq_struct.frequency = (freq*TUNE_MULT/1000);
err = ioctl(fd, VIDIOC_S_FREQUENCY, &freq_struct);
if(err < 0){
return FM_JNI_FAILURE;
}
return FM_JNI_SUCCESS;
}
Android FM模块学习之三 FM手动调频的更多相关文章
- Android FM模块学习之一 FM启动流程
		最近在学习FM模块,FM是一个值得学习的模块,可以从上层看到底层. 上层就是FM的按扭操作和界面显示,从而调用到FM底层驱动来实现广播收听的功能. FM启动流程:如下图: 先进入FMRadio.jav ... 
- Android FM 模块学习之四 源码解析(1)
		Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 前一章我们了解了FM手动调频,接下 ... 
- Android FM模块学习之四源码解析(一)
		转自:http://blog.csdn.net/tfslovexizi/article/details/41516149?utm_source=tuicool&utm_medium=refer ... 
- Android FM模块学习之四源码分析(3)
		接着看FM模块的其他几个次要的类的源码.这样来看FM上层的东西不是太多. 请看android\vendor\qcom\opensource\fm\fmapp2\src\com\caf\fmradio\ ... 
- Android FM模块学习之四源码学习(2)
		前几章我们分析了FM模块的几个主要的类文件,今天要分析的是:FMTransceiver.java // 某些工程中名称为FMRadioService.java public class FmTra ... 
- Android FM模块学习之二 FM搜索频道
		最近在学习FM模块,FM是一个值得学习的模块,可以从上层看到底层.上层就是FM的按扭操作和界面显示,从而调用到FM底层驱动来实现广播收听的功能. 看看FM启动流程:如下图: 先进入FMRadio.ja ... 
- Android FM模块学习之二 FM搜索频率流程
		上一篇大概分析了一下FM启动流程,若不了解Fm启动流程的,能够去打开前面的链接先了解FM启动流程,接下来我们简单分析一下FM的搜索频率流程. 在了解源代码之前.我们先看一下流程图: 事实上从图中能够看 ... 
- Android Bluetooth模块学习笔记
		一.蓝牙基础知识 1.蓝牙( Bluetooth )是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网之间的短距离数据交换.蓝牙基于设备低成本的收发器芯片,传输距离近.低功耗. 2.微波频段: ... 
- 爱了,字节跳动大神最佳整理:582页Android NDK七大模块学习宝典,理论与实践
		前言 时至今日,短视频App可谓是如日中天,一片兴兴向荣.随着短视频的兴起,音视频开发也越来越受到重视,而且薪资水涨船高,以一线城市为例,音视频工程开发的薪资比Android应用层开发高出40%. 但 ... 
随机推荐
- Masonry+拖动
			最近遇到一个问题,用Masonry写的布局: 拖动其中某个view,拖动方法按传统的写成如下形式.如果view中的label更改text值,拖动之后的view就会回到最初被设定的位置. - (void ... 
- Oracle介绍(初学者必须知道的)
			1.为什么学习数据库?(两个概念) 数据库的概念: 数据库是按照数据结构组织,存储和管理数据的仓库. 数据库,简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增. ... 
- 使用redis-dump进行Redis数据库合并
			前言 最近处理数据时,涉及到跨服务器访问的问题,我有两个Redis服务器分别在不同的机器上,给数据维护带来了诸多不便,于是便研究了下如何将两个Redis中的数据合并到一处. 从网站搜了一些工具,找到了 ... 
- PHP数据类型转换 (转)
			PHP数据类型转换 PHP的数据类型转换属于强制转换,允许转换的PHP数据类型有: •(int).(integer):转换成整形 •(float).(double).(real):转换成浮点型 •(s ... 
- iOS 使用Touch ID 校验[新增 iOS9 三种错误]
			iOS8后苹果开放了Touch ID的API给开发者,这也给我们的app带来了新的体验.开发者们可使用向第三方应用开放了Touch ID权限的API,以便他们在应用中使用指纹认证来完成用户认证或支付购 ... 
- Android TextView自动换行文字排版参差不齐的原因
			今天项目没什么进展,公司后台出问题了.看了下刚刚学习Android时的笔记,发现TextView会自动换行,而且排版文字参差不齐.查了下资料,总结原因如下: 1.半角字符与全角字符混乱所致:这种情况一 ... 
- linux&win7双系统安装
			linux&win7双系统安装 硬盘大小分配方案 按照顺序来建立分区 /swap 4G ==即交换分区,也是一种文件系统,它的作用是作为Linux的虚拟内存.在Windows下, ... 
- Oracle在归档模式下恢复
			=============== 数据库的完全恢复 =============== 在归档模式下数据库完全恢复时,数据库所经过的状态如下: 1.利用备份修复(Restores)损坏或丢失的数据文件,即将 ... 
- IntelliJ IDEA 修改包名
			1.首先将AndroidManifest的Package Name重命名(快捷键shift+F6或者右键Refctor然后Rename)这时Package Name就改变了,但是Src的文件名还没变2 ... 
- Caché数据库学习笔记(1)
			目录: Caché的概念和基础知识 Caché数据库的安装 创建命名空间(namespace)和数据库(database) Documentation的使用 ===================== ... 
