最近做Android9.0的项目定制出现开机动画铃声的问题,以下是解决方案
解决预置开机动画,铃声无效果的问题
1.device/mediatek/mt6739/device.mk
PRODUCT_PACKAGES += mtkbootanimation
PRODUCT_PACKAGES += libmtkbootanimation
2.device/mediatek/sepolicy/basic/non_plat/audioserver.te
allow audioserver bootanim:binder call;
3.frameworks/base/cmds/bootanimation/
在改文件夹下面将Android.mk文件修改为Android_disable.mk(当然删掉也是一样的)
4.vendor/mediatek/proprietary/operator/frameworks/bootanimation/
在改文件夹下面将Android_disable.mk文件修改为Android.mk
5.vendor/mediatek/proprietary/operator/frameworks/bootanimation/MtkBootanimation/
在改文件夹下面将Android_disable.mk文件修改为Android.mk
6.vendor/mediatek/proprietary/frameworks/base/services/core/java/com/mediatek/server/MtkShutdownThread.java
private boolean showShutdownAnimation(Context context) {
.................
bootanimCust(context);
return true;
}
- return false;
+ return true;
}
private static void bootanimCust(Context context) {
........
public static int isCustBootAnim() {
.........................
sysProp = "NONE";
mode = DEFAULT_MODE;
}
+ mode = ANIMATION_MODE; //Enable Shutdown Animation
mShutOffAnimation = mode;
Log.i(TAG,"mShutOffAnimation: " + mode + " (" + sysProp + ")");
return mode;
}
7.vendor/mediatek/proprietary/operator/frameworks/bootanimation/MtkBootanimation/BootAnimation.cpp
bool BootAnimation::threadLoop()
{
.......
// We have no bootanimation file, so we use the stock android logo
// animation.
sp<MediaPlayer> mediaplayer;
- const char* resourcePath = NULL;
+ const char* resourcePath = initAudioPath();
status_t mediastatus = NO_ERROR;
if (resourcePath != NULL) {
bPlayMP3 = true;
.......
}
解决完开机动画显示发现首次开机还是无铃声,而且铃声和动画并不同步
解决铃声不同步问题
1.frameworks/av/media/libstagefright/MediaCodec.cpp
void MediaCodec::setState(State newState) {
...........
cancelPendingDequeueOperations();
- updateBatteryStat();
+ //updateBatteryStat();
}
void MediaCodec::returnBuffersToCodec(bool isReclaim) {
2.frameworks/av/services/audioflinger/AudioFlinger.cpp
AudioFlinger::AudioFlinger()
...........
mTotalMemory(0),
mClientSharedHeapSize(kMinimumClientSharedHeapSizeBytes),
mGlobalEffectEnableTime(0),
- mSystemReady(false)
+ mSystemReady(true)
{
// unsigned instead of audio_unique_id_use_t, because ++ operator is unavailable for enum
for (unsigned use = AUDIO_UNIQUE_ID_USE_UNSPECIFIED; use < AUDIO_UNIQUE_ID_USE_MAX; use++) {
3.vendor/mediatek/proprietary/operator/frameworks/bootanimation/MtkBootanimation/BootAnimation.cpp
bool BootAnimation::threadLoop()
{
.........
if (bPlayMP3 && mediastatus == NO_ERROR) {
AutoMutex _l(mMyLock);
if (!bAudioStarted) {
- status_t err = mCondition.waitRelative(mMyLock, s2ns(4));
+ status_t err = mCondition.waitRelative(mMyLock, s2ns(40));
ALOGD("audio started re %d", err);
}
}
.......
}
4.vendor/mediatek/proprietary/operator/frameworks/bootanimation/MtkBootanimation/audioplay.cpp
// for native audio
#include <SLES/OpenSLES.h>
#include <SLES/OpenSLES_Android.h>
+#include <media/AudioSystem.h>
+#include <system/audio.h>
namespace audioplay {
namespace {
// create buffer queue audio player
bool createBufferQueueAudioPlayer(const ChunkFormat* chunkFormat) {
.............
ALOGE("config GetInterface failed with result %d", result);
return false;
}
+
+ int index = 0;
+ android::AudioSystem::initStreamVolume(AUDIO_STREAM_SYSTEM, 0, 7);
+ audio_devices_t device = android::AudioSystem::getDevicesForStream(AUDIO_STREAM_SYSTEM);
+ android::AudioSystem::setStreamVolumeIndex(AUDIO_STREAM_SYSTEM, 7, device);
+ android::AudioSystem::getStreamVolumeIndex(AUDIO_STREAM_SYSTEM, &index, device);
+
+ if (index != 0) {
+ ALOGE("android::AudioSystem::getDevicesForStream end index = %d", index);
+ } else {
+ ALOGE("Boot Music silence");
+ }
+
SLint32 streamType = SL_ANDROID_STREAM_SYSTEM;
result = (*playerConfig)->SetConfiguration(playerConfig,
SL_ANDROID_KEY_STREAM_TYPE, &streamType, sizeof(SLint32));
.................
}
解决首次开机没有铃声的问题
1.frameworks/av/media/libaudioclient/AudioTrack.cpp
}
}
#endif
+ if(!strcmp(mAttributes.tags,"BootAnimationAudioTrack")) {
+ ALOGD("mAttributes.tags = BootAnimationAudioTrack");
+ strcpy(input.attr.tags, "BootAnimationAudioTrack");
+ }else{
+ strcpy(input.attr.tags, "");
+ }
+
input.flags = mFlags;
input.frameCount = mReqFrameCount;
input.notificationFrameCount = mNotificationFramesReq;
2.frameworks/av/services/audioflinger/Threads.cpp
}
#endif
- // XXX: these things DON'T need to be done each time
+
+
+ if(!strcmp(track->mAttr.tags,"BootAnimationAudioTrack")) {
+ ALOGD("mAttributes.tags = BootAnimationAudioTrack");
+ vlf = 0.50f;
+ vrf = 0.50f;
+ vaf = 0.50f;
+ }
+
+ // XXX: these things DON'T need to be done each time
mAudioMixer->setBufferProvider(name, track);
mAudioMixer->enable(name);
3.vendor/mediatek/proprietary/operator/frameworks/bootanimation/MtkBootanimation/BootAnimation.cpp
#endif
-#if !(defined(MTK_CARRIEREXPRESS_PACK) && defined(MTK_TER_SERVICE))
+//#if !(defined(MTK_CARRIEREXPRESS_PACK) && defined(MTK_TER_SERVICE))
static const char* mAudioPath[2][PATH_COUNT] =
{{"/system/media/bootaudio.mp3", "/custom/media/bootaudio.mp3", "/data/local/bootaudio.mp3"} , /* bootaudio path */
{"/system/media/shutaudio.mp3", "/custom/media/shutaudio.mp3", "/data/local/shutaudio.mp3"} /* shutaudio path */
};
-#endif
+//#endif
namespace android {
mShuttingDown = true;
}
bShutRotate = bSetRotated;
- bPlayMP3 = bSetPlayMP3;
+ bPlayMP3 = bSetPlayMP3?bSetPlayMP3:true;
mProgram = 0;
bETC1Movie = false;
mBootVideoPlayType = BOOT_VIDEO_PLAY_FULL;
// We have no bootanimation file, so we use the stock android logo
// animation.
sp<MediaPlayer> mediaplayer;
- const char* resourcePath = initAudioPath();
+ int index = 0;
+ if (bBootOrShutDown) {
+ index = 0;
+ } else {
+ index = 1;
+ }
+
+ const char* resourcePath = mAudioPath[index][0];//initAudioPath();
status_t mediastatus = NO_ERROR;
+ usleep(800000);
if (resourcePath != NULL) {
bPlayMP3 = true;
ALOGD("sound file path: %s", resourcePath);