[Q] FM Radio app, Broadcom BCM4329 chipset

Search This thread

daniel.weck

Senior Member
Nov 2, 2010
576
95
daniel.weck.free.fr
- UPDATE 16 February 2011 -

Attached to this post is the relevant FM source code extracted from the CyanogenMod git repository [1] and merged into the AOSP code base (note that so far I haven't used any of the "Update1" source code released by Samsung, but this would be advisable). This is not a straight copy from CM, I manually imported the FM-related code snippets (CM tweaks the audio framework further, with effects, etc.).

The good news is that this compiles fine, the bad news is that when I copy the resulting libs to the device, the Tab gets stuck at the Samsung logo. :eek:

/system/lib/libandroid_runtime.so
/system/lib/libaudioflinger.so
/system/lib/libmedia.so
/system/lib/libmedia_jni.so

At this stuck boot stage, I was able to open an ADB session, but /proc/kmsg (and other logs) were not showing any obvious problems so I couldn't diagnose the actual issue. I mounted the SD card (onto which I had a backup of the original libraries), and I restored the *.so files. The Tab immediately generated the audio welcome cue and booted to completion. :cool: So I guess that my newly-compiled libraries set was blocking the audio system, somehow.

At any rate, more work is needed to understand how to build required framework bits from AOSP so that they work on the Tab. Maybe there is more to it than just the aforementioned 4 *.so libs. For example, I'm not sure where these files take part:

media/java/android/media/AudioManager.java
media/java/android/media/AudioService.java
media/java/android/media/AudioSystem.java
media/java/android/media/MediaRecorder.java

Furthermore, I wonder how to setup the /dev/radio0 at kernel level ? It doesn't even seem to be needed at all, because the code ignores the device path altogether !! :confused: (/dev/radio0 would be a video-for-Linux v4l device, possibly required by the FM framework...although access to the Broadcom BCM4329 chipset seems to be direct in the source code) I can't see any obvious kernel diff on the CyanogenMod repository, so I'm a bit stuck to be honest ! :( Ultimately the v4l device should allow us to query the FM functionality directly: [v4l2-ctl -d /dev/radio0 --all -L], but it looks like CyanogenMod implements a FM hack by querying hci_w().

Talking about CM, it is clear that Techomancer's porting effort is worth mentioning, as it may be possible to enable FM support more easily there: https://github.com/techomancer / http://xdaforums.com/showthread.php?t=931857

The FM app compiles fine (I just dropped the source code [2] straight into the AOSP tree). The only problem I have is JAR/APK signing, but I could use Eclipse to build the app separately from the AOSP build system. I haven't bothered, there's no point spending time on this until the FM driver/kernel stuff works. ;)

Cheers, Daniel

[1]
https://github.com/CyanogenMod/andr...mmit/350dcf82f0c95d15ae286240d9792a6d90891f4e

[2]
https://github.com/CyanogenMod/android_packages_apps_FM

Here's a bunch of useful links:

http://www.ifixit.com/Teardown/Samsung-Galaxy-Tab-Teardown/4103/2

http://hk.samsungmobile.com/ENG/mobile-phones/samsung-galaxytab-specification

https://www.codeaurora.org/gitweb/quic/la/?p=platform/packages/apps/FM.git;a=summary

http://android.git.kernel.org/?p=pl...it;h=f427424c414886903e4ad654c143c8ce6ec10e3c

https://www.codeaurora.org/gitweb/q...o;hb=487ae541eb618b91431d0a19ae0a6eab1f6019aa

https://github.com/millenomi/nomadikradio

http://gitorious.org/0xdroid/packages_apps_fm/trees/master/src/com/quicinc/fmradio/

https://github.com/j-r0dd/android_packages_apps_FM/tree/froyo/src/com/quicinc/fmradio/

http://www.miui.com/thread-1687-1-1.html

http://android.modaco.com/content-page/318792/how-to-tune-a-fm-radio-station/page/40/#entry1422743

http://forum.cyanogenmod.com/topic/10377-qrequest-fm-radio-on-bcm4325-phones/
 

Attachments

  • fm_radio_cyanogen_code_patch.tar.zip
    158.7 KB · Views: 1,570
Last edited:

daniel.weck

