android FM手动调频流程
来源:互联网 发布:mysql strcmp 编辑:程序博客网 时间:2024/04/30 11:50
首先来看一下流程图:
2.滑动刻度盘HorizontalNumberPicker控件在监听事件里使用方法valueToFrequency(newVal)
1.长按左右箭头居中的频率字符串,弹出FrequencyPickerDialog调频对话框确定调用tuneRadio(frequency)调频。
获取到频率
- protected int valueToFrequency(int value) {
- mFrequency = mPrefs.getLowerLimit() + value *
- mPrefs.getFrequencyStepSize();
- return mFrequency;
- }
- 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;
- }
首先来看一下流程图:
2.滑动刻度盘HorizontalNumberPicker控件在监听事件里使用方法valueToFrequency(newVal)
1.长按左右箭头居中的频率字符串,弹出FrequencyPickerDialog调频对话框确定调用tuneRadio(frequency)调频。
获取到频率
- protected int valueToFrequency(int value) {
- mFrequency = mPrefs.getLowerLimit() + value *
- mPrefs.getFrequencyStepSize();
- return mFrequency;
- }
- 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手动调频流程
- Android FM模块学习之三 FM手动调频
- FM调频技术介绍
- android FM启动流程
- android FM搜索频率流程
- Android FM模块学习之一 FM启动流程
- Android FM模块学习之二 FM搜索频率流程
- 用树莓派制作FM调频无线电发射器
- Android CPU 调频策略
- 专题引言--我的心是FM调频
- 使用AD9361实现FM调频接收机接受广播
- 调制:调幅(AM)与调频(FM)
- Sigmoid非线性激活函数,FM调频,胆机,HDR的意义
- 支持还是禁用,你如何看待FM调频功能
- android APK手动编译流程
- 调频 预加重 和 去加重 (FM Pre-emphasis/De-emphasis)
- 全国各地城市FM调频电台频率列表(上海北京广州深圳长沙武汉重庆)
- Android FM要点分析
- MAC 系统下的快捷键 和 终端下的文件目录操作
- TextInput失去焦点时, 键盘不消失
- jquery方法focusin/focusout的使用
- Windows简易静态库制作方式
- 装饰者模式
- android FM手动调频流程
- margin-top 失效的问题
- jQuery元素的追加和删除
- shiro入门实战笔记(10)--自定义Realm
- 《转》详解Spring中bean的scope singleton prototype request...
- .config、kconfig和Makefile的关系
- 毛泽东23岁时写何文章震动全校?
- Javascript、Jquery获取浏览器和屏幕各种高度宽度
- 周期字串