From 5755fea3fbd2b1deebe0fa935b444b8731c610a6 Mon Sep 17 00:00:00 2001 From: username Date: Thu, 27 Dec 2018 09:48:08 +0800 Subject: [PATCH] Camera: Lazy load sound files to speed up camera startup Lazy loading of sound files can speed up camera startup more than 60ms, it gives users a great experience. Many apps do not playSound when camera open or they may use their own audio files. so we load audio files as needed. Bug: 128432959 Test: install wechat app,open camera,use systrace to see the uiThread wait time. Change-Id: I3b3697cf9d0d919b88276f6d8e7fdd84578f4fcd --- .../camera/libcameraservice/CameraService.cpp | 47 +++++++++++-------- .../camera/libcameraservice/CameraService.h | 6 +-- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp index ba0244e2a4..8a752b1d2b 100644 --- a/services/camera/libcameraservice/CameraService.cpp +++ b/services/camera/libcameraservice/CameraService.cpp @@ -2027,31 +2027,37 @@ sp CameraService::newMediaPlayer(const char *file) { return mp; } -void CameraService::loadSound() { - ATRACE_CALL(); - +void CameraService::increaseSoundRef() { Mutex::Autolock lock(mSoundLock); - LOG1("CameraService::loadSound ref=%d", mSoundRef); - if (mSoundRef++) return; + mSoundRef++; +} - mSoundPlayer[SOUND_SHUTTER] = newMediaPlayer("/product/media/audio/ui/camera_click.ogg"); - if (mSoundPlayer[SOUND_SHUTTER] == nullptr) { - mSoundPlayer[SOUND_SHUTTER] = newMediaPlayer("/system/media/audio/ui/camera_click.ogg"); - } - mSoundPlayer[SOUND_RECORDING_START] = newMediaPlayer("/product/media/audio/ui/VideoRecord.ogg"); - if (mSoundPlayer[SOUND_RECORDING_START] == nullptr) { - mSoundPlayer[SOUND_RECORDING_START] = +void CameraService::loadSoundLocked(sound_kind kind) { + ATRACE_CALL(); + + LOG1("CameraService::loadSoundLocked ref=%d", mSoundRef); + if (SOUND_SHUTTER == kind && mSoundPlayer[SOUND_SHUTTER] == NULL) { + mSoundPlayer[SOUND_SHUTTER] = newMediaPlayer("/product/media/audio/ui/camera_click.ogg"); + if (mSoundPlayer[SOUND_SHUTTER] == nullptr) { + mSoundPlayer[SOUND_SHUTTER] = newMediaPlayer("/system/media/audio/ui/camera_click.ogg"); + } + } else if (SOUND_RECORDING_START == kind && mSoundPlayer[SOUND_RECORDING_START] == NULL) { + mSoundPlayer[SOUND_RECORDING_START] = newMediaPlayer("/product/media/audio/ui/VideoRecord.ogg"); + if (mSoundPlayer[SOUND_RECORDING_START] == nullptr) { + mSoundPlayer[SOUND_RECORDING_START] = newMediaPlayer("/system/media/audio/ui/VideoRecord.ogg"); - } - mSoundPlayer[SOUND_RECORDING_STOP] = newMediaPlayer("/product/media/audio/ui/VideoStop.ogg"); - if (mSoundPlayer[SOUND_RECORDING_STOP] == nullptr) { - mSoundPlayer[SOUND_RECORDING_STOP] = newMediaPlayer("/system/media/audio/ui/VideoStop.ogg"); + } + } else if (SOUND_RECORDING_STOP == kind && mSoundPlayer[SOUND_RECORDING_STOP] == NULL) { + mSoundPlayer[SOUND_RECORDING_STOP] = newMediaPlayer("/product/media/audio/ui/VideoStop.ogg"); + if (mSoundPlayer[SOUND_RECORDING_STOP] == nullptr) { + mSoundPlayer[SOUND_RECORDING_STOP] = newMediaPlayer("/system/media/audio/ui/VideoStop.ogg"); + } } } -void CameraService::releaseSound() { +void CameraService::decreaseSoundRef() { Mutex::Autolock lock(mSoundLock); - LOG1("CameraService::releaseSound ref=%d", mSoundRef); + LOG1("CameraService::decreaseSoundRef ref=%d", mSoundRef); if (--mSoundRef) return; for (int i = 0; i < NUM_SOUNDS; i++) { @@ -2067,6 +2073,7 @@ void CameraService::playSound(sound_kind kind) { LOG1("playSound(%d)", kind); Mutex::Autolock lock(mSoundLock); + loadSoundLocked(kind); sp player = mSoundPlayer[kind]; if (player != 0) { player->seekTo(0); @@ -2096,7 +2103,7 @@ CameraService::Client::Client(const sp& cameraService, mRemoteCallback = cameraClient; - cameraService->loadSound(); + cameraService->increaseSoundRef(); LOG1("Client::Client X (pid %d, id %d)", callingPid, mCameraId); } @@ -2106,7 +2113,7 @@ CameraService::Client::~Client() { ALOGV("~Client"); mDestructionStarted = true; - sCameraService->releaseSound(); + sCameraService->decreaseSoundRef(); // unconditionally disconnect. function is idempotent Client::disconnect(); } diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h index 624d1ca9d1..991c770d65 100644 --- a/services/camera/libcameraservice/CameraService.h +++ b/services/camera/libcameraservice/CameraService.h @@ -177,10 +177,10 @@ public: NUM_SOUNDS }; - void loadSound(); void playSound(sound_kind kind); - void releaseSound(); - + void loadSoundLocked(sound_kind kind); + void decreaseSoundRef(); + void increaseSoundRef(); /** * Update the state of a given camera device (open/close/active/idle) with * the camera proxy service in the system service