Senior Member
Nov 2, 2010
576
95
daniel.weck.free.fr
Alright, the Motorola Droid 2 app runs fine in portrait mode (although bitmaps are not scaled to HDPI), but it stays on "Waiting for FM radio...". Here's the relevant logcat snippets:

Code:
ActivityIntentInfo{482a8dc0 com.motorola.fmradio.FMRadioMain}

ActivityIntentInfo{484825b0 com.sec.android.app.factorytest.FmRadioTest}

ActivityIntentInfo{48474078 com.android.settings.RadioInfo}

I/ActivityManager( 2489): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.motorola.fmradio/.FMRadioMain }

I/ActivityManager( 2489): Start proc com.motorola.fmradio for activity com.motorola.fmradio/.FMRadioMain: pid=6109 uid=10256 gids={}

I/ActivityThread( 6109): Publishing provider com.motorola.provider.fmradio: com.motorola.fmradio.FMDataProvider

I/dalvikvm( 6109): Could not find method android.util.Log.e, referenced from method com.motorola.fmradio.FMRadioMain$19.handleMessage
W/dalvikvm( 6109): VFY: unable to resolve static method 162: Landroid/util/Log;.e (Ljava/lang/String;[Ljava/lang/String;)I
D/dalvikvm( 6109): VFY: replacing opcode 0x71 at 0x0cb9
D/dalvikvm( 6109): VFY: dead code 0x0cbc-0cbc in Lcom/motorola/fmradio/FMRadioMain$19;.handleMessage (Landroid/os/Message;)V
D/FMRadioMain( 6109): **************FMRadioMain Activity onCreate() called!****************
D/FMRadioMain( 6109): **************FMRadioMain Activity onCreateInternal() called!****************
D/dalvikvm( 6109): GC_EXTERNAL_ALLOC freed 1148 objects / 76976 bytes in 36ms
I/global  ( 2489): Default buffer size used in BufferedInputStream constructor. It would be better to be explicit if an 8k buffer is required.
D/FMDataProvider( 6109): set save table: FM_Radio_saved_state
D/FMRadioMain( 6109): enter initResourceRefs()
D/FMRadioMain( 6109): Enter getDataFromDB(), will update data in list_results
D/FMDataProvider( 6109): set channel table: FM_Radio
D/FMRadioMain( 6109): Leave getDataFromDB()
D/FMRadioMain( 6109): Enter bindListViewToAdapter()
D/FMRadioMain( 6109): leave initResourceRefs()
D/FMRadioMain( 6109): Start to bind to FMRadio service
I/ActivityManager( 2489): Start proc com.motorola.fmradio:remote for service com.motorola.fmradio/.FMRadioPlayerService: pid=6116 uid=10256 gids={}
D/FMDataProvider( 6109): set channel table: FM_Radio
D/FMRadioMain( 6109): enter updateListView()
D/FMRadioMain( 6109): Enter getDataFromDB(), will update data in list_results
D/FMDataProvider( 6109): set channel table: FM_Radio
D/FMRadioMain( 6109): Leave getDataFromDB()
D/FMRadioMain( 6109): leave updateListView()
D/FMRadioMain( 6109): enter updateDisplayPanel()
D/FMRadioMain( 6109): FMRadio updateDisplay: currentFreq 87500 a1 0 a2 8 a3 7 a4 5
D/dalvikvm( 2391): GC_EXPLICIT freed 284 objects / 10768 bytes in 63ms
D/FMRadioMain( 6109): leave updateDisplayPanel()
D/FMRadioMain( 6109): enter updateListView()
D/FMRadioMain( 6109): Enter getDataFromDB(), will update data in list_results
D/FMDataProvider( 6109): set channel table: FM_Radio
D/FMRadioMain( 6109): Leave getDataFromDB()
D/FMRadioMain( 6109): leave updateListView()
D/FMRadioMain( 6109): onStart() called
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =0
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =1
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =2
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =3
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =4
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =5
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =6
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =7
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =8
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =9
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =10
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =11
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/dalvikvm( 2391): GC_EXPLICIT freed 47 objects / 2096 bytes in 66ms
E/JAVA:FMRadioPlayerService( 6116): onCreate() called
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =12
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =13
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =14
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =0
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =1
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =2
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =3
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =4
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =5
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =6
D/JAVA:FMRadioPlayerService( 6116): onBind() called
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =7
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =8
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =9
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =10
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/JAVA:FMRadioPlayerService( 6116): register airplane on/off broadcasts
D/JAVA:FMRadioPlayerService( 6116): register headset plug in/out broadcasts
D/JAVA:FMRadioPlayerService( 6116): register the audio path change message
D/JAVA:FMRadioPlayerService( 6116): register fmradio command
D/JAVA:FMRadioPlayerService( 6116): onStart() called
D/JAVA:FMRadioPlayerService( 6116): mServiceState.curServiceState() = -1
D/JAVA:FMRadioPlayerService( 6116): Before fm radio power on
D/FMDataProvider( 6109): set save table: FM_Radio_saved_state
D/JAVA:FMRadioPlayerService( 6116): FMStateUNInit:powerOn(): Power on fmradio device
W/ActivityManager( 2489): Unable to start service Intent { act=com.motorola.android.fmradio.FMRADIO_SERVICE }: not found
D/JAVA:FMRadioPlayerService( 6116): After fm radio power on
D/JAVA:FMRadioPlayerService( 6116): fm radio power on fail
D/JAVA:FMRadioPlayerService( 6116): Received intent: android.intent.action.HEADSET_PLUG
D/JAVA:FMRadioPlayerService( 6116): HEADSET is pluged in/out.
V/JAVA:FMRadioPlayerService( 6116): handleMessage headset plug begin
V/JAVA:FMRadioPlayerService( 6116): mHeadset = 1
V/JAVA:FMRadioPlayerService( 6116): mIsHeadsetPlugged = true
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =0
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =1
W/JAVA:FMRadioPlayerService( 6116): Headset is pluged in!
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/dalvikvm( 2391): GC_EXPLICIT freed 2 objects / 64 bytes in 109ms
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =2
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =3
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =4
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =5
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =6
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =7
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =8
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =9
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =10
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
W/FMRadioMain( 6109): onServiceConnected::fmradio java service started
W/JAVA:FMRadioPlayerService( 6116): IFMRadioPlayerService.Stub : isPowerOn
D/JAVA:FMRadioPlayerService( 6116): FMStateUNInit:isPowerOn(), return misPowerOn value to UI
W/FMRadioMain( 6109): servie is ready popup a wait dialog
D/FMDataProvider( 6109): set channel table: FM_Radio
D/JAVA:FMRadioPlayerService( 6116): Received intent: com.motorola.fmradio.bindservice.succeed
D/JAVA:FMRadioPlayerService( 6116): bind service succeed
W/JAVA:FMRadioPlayerService( 6116): Notice home to show update current preset name on the notice bar. 
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =0
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =1
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =2
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =3
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =4
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =5
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =6
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =7
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =8
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =9
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =10
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =11
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =12
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =13
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =14
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =0
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =1
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =2
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =3
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =4
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =5
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =6
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =7
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =8
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =9
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =10
D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
D/FMRadioMain ChannelListView( 6109): call onDraw
D/dalvikvm( 6010): GC_FOR_MALLOC freed 44693 objects / 3062512 bytes in 134ms
D/dalvikvm( 6010): GC_FOR_MALLOC freed 41160 objects / 3021872 bytes in 59ms
D/dalvikvm( 6010): GC_FOR_MALLOC freed 40577 objects / 2773512 bytes in 42ms
D/FMRadioMain ChannelListView( 6109): call onDraw
D/FMRadioMain ChannelListView( 6109): call onDraw
D/FMRadioMain ChannelListView( 6109): call onDraw
D/FMRadioMain ChannelListView( 6109): call onDraw
D/FMRadioMain ChannelListView( 6109): call onDraw
D/dalvikvm( 6010): GC_FOR_MALLOC freed 33184 objects / 2369512 bytes in 242ms
D/FMRadioMain ChannelListView( 6109): call onDraw
D/FMRadioMain ChannelListView( 6109): call onDraw
D/FMRadioMain ChannelListView( 6109): call onDraw
D/FMRadioMain ChannelListView( 6109): call onDraw


V/WindowManager( 2489): Dsptch to Window{48632258 com.motorola.fmradio/com.motorola.fmradio.FMRadioMain paused=false}
W/KeyCharacterMap( 6109): No keyboard for id 0
W/KeyCharacterMap( 6109): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
E/ShutdownThread( 2489): IsShutDownStarted()
I/KeyInputQueue( 2489): Input event
D/KeyInputQueue( 2489): screenCaptureKeyFlag setting 0
V/WindowManager( 2489): Dsptch to Window{48632258 com.motorola.fmradio/com.motorola.fmradio.FMRadioMain paused=false}
W/InputManagerService( 2489): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@48314940
D/dalvikvm( 5937): GC_EXPLICIT freed 2208 objects / 146560 bytes in 60ms
E/ShutdownThread( 2489): IsShutDownStarted()
I/KeyInputQueue( 2489): Input event
D/KeyInputQueue( 2489): screenCaptureKeyFlag setting 1
V/WindowManager( 2489): Dsptch to Window{48629c78 com.motorola.fmradio/com.motorola.fmradio.FMRadioMain paused=false}
E/ShutdownThread( 2489): IsShutDownStarted()
I/KeyInputQueue( 2489): Input event
D/KeyInputQueue( 2489): screenCaptureKeyFlag setting 0
V/WindowManager( 2489): Dsptch to Window{48629c78 com.motorola.fmradio/com.motorola.fmradio.FMRadioMain paused=false}
D/FMRadioMain( 6109): onPause() called
E/WindowManager( 2489): Overwriting rotation value from 0
W/InputManagerService( 2489): Starting input on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@4848d5c0 (uid=10256 pid=6109)
I/ActivityManager( 2489): No longer want com.appspot.swisscodemonkeys.apps (pid 6020): hidden #16
D/FMRadioMain( 6109): onStop() called
D/FMRadioMain( 6109): onDestroy() called
D/JAVA:FMRadioPlayerService( 6116): onUnbind() called
D/JAVA:FMRadioPlayerService( 6116):  unregister Receiver.
 
Last edited:
  • Like
Reactions: jeebspawnshop

daniel.weck

Senior Member
Nov 2, 2010
576
95
daniel.weck.free.fr
I also tried a different FMRadio.apk (just that, no other lib/bin files), but the app com.huawei.android.FMRadio crashes with a Force Close. This is the one with a grey/silver radio icon (big black speaker on the right hand side).

The HtcFMRadio.apk (com.htc.fm) also FC, the icon for this one is a black radio with white knobs at the bottom, and a red needle on white background at the top.

The Droid 2 icon is a big square dial with a red needle.

:(

EDIT: the deodexed FMRadio app from the Samsung Galaxy S (com.sec.android.app.fm) also crashes with Force Close. The icon is a big orange square with a single mini round dial in the bottom middle.
 
Last edited:
  • Like
Reactions: jeebspawnshop

daniel.weck

Senior Member
Nov 2, 2010
576
95
daniel.weck.free.fr
Update: still looking for a driver, /dev/radio device, kernel module, and app combination that would work on the Tab... (I finished building a full ROM from Google's open-source code, next step is to test Samsung's custom code, then to try FM Radio code from other well-known ROMs)
 

cgerdb

Member
Nov 24, 2010
16
1
how is this going?

Hi, Thanks for doing all this testing, It looks like just a few people of us that are still interested in the good ol' FM. ahhhhh, please let us know when u have the apk ;)
 

Body

Senior Member
Jun 13, 2008
109
2
Cascavel, PR
I had already asked about fm radio in another topic, to be sure that Brazil has a rom software because the version of Brazil have tv and radio.
 

cgerdb

Member
Nov 24, 2010
16
1
I had already asked about fm radio in another topic, to be sure that Brazil has a rom software because the version of Brazil have tv and radio.

CAn u send links to where to buy tabs in Brazil? I so want one with at least one of the two, PLUS all the cool things that already has.
 

ruspa

Senior Member
Sep 2, 2009
68
9
Trieste
Bump.. some progress on that? I've replaced my car stereo unit with a galaxy tab, and it kinda sucks not to have the FM radio. I've been trying the module from galaxyS but didn't worked. I've read that brazilian versions of gTab has a DVB-T hardware component MORE than ours, let's hope that the fm radio receving capabilities are not in that chip we don't have.
 

JaysFreaky

Senior Member
Sep 5, 2009
159
7
Bump.. some progress on that? I've replaced my car stereo unit with a galaxy tab, and it kinda sucks not to have the FM radio. I've been trying the module from galaxyS but didn't worked. I've read that brazilian versions of gTab has a DVB-T hardware component MORE than ours, let's hope that the fm radio receving capabilities are not in that chip we don't have.

Not to go off topic, but do you have any pictures of it installed in your car?
 

kholdstare

Member
Oct 30, 2007
28
5
Kansas City
There is an app that works really well called TuneIn Radio. It will get you all of your local stations or any other stations you want. Pretty much the same as having the FM radio except you need cell signal for data.
 

natious

Senior Member
Dec 22, 2010
1,501
438
Melbourne
www.facebook.com
There is an app that works really well called TuneIn Radio. It will get you all of your local stations or any other stations you want. Pretty much the same as having the FM radio except you need cell signal for data.

theres also radio time that gets stations from all over the world, but having fm transmitting abilities would be freeking awesome, id definitely replace my headunit with the tab then
 

cgerdb

Member
Nov 24, 2010
16
1
Should I get started porting the MIUI FM app in preparation for a working tuning framework? :)

If you can, yes please do so, like someone said: the hardware is there, just like it has been on the iPhones but why they wouldn't want you to listen to free music, iTunes would die. And I guess Samsung doesn't want you to either because they got the app store and media sale fevers.
 
Last edited:

Top Liked Posts

  • There are no posts matching your filters.
  • 5
    - UPDATE 16 February 2011 -

    Attached to this post is the relevant FM source code extracted from the CyanogenMod git repository [1] and merged into the AOSP code base (note that so far I haven't used any of the "Update1" source code released by Samsung, but this would be advisable). This is not a straight copy from CM, I manually imported the FM-related code snippets (CM tweaks the audio framework further, with effects, etc.).

    The good news is that this compiles fine, the bad news is that when I copy the resulting libs to the device, the Tab gets stuck at the Samsung logo. :eek:

    /system/lib/libandroid_runtime.so
    /system/lib/libaudioflinger.so
    /system/lib/libmedia.so
    /system/lib/libmedia_jni.so

    At this stuck boot stage, I was able to open an ADB session, but /proc/kmsg (and other logs) were not showing any obvious problems so I couldn't diagnose the actual issue. I mounted the SD card (onto which I had a backup of the original libraries), and I restored the *.so files. The Tab immediately generated the audio welcome cue and booted to completion. :cool: So I guess that my newly-compiled libraries set was blocking the audio system, somehow.

    At any rate, more work is needed to understand how to build required framework bits from AOSP so that they work on the Tab. Maybe there is more to it than just the aforementioned 4 *.so libs. For example, I'm not sure where these files take part:

    media/java/android/media/AudioManager.java
    media/java/android/media/AudioService.java
    media/java/android/media/AudioSystem.java
    media/java/android/media/MediaRecorder.java

    Furthermore, I wonder how to setup the /dev/radio0 at kernel level ? It doesn't even seem to be needed at all, because the code ignores the device path altogether !! :confused: (/dev/radio0 would be a video-for-Linux v4l device, possibly required by the FM framework...although access to the Broadcom BCM4329 chipset seems to be direct in the source code) I can't see any obvious kernel diff on the CyanogenMod repository, so I'm a bit stuck to be honest ! :( Ultimately the v4l device should allow us to query the FM functionality directly: [v4l2-ctl -d /dev/radio0 --all -L], but it looks like CyanogenMod implements a FM hack by querying hci_w().

    Talking about CM, it is clear that Techomancer's porting effort is worth mentioning, as it may be possible to enable FM support more easily there: https://github.com/techomancer / http://xdaforums.com/showthread.php?t=931857

    The FM app compiles fine (I just dropped the source code [2] straight into the AOSP tree). The only problem I have is JAR/APK signing, but I could use Eclipse to build the app separately from the AOSP build system. I haven't bothered, there's no point spending time on this until the FM driver/kernel stuff works. ;)

    Cheers, Daniel

    [1]
    https://github.com/CyanogenMod/andr...mmit/350dcf82f0c95d15ae286240d9792a6d90891f4e

    [2]
    https://github.com/CyanogenMod/android_packages_apps_FM

    Here's a bunch of useful links:

    http://www.ifixit.com/Teardown/Samsung-Galaxy-Tab-Teardown/4103/2

    http://hk.samsungmobile.com/ENG/mobile-phones/samsung-galaxytab-specification

    https://www.codeaurora.org/gitweb/quic/la/?p=platform/packages/apps/FM.git;a=summary

    http://android.git.kernel.org/?p=pl...it;h=f427424c414886903e4ad654c143c8ce6ec10e3c

    https://www.codeaurora.org/gitweb/q...o;hb=487ae541eb618b91431d0a19ae0a6eab1f6019aa

    https://github.com/millenomi/nomadikradio

    http://gitorious.org/0xdroid/packages_apps_fm/trees/master/src/com/quicinc/fmradio/

    https://github.com/j-r0dd/android_packages_apps_FM/tree/froyo/src/com/quicinc/fmradio/

    http://www.miui.com/thread-1687-1-1.html

    http://android.modaco.com/content-page/318792/how-to-tune-a-fm-radio-station/page/40/#entry1422743

    http://forum.cyanogenmod.com/topic/10377-qrequest-fm-radio-on-bcm4325-phones/
    1
    Note: although there is a workaround for the Droid 2, it wouldn't work with the Tab because it uses a different chipset:

    http://xdaforums.com/showthread.php?t=769894
    1
    Alright, the Motorola Droid 2 app runs fine in portrait mode (although bitmaps are not scaled to HDPI), but it stays on "Waiting for FM radio...". Here's the relevant logcat snippets:

    Code:
    ActivityIntentInfo{482a8dc0 com.motorola.fmradio.FMRadioMain}
    
    ActivityIntentInfo{484825b0 com.sec.android.app.factorytest.FmRadioTest}
    
    ActivityIntentInfo{48474078 com.android.settings.RadioInfo}
    
    I/ActivityManager( 2489): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.motorola.fmradio/.FMRadioMain }
    
    I/ActivityManager( 2489): Start proc com.motorola.fmradio for activity com.motorola.fmradio/.FMRadioMain: pid=6109 uid=10256 gids={}
    
    I/ActivityThread( 6109): Publishing provider com.motorola.provider.fmradio: com.motorola.fmradio.FMDataProvider
    
    I/dalvikvm( 6109): Could not find method android.util.Log.e, referenced from method com.motorola.fmradio.FMRadioMain$19.handleMessage
    W/dalvikvm( 6109): VFY: unable to resolve static method 162: Landroid/util/Log;.e (Ljava/lang/String;[Ljava/lang/String;)I
    D/dalvikvm( 6109): VFY: replacing opcode 0x71 at 0x0cb9
    D/dalvikvm( 6109): VFY: dead code 0x0cbc-0cbc in Lcom/motorola/fmradio/FMRadioMain$19;.handleMessage (Landroid/os/Message;)V
    D/FMRadioMain( 6109): **************FMRadioMain Activity onCreate() called!****************
    D/FMRadioMain( 6109): **************FMRadioMain Activity onCreateInternal() called!****************
    D/dalvikvm( 6109): GC_EXTERNAL_ALLOC freed 1148 objects / 76976 bytes in 36ms
    I/global  ( 2489): Default buffer size used in BufferedInputStream constructor. It would be better to be explicit if an 8k buffer is required.
    D/FMDataProvider( 6109): set save table: FM_Radio_saved_state
    D/FMRadioMain( 6109): enter initResourceRefs()
    D/FMRadioMain( 6109): Enter getDataFromDB(), will update data in list_results
    D/FMDataProvider( 6109): set channel table: FM_Radio
    D/FMRadioMain( 6109): Leave getDataFromDB()
    D/FMRadioMain( 6109): Enter bindListViewToAdapter()
    D/FMRadioMain( 6109): leave initResourceRefs()
    D/FMRadioMain( 6109): Start to bind to FMRadio service
    I/ActivityManager( 2489): Start proc com.motorola.fmradio:remote for service com.motorola.fmradio/.FMRadioPlayerService: pid=6116 uid=10256 gids={}
    D/FMDataProvider( 6109): set channel table: FM_Radio
    D/FMRadioMain( 6109): enter updateListView()
    D/FMRadioMain( 6109): Enter getDataFromDB(), will update data in list_results
    D/FMDataProvider( 6109): set channel table: FM_Radio
    D/FMRadioMain( 6109): Leave getDataFromDB()
    D/FMRadioMain( 6109): leave updateListView()
    D/FMRadioMain( 6109): enter updateDisplayPanel()
    D/FMRadioMain( 6109): FMRadio updateDisplay: currentFreq 87500 a1 0 a2 8 a3 7 a4 5
    D/dalvikvm( 2391): GC_EXPLICIT freed 284 objects / 10768 bytes in 63ms
    D/FMRadioMain( 6109): leave updateDisplayPanel()
    D/FMRadioMain( 6109): enter updateListView()
    D/FMRadioMain( 6109): Enter getDataFromDB(), will update data in list_results
    D/FMDataProvider( 6109): set channel table: FM_Radio
    D/FMRadioMain( 6109): Leave getDataFromDB()
    D/FMRadioMain( 6109): leave updateListView()
    D/FMRadioMain( 6109): onStart() called
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =0
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =1
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =2
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =3
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =4
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =5
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =6
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =7
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =8
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =9
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =10
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =11
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/dalvikvm( 2391): GC_EXPLICIT freed 47 objects / 2096 bytes in 66ms
    E/JAVA:FMRadioPlayerService( 6116): onCreate() called
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =12
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =13
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =14
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =0
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =1
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =2
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =3
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =4
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =5
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =6
    D/JAVA:FMRadioPlayerService( 6116): onBind() called
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =7
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =8
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =9
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =10
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/JAVA:FMRadioPlayerService( 6116): register airplane on/off broadcasts
    D/JAVA:FMRadioPlayerService( 6116): register headset plug in/out broadcasts
    D/JAVA:FMRadioPlayerService( 6116): register the audio path change message
    D/JAVA:FMRadioPlayerService( 6116): register fmradio command
    D/JAVA:FMRadioPlayerService( 6116): onStart() called
    D/JAVA:FMRadioPlayerService( 6116): mServiceState.curServiceState() = -1
    D/JAVA:FMRadioPlayerService( 6116): Before fm radio power on
    D/FMDataProvider( 6109): set save table: FM_Radio_saved_state
    D/JAVA:FMRadioPlayerService( 6116): FMStateUNInit:powerOn(): Power on fmradio device
    W/ActivityManager( 2489): Unable to start service Intent { act=com.motorola.android.fmradio.FMRADIO_SERVICE }: not found
    D/JAVA:FMRadioPlayerService( 6116): After fm radio power on
    D/JAVA:FMRadioPlayerService( 6116): fm radio power on fail
    D/JAVA:FMRadioPlayerService( 6116): Received intent: android.intent.action.HEADSET_PLUG
    D/JAVA:FMRadioPlayerService( 6116): HEADSET is pluged in/out.
    V/JAVA:FMRadioPlayerService( 6116): handleMessage headset plug begin
    V/JAVA:FMRadioPlayerService( 6116): mHeadset = 1
    V/JAVA:FMRadioPlayerService( 6116): mIsHeadsetPlugged = true
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =0
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =1
    W/JAVA:FMRadioPlayerService( 6116): Headset is pluged in!
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/dalvikvm( 2391): GC_EXPLICIT freed 2 objects / 64 bytes in 109ms
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =2
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =3
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =4
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =5
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =6
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =7
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =8
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =9
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =10
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    W/FMRadioMain( 6109): onServiceConnected::fmradio java service started
    W/JAVA:FMRadioPlayerService( 6116): IFMRadioPlayerService.Stub : isPowerOn
    D/JAVA:FMRadioPlayerService( 6116): FMStateUNInit:isPowerOn(), return misPowerOn value to UI
    W/FMRadioMain( 6109): servie is ready popup a wait dialog
    D/FMDataProvider( 6109): set channel table: FM_Radio
    D/JAVA:FMRadioPlayerService( 6116): Received intent: com.motorola.fmradio.bindservice.succeed
    D/JAVA:FMRadioPlayerService( 6116): bind service succeed
    W/JAVA:FMRadioPlayerService( 6116): Notice home to show update current preset name on the notice bar. 
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =0
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =1
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =2
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =3
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =4
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =5
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =6
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =7
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =8
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =9
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =10
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =11
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =12
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =13
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =14
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =0
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =1
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =2
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =3
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =4
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =5
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =6
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =7
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =8
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =9
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter, getView(), position =10
    D/FMRadioMain( 6109): FMRadio ChannelListAdapter getview, set gone
    D/FMRadioMain ChannelListView( 6109): call onDraw
    D/dalvikvm( 6010): GC_FOR_MALLOC freed 44693 objects / 3062512 bytes in 134ms
    D/dalvikvm( 6010): GC_FOR_MALLOC freed 41160 objects / 3021872 bytes in 59ms
    D/dalvikvm( 6010): GC_FOR_MALLOC freed 40577 objects / 2773512 bytes in 42ms
    D/FMRadioMain ChannelListView( 6109): call onDraw
    D/FMRadioMain ChannelListView( 6109): call onDraw
    D/FMRadioMain ChannelListView( 6109): call onDraw
    D/FMRadioMain ChannelListView( 6109): call onDraw
    D/FMRadioMain ChannelListView( 6109): call onDraw
    D/dalvikvm( 6010): GC_FOR_MALLOC freed 33184 objects / 2369512 bytes in 242ms
    D/FMRadioMain ChannelListView( 6109): call onDraw
    D/FMRadioMain ChannelListView( 6109): call onDraw
    D/FMRadioMain ChannelListView( 6109): call onDraw
    D/FMRadioMain ChannelListView( 6109): call onDraw
    
    
    V/WindowManager( 2489): Dsptch to Window{48632258 com.motorola.fmradio/com.motorola.fmradio.FMRadioMain paused=false}
    W/KeyCharacterMap( 6109): No keyboard for id 0
    W/KeyCharacterMap( 6109): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
    E/ShutdownThread( 2489): IsShutDownStarted()
    I/KeyInputQueue( 2489): Input event
    D/KeyInputQueue( 2489): screenCaptureKeyFlag setting 0
    V/WindowManager( 2489): Dsptch to Window{48632258 com.motorola.fmradio/com.motorola.fmradio.FMRadioMain paused=false}
    W/InputManagerService( 2489): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@48314940
    D/dalvikvm( 5937): GC_EXPLICIT freed 2208 objects / 146560 bytes in 60ms
    E/ShutdownThread( 2489): IsShutDownStarted()
    I/KeyInputQueue( 2489): Input event
    D/KeyInputQueue( 2489): screenCaptureKeyFlag setting 1
    V/WindowManager( 2489): Dsptch to Window{48629c78 com.motorola.fmradio/com.motorola.fmradio.FMRadioMain paused=false}
    E/ShutdownThread( 2489): IsShutDownStarted()
    I/KeyInputQueue( 2489): Input event
    D/KeyInputQueue( 2489): screenCaptureKeyFlag setting 0
    V/WindowManager( 2489): Dsptch to Window{48629c78 com.motorola.fmradio/com.motorola.fmradio.FMRadioMain paused=false}
    D/FMRadioMain( 6109): onPause() called
    E/WindowManager( 2489): Overwriting rotation value from 0
    W/InputManagerService( 2489): Starting input on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@4848d5c0 (uid=10256 pid=6109)
    I/ActivityManager( 2489): No longer want com.appspot.swisscodemonkeys.apps (pid 6020): hidden #16
    D/FMRadioMain( 6109): onStop() called
    D/FMRadioMain( 6109): onDestroy() called
    D/JAVA:FMRadioPlayerService( 6116): onUnbind() called
    D/JAVA:FMRadioPlayerService( 6116):  unregister Receiver.
    1
    I also tried a different FMRadio.apk (just that, no other lib/bin files), but the app com.huawei.android.FMRadio crashes with a Force Close. This is the one with a grey/silver radio icon (big black speaker on the right hand side).

    The HtcFMRadio.apk (com.htc.fm) also FC, the icon for this one is a black radio with white knobs at the bottom, and a red needle on white background at the top.

    The Droid 2 icon is a big square dial with a red needle.

    :(

    EDIT: the deodexed FMRadio app from the Samsung Galaxy S (com.sec.android.app.fm) also crashes with Force Close. The icon is a big orange square with a single mini round dial in the bottom middle.
    1
    Should I get started porting the MIUI FM app in preparation for a working tuning framework? :)