diff options
| author | 2011-07-22 09:04:31 -0700 | |
|---|---|---|
| committer | 2011-07-25 18:41:12 -0700 | |
| commit | 6dbdc40e9a317488fc5f6e14cf9e699bce9a9387 (patch) | |
| tree | eed576356d64812249d1b021eff7f88e24bde25a /services/powermanager/IPowerManager.cpp | |
| parent | 6c454c3225fd47422024af915fa28d5210d1e82e (diff) | |
Fix issue 4604090: notification sound interrupted.
The problem is that the audio HAL fails to acquire the wake lock when playing the notification.
This is because of a change that removed the mediaserver process form the system group for honeycomb.
The fix consists in requesting the wake lock from PowerManagerService when AudioFlinger mixer
wakes up.
A consequence of this change is that audio HALs or pcm drivers do not have to hold wake locks
anymore as in the past.
Change-Id: I4fb3cc84816c9c408ab7fec75886baf801e1ecb5
Diffstat (limited to 'services/powermanager/IPowerManager.cpp')
| -rw-r--r-- | services/powermanager/IPowerManager.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/services/powermanager/IPowerManager.cpp b/services/powermanager/IPowerManager.cpp new file mode 100644 index 000000000000..a0f19d4acf76 --- /dev/null +++ b/services/powermanager/IPowerManager.cpp @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "IPowerManager" +//#define LOG_NDEBUG 0 +#include <utils/Log.h> + +#include <stdint.h> +#include <sys/types.h> + +#include <binder/Parcel.h> + +#include <powermanager/IPowerManager.h> + +namespace android { + +// must be kept in sync with IPowerManager.aidl +enum { + ACQUIRE_WAKE_LOCK = IBinder::FIRST_CALL_TRANSACTION, + RELEASE_WAKE_LOCK = IBinder::FIRST_CALL_TRANSACTION + 4, +}; + +class BpPowerManager : public BpInterface<IPowerManager> +{ +public: + BpPowerManager(const sp<IBinder>& impl) + : BpInterface<IPowerManager>(impl) + { + } + + virtual status_t acquireWakeLock(int flags, const sp<IBinder>& lock, const String16& tag) + { + Parcel data, reply; + data.writeInterfaceToken(IPowerManager::getInterfaceDescriptor()); + + data.writeInt32(flags); + data.writeStrongBinder(lock); + data.writeString16(tag); + // no WorkSource passed + data.writeInt32(0); + return remote()->transact(ACQUIRE_WAKE_LOCK, data, &reply); + } + + virtual status_t releaseWakeLock(const sp<IBinder>& lock, int flags) + { + Parcel data, reply; + data.writeInterfaceToken(IPowerManager::getInterfaceDescriptor()); + data.writeStrongBinder(lock); + data.writeInt32(flags); + return remote()->transact(RELEASE_WAKE_LOCK, data, &reply); + } +}; + +IMPLEMENT_META_INTERFACE(PowerManager, "android.os.IPowerManager"); + +// ---------------------------------------------------------------------------- + +}; // namespace android |