给什么平台,跳什么舞

FM bugs

96704  播放FM时,音量调节迟钝。

Log 看到FMPlay onKeyDown keyCode

定位代码,FMPlay.java onKeyDown,发现在KEYCODE_VOLUME_UP | KEYCODE_VOLUME_DOWN时,没做任何事情。

FMplayService stream type 7 value 3

fmradio value=3

FMplayService set volume3

FMPlay onKeyDown keyCode=24

FMplayService stream type 7 value 4

fmradio value=4

FMplayService set volume 4

FMplayService stream type 7 value 4

fmradio value=4

FMplayService set volume 4

一次按键,fmradio操作了3次,这是为什么?

根据LOG顺序,猜想fmradio也在监听音量按键消息。

AudioPolicyService

 

想起之前对FM的音量控制处理过,即在background的状态时,调用FM音量。

系统有个消息预处理机制,

frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java (2.2)

frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java (2.3.5)

handleVolumeKey(AudioManager.STREAM_FM, keyCode);

audioService.adjustStreamVolume(stream,...);

-------------------------------------------------------------------------------------------------------

bug 96617 在播放时,按<< 或 >> ,关闭,开启,显示118.9MHz

01-01 15:05:52.880: ERROR/fmradio(900): (getFreq)result=0 errno=0 freq=1189

区别就是(setFreq)freq=1189 或 879(其它)

01-01 15:05:52.930: ERROR/fmradio(900): (setFreq)freq=879 result=0 errno=0

底层fmradio代码,

grep fmradio -> frameworks/base/core/jni/android_hardware_fm.cpp (setFreq)

[frameworks/base/core/java/android/hardware/fmradio/FmReceiverJNI.java setFreqNative; FmRxControls.java FmReceiverJNI.setFreqNative(fd,mFreq)]

setFreqNative -> frameworks/base/core/java/android/hardware/fmradio/FmRxControls.java

mFreq -> setFreq(int f) -> FmTransceiver.java mControl.setFreq(frequencyKHz); ->

 

用在setStation中加LOG的方式,发现:

正常情况下开启时会调用FmTransceiver.java setStation 而BUG出现的情况下,没有调用

正常情况下开启时会调用FmRxControls.java setStation  而BUG出现的情况下,没有调用

FmTransceiver.java

protected FmRxControls mControl;

public boolean setStation(int freqencyKHz){

    mControl.setFreq(frequencyKHz);

    mControl.setStation(sFd);

    return true;

}

FMplayService.java

import android.hardware.fmradio.FmReceiver;

private FmReceiver mReceiver = null;

setFreq mReceiver.setStation((int)(freq * TRANS_MULT));

-------

Log对比,发现FMPlay.java mHandler MSG_UPDATE freq获取时出错,是因为变量searchfreq

 

posted @ 2012-10-15 15:00  Jimwind  阅读(598)  评论(0)    收藏  举报
==============精通*学习*关注==============