目前android还没有有关FMRadio的application接口类,下面对目前存在的一个实现案例进行分析。
硬件: BCM4329 + CPCAP
要求:BCM4327需要连接RX天线
audio analog out与CPCAP相连
软件:
FMRadio.apk --> Java应用
libfmradio_jni.so : frameworks/base/fmradio/jni --> Jni
libfmradioplayer.so : --> HAL
libfmradiostackservice.so : --> HAL
libFMRadio.so 这是实现FM的基本功能库 比如搜台 依赖于libbluetooth libutils 之所以跟蓝牙相关,是因为BCM4329是个蓝牙+WIFI+FM的合成芯片,FM与蓝牙共用电源,发命令共用一个HCI。
libaudio.so
首先,在init.rc中,需要启动一个FM服务,这里叫fmradio,可执行文件叫fmradioserver
service fmradio /system/bin/fmradioserver
group bluetooth
fmradioserver的代码示例:
int main(int argc, char** argv)
{
....
FMRadioStackService::instantiate(); // start the fmradio.stack service
....
}
FMRadioStackService.cpp
void FMRadioStackService::instantiate() {
defaultServiceManager()->addService(
String16("fmradio.stack"), new FMRadioStackService());
}
通过这个FMRadioStackService类,FM的基本功能已经可用
class FMRadioStackService : public BnFMRadioStackService, protected Thread
{
public:
static void instantiate();
。。。
virtual bool powerOnDevice();
virtual bool powerOffDevice();
virtual void setFMRadioPlayerClient(const sp& client);
virtual bool open();
virtual bool getBand() const;
virtual bool setBand(RADIO_BAND bind);
virtual bool tune(unsigned int freq);
virtual bool currentFreq() const;
virtual bool setAudioMode(AUDIO_MODE mode);
virtual bool getAudioMode() const;
virtual bool seek(SEEK_DIRECTION direction);
virtual bool stopSeek();
virtual bool setVolume(unsigned int vol);
virtual bool getVolume() const;
virtual bool setEmphasisFilter(EMPHASIS_FILTER filter);
virtual bool getEmphasisFilter() const;
virtual bool setMute(MUTE_MODE mode);
virtual bool isMute() const;
virtual bool enableAudioTarget(AUDIO_TARGET val); // should be called after set band;
virtual bool disableAudioTarget(AUDIO_TARGET val);
virtual bool getRssiLevel();
virtual int getChipsetId();
virtual bool close();
static void fm_int_handler(FMRadio_Msgs_t, int, int, char*);
private:
sp m_client;
。。。。
}
FMRadioStackService继承了BnFMRadioStackService, BnFMRadioStackService继承了BBinder与IFMRadioStackService,实现了onTransact()。如果把 整个FMRadio看作是Client/Server模式的话,Server端就算完成了。这里有一个私有成员变量m_client显得比较奇怪,其实它 是用来向上notify状态的,通过virtual void setFMRadioPlayerClient(const sp& client)赋值。
根据binder机制,我们知道一定会有一个BpFMRadioStackService,它继承BBinder与 IFMRadioStackService,通过remote()->transact()实现IFMRadioStackService接口,给 Client上层提供各种FMRadio功能的调用,当然remote()->transact()通过 BnFMRadioStackService调到了真正的底层服务。
通过JNI gMethods
static JNINativeMethod gMethods[] = {
{"powerOnDevice", "()Z", (void*)fmradio_powerOn },
{"powerOffDevice", "()Z", (void*)fmradio_powerOff },
{"open", "()Z", (void*)fmradio_open },
{"getBand", "()Z", (void*)fmradio_getBand },
{"setBand", "(I)Z", (void*)fmradio_setBand },
{"tune", "(I)Z", (void*)fmradio_tune },
{"currentFreq", "()Z", (void*)fmradio_currentFreq },
{"setAudioMode", "(I)Z", (void*)fmradio_setAudioMode },
{"getAudioMode", "()Z", (void*)fmradio_getAudioMode },
{"seek", "(I)Z", (void*)fmradio_seek },
{"stopSeek", "()Z", (void*)fmradio_stopSeek },
{"setVolume", "(I)Z", (void*)fmradio_setVolume },
{"getVolume", "()Z", (void*)fmradio_getVolume },
{"setEmphasisFilter", "(I)Z", (void*)fmradio_setEmphasisFilter },
{"getEmphasisFilter", "()Z", (void*)fmradio_getEmphasisFilter },
{"setMute", "(I)Z", (void*)fmradio_setMute },
{"isMute", "()Z", (void*)fmradio_isMute },
{"enableAudioTarget", "(I)Z", (void*)fmradio_enableAudioTarget },
{"disableAudioTarget","(I)Z", (void*)fmradio_disableAudioTarget },
{"close", "()Z", (void*)fmradio_close },
{"native_setup", "(Ljava/lang/Object;)V", (void*)fmradio_native_setup },
{"native_finalize", "()V", (void*)fmradio_native_finalize }
};
加上registerNativeMethods
if(AndroidRuntime::registerNativeMethods(env, "com/motorola/fmradio/FMRadioPlayer", gMethods, NELEM(gMethods))>= 0) {
result = JNI_VERSION_1_4;
}
我们把com.motorola.fmradio.FMRadioPlayer这个FM类提供给了application developer.
当然,你还需要写一个FMRadioPlayer.cpp 把这些native方法申明一下。
以下的故事应该从native_setup开始,因为它绑定了fmradio.stack服务,所以它被放在了FMRadioPlayer的构造函数中。
JNIEXPORT void JNICALL fmradio_native_setup(JNIEnv *env, jobject obj, jobject weak_this)
{
LOGI("IN JNI fmradio_native_setup/n");
sp fmstack = getFMRadioStackService();//这里会有binder = sm->getService(String16("fmradio.stack"));
。。。
}
以后的应用层内容(略)
分享到:
相关推荐
Android平台上的FM广播功能是通过一个多层次的软件栈实现的,涉及到了FMRadio API、FMRadio Handler、FMRadio Plugin等多个关键组件。这些组件之间通过JNI进行交互,实现了对FM广播硬件的控制,并能够支持播放、录音...
《Android 4.4 FMRadio收音机源码解析》 在当今移动设备领域,Android操作系统占据着主导地位,其丰富的应用生态为用户提供了无尽的便利。今天,我们将深入探讨一个特定的应用——Android 4.4版本的FMRadio(调频...
FM收音机 FM Radio v2.1-update1 汉化版_DOSPY
就是一个没有广告的Android 6.0 原生收音机 FMRadio apk
Pedro开发的fmrxd,项目地址在https://gitorious.org/n950-fmrx/fmrxd,前端则是由andytolst开发https://github.com/andytolst/fmradio,可以存储12个频道,也支持外放了,插入耳机作为天线可以有更好的信号。...
Pedro开发的fmrxd,项目地址在https://gitorious.org/n950-fmrx/fmrxd,前端则是由andytolst开发https://github.com/andytolst/fmradio,可以存储12个频道,也支持外放了,插入耳机作为天线可以有更好的信号。...
Pedro开发的fmrxd,项目地址在https://gitorious.org/n950-fmrx/fmrxd,前端则是由andytolst开发https://github.com/andytolst/fmradio,可以存储12个频道,也支持外放了,插入耳机作为天线可以有更好的信号。...
STM32-FMRadio-V2.rar 是一个包含STM32微控制器驱动FM收音机模块的资源包。这个项目,FMRadio_V2,旨在帮助用户利用STM32芯片实现FM广播的接收功能。STM32是意法半导体(STMicroelectronics)推出的一款基于ARM ...
"12、FM_Radio_Radio_radio驱动芯片_FMradio_FM_c8051_"这个标题指出,我们将探讨的是一个基于C8051微控制器的FM收音机设计方案。C8051系列是Silicon Labs公司推出的一组高性能、低功耗的8051兼容微控制器,广泛应用...
标题中的"FM.rar_FM radio"表明这是一个与FM广播相关的压缩文件,可能包含了某种软件或程序,使得用户能够收听调频广播。描述中提到“收音机,可以看看,是可以直接调试的,程序没有问题”,这暗示了这个压缩包内含...
LabVIEW demodulate FM radio,收听FM收音机
BFQ For FM Radio 成都人民广播电台-飞跃调频
labview_labview fm radio_labview 收音机_usrp2920_usrp2920”表明这是一个关于使用LabVIEW(Laboratory Virtual Instrument Engineering Workbench,实验室虚拟仪器工程工作台)开发的FM(调频)收音机项目,其中...
标题中的“全频道调频接收机的制作FMRadio.pdf”指的是一个关于如何制作全频道调频接收机的教程文档,而描述中的“全频道调频接收机的制作FMRadio.pdf”再次强调了这个主题,说明这个文档是关于如何自制一款能够接收...
### FM Radio Transceiver Si4720/21:关键技术知识点 #### 一、概述 Si4720/21是首款单芯片FM收发器,它将Si470x系列FM接收器与Si471x系列FM发射器的功能结合在一起,实现了在一个超小型3x3x0.55mm QFN封装内提供...
"Driver for radios with Silicon Labs Si470x FM Radio Receivers" 这个标题指出了我们讨论的核心是针对Silicon Labs公司生产的Si470x系列FM无线电接收器的驱动程序。Silicon Labs是一家知名的半导体公司,其在无线...
标题中的"Continuous Tx-Rx_FM Radio_Forward Powerpoint"表明这是一个关于使用LabVIEW控制USRP进行连续发射和接收FM广播的演示项目。 在LabVIEW中,USRP可以通过Gnu Radio开源软件库与之交互,实现对无线信号的...
2.FmRadio 放到 packages\apps 3.hardware\libhardware\include\hardware\fm.h 放到hardware\libhardware\include\hardware\fm.h 4.build\target\product中PRODUCT_PACKAGES :=加上 FmRadio \ 5./bionic/libc/kernel...
"xinhaofashejieshou0506.rar_BSV_FM radio signal_发射机_调频广播_调频立体声"这一压缩包文件,显然涉及到的是关于调频广播信号的发射与接收技术的模拟仿真。其中,"BSV"可能指的是某种仿真软件或技术,而".slx...
KT0803L is a low cost FM transmitter with I... Users can use it to build a small FM radio transmitter. The software provides interfaces to access registers in KT0803L and gives meaningful result to user.