1/* 2** 3** Copyright 2010, The Android Open Source Project 4** 5** Licensed under the Apache License, Version 2.0 (the "License"); 6** you may not use this file except in compliance with the License. 7** You may obtain a copy of the License at 8** 9** http://www.apache.org/licenses/LICENSE-2.0 10** 11** Unless required by applicable law or agreed to in writing, software 12** distributed under the License is distributed on an "AS IS" BASIS, 13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14** See the License for the specific language governing permissions and 15** limitations under the License. 16*/ 17 18//#define LOG_NDEBUG 0 19#define LOG_TAG "IEffectClient" 20#include <utils/Log.h> 21#include <stdint.h> 22#include <sys/types.h> 23#include <media/IEffectClient.h> 24 25namespace android { 26 27enum { 28 CONTROL_STATUS_CHANGED = IBinder::FIRST_CALL_TRANSACTION, 29 ENABLE_STATUS_CHANGED, 30 COMMAND_EXECUTED 31}; 32 33class BpEffectClient: public BpInterface<IEffectClient> 34{ 35public: 36 BpEffectClient(const sp<IBinder>& impl) 37 : BpInterface<IEffectClient>(impl) 38 { 39 } 40 41 void controlStatusChanged(bool controlGranted) 42 { 43 LOGV("controlStatusChanged"); 44 Parcel data, reply; 45 data.writeInterfaceToken(IEffectClient::getInterfaceDescriptor()); 46 data.writeInt32((uint32_t)controlGranted); 47 remote()->transact(CONTROL_STATUS_CHANGED, data, &reply, IBinder::FLAG_ONEWAY); 48 } 49 50 void enableStatusChanged(bool enabled) 51 { 52 LOGV("enableStatusChanged"); 53 Parcel data, reply; 54 data.writeInterfaceToken(IEffectClient::getInterfaceDescriptor()); 55 data.writeInt32((uint32_t)enabled); 56 remote()->transact(ENABLE_STATUS_CHANGED, data, &reply, IBinder::FLAG_ONEWAY); 57 } 58 59 void commandExecuted(uint32_t cmdCode, 60 uint32_t cmdSize, 61 void *pCmdData, 62 uint32_t replySize, 63 void *pReplyData) 64 { 65 LOGV("commandExecuted"); 66 Parcel data, reply; 67 data.writeInterfaceToken(IEffectClient::getInterfaceDescriptor()); 68 data.writeInt32(cmdCode); 69 int size = cmdSize; 70 if (pCmdData == NULL) { 71 size = 0; 72 } 73 data.writeInt32(size); 74 if (size) { 75 data.write(pCmdData, size); 76 } 77 size = replySize; 78 if (pReplyData == NULL) { 79 size = 0; 80 } 81 data.writeInt32(size); 82 if (size) { 83 data.write(pReplyData, size); 84 } 85 remote()->transact(COMMAND_EXECUTED, data, &reply, IBinder::FLAG_ONEWAY); 86 } 87 88}; 89 90IMPLEMENT_META_INTERFACE(EffectClient, "android.media.IEffectClient"); 91 92// ---------------------------------------------------------------------- 93 94status_t BnEffectClient::onTransact( 95 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 96{ 97 switch(code) { 98 case CONTROL_STATUS_CHANGED: { 99 LOGV("CONTROL_STATUS_CHANGED"); 100 CHECK_INTERFACE(IEffectClient, data, reply); 101 bool hasControl = (bool)data.readInt32(); 102 controlStatusChanged(hasControl); 103 return NO_ERROR; 104 } break; 105 case ENABLE_STATUS_CHANGED: { 106 LOGV("ENABLE_STATUS_CHANGED"); 107 CHECK_INTERFACE(IEffectClient, data, reply); 108 bool enabled = (bool)data.readInt32(); 109 enableStatusChanged(enabled); 110 return NO_ERROR; 111 } break; 112 case COMMAND_EXECUTED: { 113 LOGV("COMMAND_EXECUTED"); 114 CHECK_INTERFACE(IEffectClient, data, reply); 115 uint32_t cmdCode = data.readInt32(); 116 uint32_t cmdSize = data.readInt32(); 117 char *cmd = NULL; 118 if (cmdSize) { 119 cmd = (char *)malloc(cmdSize); 120 data.read(cmd, cmdSize); 121 } 122 uint32_t replySize = data.readInt32(); 123 char *resp = NULL; 124 if (replySize) { 125 resp = (char *)malloc(replySize); 126 data.read(resp, replySize); 127 } 128 commandExecuted(cmdCode, cmdSize, cmd, replySize, resp); 129 if (cmd) { 130 free(cmd); 131 } 132 if (resp) { 133 free(resp); 134 } 135 return NO_ERROR; 136 } break; 137 default: 138 return BBinder::onTransact(code, data, reply, flags); 139 } 140} 141 142// ---------------------------------------------------------------------------- 143 144}; // namespace android 145 146