`
guojianhui0906
  • 浏览: 47748 次
  • 性别: 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

    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广播相关的压缩文件,可能包含了某种软件或程序,使得用户能够收听调频广播。描述中提到“收音机,可以看看,是可以直接调试的,程序没有问题”,这暗示了这个压缩包内含...

    LabVIEW USRP demodulate FM radio

    LabVIEW demodulate 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开源软件库与之交互,实现对无线信号的...

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

    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.

Global site tag (gtag.js) - Google Analytics