• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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