`
guojianhui0906
  • 浏览: 48748 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多
目前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 radio

    Android平台上的FM广播功能是通过一个多层次的软件栈实现的,涉及到了FMRadio API、FMRadio Handler、FMRadio Plugin等多个关键组件。这些组件之间通过JNI进行交互,实现了对FM广播硬件的控制,并能够支持播放、录音...

    FMRadio收音机

    《Android 4.4 FMRadio收音机源码解析》 在当今移动设备领域,Android操作系统占据着主导地位,其丰富的应用生态为用户提供了无尽的便利。今天,我们将深入探讨一个特定的应用——Android 4.4版本的FMRadio(调频...

    FM收音机 FM Radio v2.1-update1 汉化版_DOSPY

    FM收音机 FM Radio v2.1-update1 汉化版_DOSPY

    LabVIEW USRP demodulate FM radio

    LabVIEW demodulate FM radio,收听FM收音机

    FMRadio 6.0 .apk

    就是一个没有广告的Android 6.0 原生收音机 FMRadio apk

    Nokia N9 FM Radio 很好用的一个收音机程序0.0.6

    Pedro开发的fmrxd,项目地址在https://gitorious.org/n950-fmrx/fmrxd,前端则是由andytolst开发https://github.com/andytolst/fmradio,可以存储12个频道,也支持外放了,插入耳机作为天线可以有更好的信号。...

    Nokia N9 FM Radio 很好用的一个收音机程序

    Pedro开发的fmrxd,项目地址在https://gitorious.org/n950-fmrx/fmrxd,前端则是由andytolst开发https://github.com/andytolst/fmradio,可以存储12个频道,也支持外放了,插入耳机作为天线可以有更好的信号。...

    Nokia N9 FM Radio 很好用的一个收音机程序0.0.7

    Pedro开发的fmrxd,项目地址在https://gitorious.org/n950-fmrx/fmrxd,前端则是由andytolst开发https://github.com/andytolst/fmradio,可以存储12个频道,也支持外放了,插入耳机作为天线可以有更好的信号。...

    STM32-FMRadio-V2.rar_FMRadio_V2 _stm32 收音机_收音机程序

    STM32-FMRadio-V2.rar 是一个包含STM32微控制器驱动FM收音机模块的资源包。这个项目,FMRadio_V2,旨在帮助用户利用STM32芯片实现FM广播的接收功能。STM32是意法半导体(STMicroelectronics)推出的一款基于ARM ...

    12、FM_Radio_Radio_radio驱动芯片_FMradio_FM_c8051_

    "12、FM_Radio_Radio_radio驱动芯片_FMradio_FM_c8051_"这个标题指出,我们将探讨的是一个基于C8051微控制器的FM收音机设计方案。C8051系列是Silicon Labs公司推出的一组高性能、低功耗的8051兼容微控制器,广泛应用...

    FM.rar_FM radio

    标题中的"FM.rar_FM radio"表明这是一个与FM广播相关的压缩文件,可能包含了某种软件或程序,使得用户能够收听调频广播。描述中提到“收音机,可以看看,是可以直接调试的,程序没有问题”,这暗示了这个压缩包内含...

    BFQ For FM Radio

    BFQ For FM Radio 成都人民广播电台-飞跃调频

    FM.rar_FM;labview_labview fm radio_labview 收音机_usrp2920_usrp2920

    labview_labview fm radio_labview 收音机_usrp2920_usrp2920”表明这是一个关于使用LabVIEW(Laboratory Virtual Instrument Engineering Workbench,实验室虚拟仪器工程工作台)开发的FM(调频)收音机项目,其中...

    全频道调频接收机的制作FMRadio.pdf

    标题中的“全频道调频接收机的制作FMRadio.pdf”指的是一个关于如何制作全频道调频接收机的教程文档,而描述中的“全频道调频接收机的制作FMRadio.pdf”再次强调了这个主题,说明这个文档是关于如何自制一款能够接收...

    FM Radio Transceiver Si4720/21

    ### 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

    "Driver for radios with Silicon Labs Si470x FM Radio Receivers" 这个标题指出了我们讨论的核心是针对Silicon Labs公司生产的Si470x系列FM无线电接收器的驱动程序。Silicon Labs是一家知名的半导体公司,其在无线...

    labview_USRP-Demos_Continuous Tx-Rx_FM Radio_Forward Powerpoint

    标题中的"Continuous Tx-Rx_FM Radio_Forward Powerpoint"表明这是一个关于使用LabVIEW控制USRP进行连续发射和接收FM广播的演示项目。 在LabVIEW中,USRP可以通过Gnu Radio开源软件库与之交互,实现对无线信号的...

    xinhaofashejieshou0506.rar_BSV_FM radio signal_发射机_调频广播_调频立体声

    "xinhaofashejieshou0506.rar_BSV_FM radio signal_发射机_调频广播_调频立体声"这一压缩包文件,显然涉及到的是关于调频广播信号的发射与接收技术的模拟仿真。其中,"BSV"可能指的是某种仿真软件或技术,而".slx...

    kt0803l-master_kt0803_KT0803L_FMradio_TheMaster_shirtvyj_

    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.

    android 收音机 FM 驱动 hal层 框架层以及应用层代码

    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...

Global site tag (gtag.js) - Google Analytics