android FM的流程

本文详细解析了Android硬件广播Radio框架的结构,从RadioManager通过TunerCallbackAdapter回调接口,到HAL层的RadioModule和服务交互,展示了如何打开Tuner设备、设置回调并操作hal层。重点介绍了ProgramSelector和ProgramInfo结构,揭示了调用链中关键数据的传递过程。

FM framework:

1、适配层调用的最外面接口是Radiomanager


frameworks/base/core/java/android/hardware/radio/RadioManager.java
frameworks/base/core/java/android/hardware/radio/TunerCallbackAdapter.java
下面是向上外层适配层回调的主要是三个接口, 都在TunerCallbackAdapter.java
onTuneFailed, onCurrentProgramInfoChanged, onProgramListUpdated

RadioManager.java→构造函数里获取radioservice

public RadioManager(@NonNull Context context) throws ServiceNotFoundException {
mService = IRadioService.Stub.asInterface(
ServiceManager.getServiceOrThrow(Context.RADIO_SERVICE));
}

frameworks/base/core/java/android/hardware/radio/RadioManager.java

打开tuner设备,并设置callback

public RadioTuner openTuner(int moduleId){
    TunerCallbackAdapter halCallback = new TunerCallbackAdapter(callback, handler);
    ITuner tuner = mService.openTuner(moduleId, config, withAudio, halCallback);
    return new TunerAdapter(tuner, halCallback, config != null ? config.getType() : BAND_INVALID);
}
接下来在frameworks/base/core/java/android/hardware/radio/TunerAdapter.java里做接口调用,比如

scan, step, tune, startBackgroundScan(没用到)

在frameworks/base/core/java/android/hardware/radio/TunerCallbackAdapter.java接收回调

2、再往下, 是hal service的代码,分为hal和hal2


frameworks/base/services/core/java/com/android/server/broadcastradio
注意一下, hal1和hal2是而选一的
hal1会调用native函数, native函数是在frameworks/base/services/core/jni/BroadcastRadio, 但是android11并不走hal1,
所以也不通过native访问radio hal层

hal是直接通过IServiceManager manager = IServiceManager.getService();

frameworks/base/services/core/java/com/android/server/broadcastradio/BroadcastRadioService.java

public class Broad
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值