1d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent/* 2d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent** 3d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent** Copyright 2010, The Android Open Source Project 4d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent** 5d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent** Licensed under the Apache License, Version 2.0 (the "License"); 6d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent** you may not use this file except in compliance with the License. 7d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent** You may obtain a copy of the License at 8d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent** 9d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent** http://www.apache.org/licenses/LICENSE-2.0 10d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent** 11d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent** Unless required by applicable law or agreed to in writing, software 12d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent** distributed under the License is distributed on an "AS IS" BASIS, 13d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent** See the License for the specific language governing permissions and 15d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent** limitations under the License. 16d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent*/ 17d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent 18d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent//#define LOG_NDEBUG 0 19d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent#define LOG_TAG "IEffect" 20d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent#include <utils/Log.h> 21d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent#include <stdint.h> 22d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent#include <sys/types.h> 23d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent#include <binder/Parcel.h> 24d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent#include <media/IEffect.h> 25d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent 26d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurentnamespace android { 27d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent 28d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurentenum { 29d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent ENABLE = IBinder::FIRST_CALL_TRANSACTION, 30d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent DISABLE, 31d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent COMMAND, 32d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent DISCONNECT, 33d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent GET_CBLK 34d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent}; 35d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent 36d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurentclass BpEffect: public BpInterface<IEffect> 37d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent{ 38d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurentpublic: 39d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent BpEffect(const sp<IBinder>& impl) 40d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent : BpInterface<IEffect>(impl) 41d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent { 42d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent } 43d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent 44d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent status_t enable() 45d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent { 463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("enable"); 47d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent Parcel data, reply; 48d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent data.writeInterfaceToken(IEffect::getInterfaceDescriptor()); 49d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent remote()->transact(ENABLE, data, &reply); 50d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent return reply.readInt32(); 51d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent } 52d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent 53d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent status_t disable() 54d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent { 553856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("disable"); 56d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent Parcel data, reply; 57d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent data.writeInterfaceToken(IEffect::getInterfaceDescriptor()); 58d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent remote()->transact(DISABLE, data, &reply); 59d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent return reply.readInt32(); 60d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent } 61d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent 6225f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent status_t command(uint32_t cmdCode, 6325f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent uint32_t cmdSize, 6425f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent void *pCmdData, 6525f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent uint32_t *pReplySize, 6625f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent void *pReplyData) 67d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent { 683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("command"); 69d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent Parcel data, reply; 70d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent data.writeInterfaceToken(IEffect::getInterfaceDescriptor()); 71d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent data.writeInt32(cmdCode); 72d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent int size = cmdSize; 73d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent if (pCmdData == NULL) { 74d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent size = 0; 75d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent } 76d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent data.writeInt32(size); 77d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent if (size) { 78d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent data.write(pCmdData, size); 79d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent } 80d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent if (pReplySize == NULL) { 81d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent size = 0; 82d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent } else { 83d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent size = *pReplySize; 84d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent } 85d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent data.writeInt32(size); 86af7d8189f91c45ab919a6c9ac386b268c8d91168John Grossman 87af7d8189f91c45ab919a6c9ac386b268c8d91168John Grossman status_t status = remote()->transact(COMMAND, data, &reply); 8810e6660cc5da65b027c90489ba7ac55d1504e012Andy Hung if (status == NO_ERROR) { 8910e6660cc5da65b027c90489ba7ac55d1504e012Andy Hung status = reply.readInt32(); 9010e6660cc5da65b027c90489ba7ac55d1504e012Andy Hung } 91af7d8189f91c45ab919a6c9ac386b268c8d91168John Grossman if (status != NO_ERROR) { 92af7d8189f91c45ab919a6c9ac386b268c8d91168John Grossman if (pReplySize != NULL) 93af7d8189f91c45ab919a6c9ac386b268c8d91168John Grossman *pReplySize = 0; 94af7d8189f91c45ab919a6c9ac386b268c8d91168John Grossman return status; 95af7d8189f91c45ab919a6c9ac386b268c8d91168John Grossman } 96af7d8189f91c45ab919a6c9ac386b268c8d91168John Grossman 97d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent size = reply.readInt32(); 98d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent if (size != 0 && pReplyData != NULL && pReplySize != NULL) { 99d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent reply.read(pReplyData, size); 100d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent *pReplySize = size; 101d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent } 102d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent return status; 103d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent } 104d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent 105d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent void disconnect() 106d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent { 1073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("disconnect"); 108d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent Parcel data, reply; 109d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent data.writeInterfaceToken(IEffect::getInterfaceDescriptor()); 110d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent remote()->transact(DISCONNECT, data, &reply); 111d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent return; 112d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent } 113d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent 114d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent virtual sp<IMemory> getCblk() const 115d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent { 116d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent Parcel data, reply; 117d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent sp<IMemory> cblk; 118d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent data.writeInterfaceToken(IEffect::getInterfaceDescriptor()); 119d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent status_t status = remote()->transact(GET_CBLK, data, &reply); 120d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent if (status == NO_ERROR) { 121d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent cblk = interface_cast<IMemory>(reply.readStrongBinder()); 122a1d401d9f4a6ba477f0e07204e0b9481befcc928Glenn Kasten if (cblk != 0 && cblk->pointer() == NULL) { 123a1d401d9f4a6ba477f0e07204e0b9481befcc928Glenn Kasten cblk.clear(); 124a1d401d9f4a6ba477f0e07204e0b9481befcc928Glenn Kasten } 125d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent } 126d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent return cblk; 127d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent } 128d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent }; 129d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent 130d71a1be83ff31cdb6599c351f9832cefc8d447baEric LaurentIMPLEMENT_META_INTERFACE(Effect, "android.media.IEffect"); 131d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent 132d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent// ---------------------------------------------------------------------- 133d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent 134d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurentstatus_t BnEffect::onTransact( 135d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 136d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent{ 137e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten switch (code) { 138d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent case ENABLE: { 1393856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("ENABLE"); 140d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent CHECK_INTERFACE(IEffect, data, reply); 141d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent reply->writeInt32(enable()); 142d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent return NO_ERROR; 143d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent } break; 144d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent 145d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent case DISABLE: { 1463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("DISABLE"); 147d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent CHECK_INTERFACE(IEffect, data, reply); 148d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent reply->writeInt32(disable()); 149d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent return NO_ERROR; 150d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent } break; 151d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent 152d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent case COMMAND: { 1533856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("COMMAND"); 154d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent CHECK_INTERFACE(IEffect, data, reply); 15525f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent uint32_t cmdCode = data.readInt32(); 15625f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent uint32_t cmdSize = data.readInt32(); 157d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent char *cmd = NULL; 158d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent if (cmdSize) { 159d0b5910f78b45ce98511d31ec327ccaafe127f3fAndy Hung cmd = (char *)calloc(cmdSize, 1); 16010e6660cc5da65b027c90489ba7ac55d1504e012Andy Hung if (cmd == NULL) { 16110e6660cc5da65b027c90489ba7ac55d1504e012Andy Hung reply->writeInt32(NO_MEMORY); 16210e6660cc5da65b027c90489ba7ac55d1504e012Andy Hung return NO_ERROR; 16310e6660cc5da65b027c90489ba7ac55d1504e012Andy Hung } 164d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent data.read(cmd, cmdSize); 165d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent } 16625f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent uint32_t replySize = data.readInt32(); 16725f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent uint32_t replySz = replySize; 168d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent char *resp = NULL; 169d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent if (replySize) { 170d0b5910f78b45ce98511d31ec327ccaafe127f3fAndy Hung resp = (char *)calloc(replySize, 1); 17110e6660cc5da65b027c90489ba7ac55d1504e012Andy Hung if (resp == NULL) { 17210e6660cc5da65b027c90489ba7ac55d1504e012Andy Hung free(cmd); 17310e6660cc5da65b027c90489ba7ac55d1504e012Andy Hung reply->writeInt32(NO_MEMORY); 17410e6660cc5da65b027c90489ba7ac55d1504e012Andy Hung return NO_ERROR; 17510e6660cc5da65b027c90489ba7ac55d1504e012Andy Hung } 176d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent } 177d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent status_t status = command(cmdCode, cmdSize, cmd, &replySz, resp); 178d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent reply->writeInt32(status); 17910e6660cc5da65b027c90489ba7ac55d1504e012Andy Hung if (status == NO_ERROR) { 18010e6660cc5da65b027c90489ba7ac55d1504e012Andy Hung if (replySz < replySize) { 18110e6660cc5da65b027c90489ba7ac55d1504e012Andy Hung replySize = replySz; 18210e6660cc5da65b027c90489ba7ac55d1504e012Andy Hung } 18310e6660cc5da65b027c90489ba7ac55d1504e012Andy Hung reply->writeInt32(replySize); 18410e6660cc5da65b027c90489ba7ac55d1504e012Andy Hung if (replySize) { 18510e6660cc5da65b027c90489ba7ac55d1504e012Andy Hung reply->write(resp, replySize); 18610e6660cc5da65b027c90489ba7ac55d1504e012Andy Hung } 187d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent } 188d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent if (cmd) { 189d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent free(cmd); 190d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent } 191d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent if (resp) { 192d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent free(resp); 193d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent } 194d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent return NO_ERROR; 195d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent } break; 196d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent 197d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent case DISCONNECT: { 1983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("DISCONNECT"); 199d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent CHECK_INTERFACE(IEffect, data, reply); 200d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent disconnect(); 201d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent return NO_ERROR; 202d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent } break; 203d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent 204d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent case GET_CBLK: { 205e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten CHECK_INTERFACE(IEffect, data, reply); 20606b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(getCblk())); 207e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten return NO_ERROR; 208e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } break; 209d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent 210d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent default: 211d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent return BBinder::onTransact(code, data, reply, flags); 212d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent } 213d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent} 214d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent 215d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent// ---------------------------------------------------------------------------- 216d71a1be83ff31cdb6599c351f9832cefc8d447baEric Laurent 21740bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android 218