1 /* 2 ** 3 ** Copyright 2014, 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 #include <stdint.h> 19 #include <sys/types.h> 20 #include <binder/IMemory.h> 21 #include <binder/Parcel.h> 22 #include <binder/IPCThreadState.h> 23 #include <binder/IServiceManager.h> 24 #include <soundtrigger/ISoundTriggerClient.h> 25 26 namespace android { 27 28 enum { 29 ON_RECOGNITION_EVENT = IBinder::FIRST_CALL_TRANSACTION, 30 ON_SOUNDMODEL_EVENT, 31 ON_SERVICE_STATE_CHANGE 32 }; 33 34 class BpSoundTriggerClient: public BpInterface<ISoundTriggerClient> 35 { 36 37 public: 38 BpSoundTriggerClient(const sp<IBinder>& impl) 39 : BpInterface<ISoundTriggerClient>(impl) 40 { 41 } 42 43 virtual void onRecognitionEvent(const sp<IMemory>& eventMemory) 44 { 45 Parcel data, reply; 46 data.writeInterfaceToken(ISoundTriggerClient::getInterfaceDescriptor()); 47 data.writeStrongBinder(IInterface::asBinder(eventMemory)); 48 remote()->transact(ON_RECOGNITION_EVENT, 49 data, 50 &reply); 51 } 52 53 virtual void onSoundModelEvent(const sp<IMemory>& eventMemory) 54 { 55 Parcel data, reply; 56 data.writeInterfaceToken(ISoundTriggerClient::getInterfaceDescriptor()); 57 data.writeStrongBinder(IInterface::asBinder(eventMemory)); 58 remote()->transact(ON_SOUNDMODEL_EVENT, 59 data, 60 &reply); 61 } 62 virtual void onServiceStateChange(const sp<IMemory>& eventMemory) 63 { 64 Parcel data, reply; 65 data.writeInterfaceToken(ISoundTriggerClient::getInterfaceDescriptor()); 66 data.writeStrongBinder(IInterface::asBinder(eventMemory)); 67 remote()->transact(ON_SERVICE_STATE_CHANGE, 68 data, 69 &reply); 70 } 71 }; 72 73 IMPLEMENT_META_INTERFACE(SoundTriggerClient, 74 "android.hardware.ISoundTriggerClient"); 75 76 // ---------------------------------------------------------------------- 77 78 status_t BnSoundTriggerClient::onTransact( 79 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 80 { 81 switch(code) { 82 case ON_RECOGNITION_EVENT: { 83 CHECK_INTERFACE(ISoundTriggerClient, data, reply); 84 sp<IMemory> eventMemory = interface_cast<IMemory>( 85 data.readStrongBinder()); 86 onRecognitionEvent(eventMemory); 87 return NO_ERROR; 88 } break; 89 case ON_SOUNDMODEL_EVENT: { 90 CHECK_INTERFACE(ISoundTriggerClient, data, reply); 91 sp<IMemory> eventMemory = interface_cast<IMemory>( 92 data.readStrongBinder()); 93 onSoundModelEvent(eventMemory); 94 return NO_ERROR; 95 } break; 96 case ON_SERVICE_STATE_CHANGE: { 97 CHECK_INTERFACE(ISoundTriggerClient, data, reply); 98 sp<IMemory> eventMemory = interface_cast<IMemory>( 99 data.readStrongBinder()); 100 onServiceStateChange(eventMemory); 101 return NO_ERROR; 102 } break; 103 default: 104 return BBinder::onTransact(code, data, reply, flags); 105 } 106 } 107 108 // ---------------------------------------------------------------------------- 109 110 }; // namespace android 111