[DESCRIPTION]
L 及之后版本首次开机截屏无声音, 但之后的截屏可以正常发声
问题原因是: 首次截屏时, 由于 Framework 部分声音解码模块初始化比较耗时
造成解码没有做完就启动了播放线程, 此时便听不到声音
需要晚些启动播放线程, 等待解码完成, 请参考如下解法:
[SOLUTION]
Please modify:
1:status_t Sample::doLoad() 方法内 error 段改为:
error:
mState = ERROR;//add this line
mHeap.clear();
return status;
2: soundpool.h 中,加入 ERROR 态定义
enum sample_state { UNLOADED, LOADING, READY, UNLOADING, ERROR };
3:play 方法加入如下修改
int SoundPool::play(int sampleID, float leftVolume, float rightVolume,
int priority, int loop, float rate)
in /frameworks/av/media/libmedia/SoundPool.cpp
add lines wrapped in dismissed lines:
int SoundPool::play(int sampleID, float leftVolume, float rightVolume,
int priority, int loop, float rate)
{
ALOGV("play sampleID=%d, leftVolume=%f, rightVolume=%f, priority=%d, loop=%d, rate=%f",
sampleID, leftVolume, rightVolume, priority, loop, rate);
sp<Sample> sample;
SoundChannel* channel;
int channelID;
Mutex::Autolock lock(&mLock);
if (mQuit) {
return 0;
}
// is sample ready?
sample = findSample(sampleID);//reference line
//add begin
if(sample != 0){
int LoopCounter = 5;
while(LoopCounter-- > 0 && (sample->state() != Sample::READY) && (sample->state() !=
Sample::ERROR )){
ALOGD("wait for sample ready, sleep 100ms");
usleep(100 * 1000);
}
}//add end
...
|