1b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent/*
2b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent**
3b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent** Copyright 2014, The Android Open Source Project
4b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent**
5b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent** Licensed under the Apache License, Version 2.0 (the "License");
6b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent** you may not use this file except in compliance with the License.
7b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent** You may obtain a copy of the License at
8b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent**
9b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent**     http://www.apache.org/licenses/LICENSE-2.0
10b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent**
11b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent** Unless required by applicable law or agreed to in writing, software
12b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent** distributed under the License is distributed on an "AS IS" BASIS,
13b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent** See the License for the specific language governing permissions and
15b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent** limitations under the License.
16b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent*/
17b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
18b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#include <stdint.h>
19b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#include <sys/types.h>
20b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#include <binder/IMemory.h>
21b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#include <binder/Parcel.h>
22b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#include <binder/IPCThreadState.h>
23b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#include <binder/IServiceManager.h>
24b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#include <soundtrigger/ISoundTriggerClient.h>
25b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
26b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurentnamespace android {
27b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
28b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurentenum {
29b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    ON_RECOGNITION_EVENT = IBinder::FIRST_CALL_TRANSACTION,
30df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    ON_SOUNDMODEL_EVENT,
31df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    ON_SERVICE_STATE_CHANGE
32b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent};
33b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
34b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurentclass BpSoundTriggerClient: public BpInterface<ISoundTriggerClient>
35b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent{
36b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
37b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurentpublic:
38b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    BpSoundTriggerClient(const sp<IBinder>& impl)
39b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        : BpInterface<ISoundTriggerClient>(impl)
40b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    {
41b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    }
42b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
43b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    virtual void onRecognitionEvent(const sp<IMemory>& eventMemory)
44b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    {
45b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        Parcel data, reply;
46b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        data.writeInterfaceToken(ISoundTriggerClient::getInterfaceDescriptor());
47b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        data.writeStrongBinder(eventMemory->asBinder());
48b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        remote()->transact(ON_RECOGNITION_EVENT,
49b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                           data,
50b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                           &reply);
51b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    }
52df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
53df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    virtual void onSoundModelEvent(const sp<IMemory>& eventMemory)
54df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    {
55df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        Parcel data, reply;
56df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        data.writeInterfaceToken(ISoundTriggerClient::getInterfaceDescriptor());
57df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        data.writeStrongBinder(eventMemory->asBinder());
58df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        remote()->transact(ON_SOUNDMODEL_EVENT,
59df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                           data,
60df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                           &reply);
61df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    }
62df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    virtual void onServiceStateChange(const sp<IMemory>& eventMemory)
63df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    {
64df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        Parcel data, reply;
65df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        data.writeInterfaceToken(ISoundTriggerClient::getInterfaceDescriptor());
66df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        data.writeStrongBinder(eventMemory->asBinder());
67df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        remote()->transact(ON_SERVICE_STATE_CHANGE,
68df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                           data,
69df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                           &reply);
70df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    }
71b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent};
72b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
73b7a11d83f749ad0200778c4815e907d011d4b5d3Eric LaurentIMPLEMENT_META_INTERFACE(SoundTriggerClient,
74b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                         "android.hardware.ISoundTriggerClient");
75b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
76b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent// ----------------------------------------------------------------------
77b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
78b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurentstatus_t BnSoundTriggerClient::onTransact(
79b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
80b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent{
81b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    switch(code) {
82b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        case ON_RECOGNITION_EVENT: {
83b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent            CHECK_INTERFACE(ISoundTriggerClient, data, reply);
84b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent            sp<IMemory> eventMemory = interface_cast<IMemory>(
85b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                data.readStrongBinder());
86b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent            onRecognitionEvent(eventMemory);
87b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent            return NO_ERROR;
88b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        } break;
89df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        case ON_SOUNDMODEL_EVENT: {
90df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            CHECK_INTERFACE(ISoundTriggerClient, data, reply);
91df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            sp<IMemory> eventMemory = interface_cast<IMemory>(
92df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                data.readStrongBinder());
93df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            onSoundModelEvent(eventMemory);
94df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return NO_ERROR;
95df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        } break;
96df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        case ON_SERVICE_STATE_CHANGE: {
97df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            CHECK_INTERFACE(ISoundTriggerClient, data, reply);
98df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            sp<IMemory> eventMemory = interface_cast<IMemory>(
99df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                data.readStrongBinder());
100df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            onServiceStateChange(eventMemory);
101df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            return NO_ERROR;
102df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        } break;
103b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        default:
104b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent            return BBinder::onTransact(code, data, reply, flags);
105b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    }
106b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent}
107b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
108b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent// ----------------------------------------------------------------------------
109b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
110b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent}; // namespace android
111