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 
25 namespace android {
26 
27 enum {
28     CONTROL_STATUS_CHANGED = IBinder::FIRST_CALL_TRANSACTION,
29     ENABLE_STATUS_CHANGED,
30     COMMAND_EXECUTED
31 };
32 
33 class BpEffectClient: public BpInterface<IEffectClient>
34 {
35 public:
BpEffectClient(const sp<IBinder> & impl)36     BpEffectClient(const sp<IBinder>& impl)
37         : BpInterface<IEffectClient>(impl)
38     {
39     }
40 
controlStatusChanged(bool controlGranted)41     void controlStatusChanged(bool controlGranted)
42     {
43         ALOGV("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 
enableStatusChanged(bool enabled)50     void enableStatusChanged(bool enabled)
51     {
52         ALOGV("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 
commandExecuted(uint32_t cmdCode,uint32_t cmdSize,void * pCmdData,uint32_t replySize,void * pReplyData)59     void commandExecuted(uint32_t cmdCode,
60                          uint32_t cmdSize,
61                          void *pCmdData,
62                          uint32_t replySize,
63                          void *pReplyData)
64     {
65         ALOGV("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 
90 IMPLEMENT_META_INTERFACE(EffectClient, "android.media.IEffectClient");
91 
92 // ----------------------------------------------------------------------
93 
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)94 status_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             ALOGV("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             ALOGV("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             ALOGV("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