blob: e7659ae2b0997cef5d3a16823744e9884b17781f [file] [log] [blame]
Eric Laurentd71a1be2010-05-21 07:47:50 -07001/*
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(int cmdCode, int cmdSize, void *pCmdData, int replySize, void *pReplyData)
60 {
61 LOGV("commandExecuted");
62 Parcel data, reply;
63 data.writeInterfaceToken(IEffectClient::getInterfaceDescriptor());
64 data.writeInt32(cmdCode);
65 int size = cmdSize;
66 if (pCmdData == NULL) {
67 size = 0;
68 }
69 data.writeInt32(size);
70 if (size) {
71 data.write(pCmdData, size);
72 }
73 size = replySize;
74 if (pReplyData == NULL) {
75 size = 0;
76 }
77 data.writeInt32(size);
78 if (size) {
79 data.write(pReplyData, size);
80 }
81 remote()->transact(COMMAND_EXECUTED, data, &reply, IBinder::FLAG_ONEWAY);
82 }
83
84};
85
86IMPLEMENT_META_INTERFACE(EffectClient, "android.media.IEffectClient");
87
88// ----------------------------------------------------------------------
89
90status_t BnEffectClient::onTransact(
91 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
92{
93 switch(code) {
94 case CONTROL_STATUS_CHANGED: {
95 LOGV("CONTROL_STATUS_CHANGED");
96 CHECK_INTERFACE(IEffectClient, data, reply);
97 bool hasControl = (bool)data.readInt32();
98 controlStatusChanged(hasControl);
99 return NO_ERROR;
100 } break;
101 case ENABLE_STATUS_CHANGED: {
102 LOGV("ENABLE_STATUS_CHANGED");
103 CHECK_INTERFACE(IEffectClient, data, reply);
104 bool enabled = (bool)data.readInt32();
105 enableStatusChanged(enabled);
106 return NO_ERROR;
107 } break;
108 case COMMAND_EXECUTED: {
109 LOGV("COMMAND_EXECUTED");
110 CHECK_INTERFACE(IEffectClient, data, reply);
111 int cmdCode = data.readInt32();
112 int cmdSize = data.readInt32();
113 char *cmd = NULL;
114 if (cmdSize) {
115 cmd = (char *)malloc(cmdSize);
116 data.read(cmd, cmdSize);
117 }
118 int replySize = data.readInt32();
119 char *resp = NULL;
120 if (replySize) {
121 resp = (char *)malloc(replySize);
122 data.read(resp, replySize);
123 }
124 commandExecuted(cmdCode, cmdSize, cmd, replySize, resp);
125 if (cmd) {
126 free(cmd);
127 }
128 if (resp) {
129 free(resp);
130 }
131 return NO_ERROR;
132 } break;
133 default:
134 return BBinder::onTransact(code, data, reply, flags);
135 }
136}
137
138// ----------------------------------------------------------------------------
139
140}; // namespace android
141