IAAudioService.cpp revision 204a163c86f357a878873fe7d4c4164f3d55c9b6
1204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk/*
2204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * Copyright (C) 2016 The Android Open Source Project
3204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk *
4204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * Licensed under the Apache License, Version 2.0 (the "License");
5204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * you may not use this file except in compliance with the License.
6204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * You may obtain a copy of the License at
7204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk *
8204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk *      http://www.apache.org/licenses/LICENSE-2.0
9204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk *
10204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * Unless required by applicable law or agreed to in writing, software
11204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * distributed under the License is distributed on an "AS IS" BASIS,
12204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * See the License for the specific language governing permissions and
14204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * limitations under the License.
15204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk */
16204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
17204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include <oboe/OboeDefinitions.h>
18204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
19204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "binding/AudioEndpointParcelable.h"
20204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "binding/OboeStreamRequest.h"
21204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "binding/OboeStreamConfiguration.h"
22204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "binding/IOboeAudioService.h"
23204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
24204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burknamespace android {
25204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
26204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk/**
27204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * This is used by the Oboe Client to talk to the Oboe Service.
28204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk *
29204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * The order of parameters in the Parcels must match with code in OboeAudioService.cpp.
30204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk */
31204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkclass BpOboeAudioService : public BpInterface<IOboeAudioService>
32204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk{
33204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkpublic:
34204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    explicit BpOboeAudioService(const sp<IBinder>& impl)
35204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        : BpInterface<IOboeAudioService>(impl)
36204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    {
37204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
38204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
39204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    virtual oboe_handle_t openStream(oboe::OboeStreamRequest &request,
40204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk                                     oboe::OboeStreamConfiguration &configuration) override {
41204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        Parcel data, reply;
42204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // send command
43204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInterfaceToken(IOboeAudioService::getInterfaceDescriptor());
44204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        request.writeToParcel(&data);
45204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        status_t err = remote()->transact(OPEN_STREAM, data, &reply);
46204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        if (err != NO_ERROR) {
47204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return OBOE_ERROR_INTERNAL; // TODO consider another error
48204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        }
49204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // parse reply
50204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        oboe_handle_t stream;
51204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        reply.readInt32(&stream);
52204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        configuration.readFromParcel(&reply);
53204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        return stream;
54204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
55204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
56204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    virtual oboe_result_t closeStream(int32_t streamHandle) override {
57204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        Parcel data, reply;
58204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // send command
59204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInterfaceToken(IOboeAudioService::getInterfaceDescriptor());
60204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInt32(streamHandle);
61204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        status_t err = remote()->transact(CLOSE_STREAM, data, &reply);
62204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        if (err != NO_ERROR) {
63204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return OBOE_ERROR_INTERNAL; // TODO consider another error
64204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        }
65204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // parse reply
66204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        oboe_result_t res;
67204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        reply.readInt32(&res);
68204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        return res;
69204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
70204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
71204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    virtual oboe_result_t getStreamDescription(oboe_handle_t streamHandle,
72204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk                                               AudioEndpointParcelable &parcelable)   {
73204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        Parcel data, reply;
74204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // send command
75204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInterfaceToken(IOboeAudioService::getInterfaceDescriptor());
76204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInt32(streamHandle);
77204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        status_t err = remote()->transact(GET_STREAM_DESCRIPTION, data, &reply);
78204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        if (err != NO_ERROR) {
79204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return OBOE_ERROR_INTERNAL; // TODO consider another error
80204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        }
81204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // parse reply
82204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        parcelable.readFromParcel(&reply);
83204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        parcelable.dump();
84204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        oboe_result_t result = parcelable.validate();
85204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        if (result != OBOE_OK) {
86204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return result;
87204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        }
88204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        reply.readInt32(&result);
89204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        return result;
90204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
91204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
92204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    // TODO should we wait for a reply?
93204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    virtual oboe_result_t startStream(oboe_handle_t streamHandle) override {
94204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        Parcel data, reply;
95204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // send command
96204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInterfaceToken(IOboeAudioService::getInterfaceDescriptor());
97204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInt32(streamHandle);
98204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        status_t err = remote()->transact(START_STREAM, data, &reply);
99204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        if (err != NO_ERROR) {
100204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return OBOE_ERROR_INTERNAL; // TODO consider another error
101204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        }
102204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // parse reply
103204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        oboe_result_t res;
104204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        reply.readInt32(&res);
105204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        return res;
106204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
107204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
108204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    virtual oboe_result_t pauseStream(oboe_handle_t streamHandle) override {
109204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        Parcel data, reply;
110204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // send command
111204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInterfaceToken(IOboeAudioService::getInterfaceDescriptor());
112204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInt32(streamHandle);
113204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        status_t err = remote()->transact(PAUSE_STREAM, data, &reply);
114204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        if (err != NO_ERROR) {
115204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return OBOE_ERROR_INTERNAL; // TODO consider another error
116204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        }
117204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // parse reply
118204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        oboe_result_t res;
119204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        reply.readInt32(&res);
120204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        return res;
121204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
122204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
123204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    virtual oboe_result_t flushStream(oboe_handle_t streamHandle) override {
124204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        Parcel data, reply;
125204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // send command
126204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInterfaceToken(IOboeAudioService::getInterfaceDescriptor());
127204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInt32(streamHandle);
128204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        status_t err = remote()->transact(FLUSH_STREAM, data, &reply);
129204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        if (err != NO_ERROR) {
130204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return OBOE_ERROR_INTERNAL; // TODO consider another error
131204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        }
132204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // parse reply
133204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        oboe_result_t res;
134204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        reply.readInt32(&res);
135204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        return res;
136204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
137204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
138204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    virtual void tickle() override { // TODO remove after service thread implemented
139204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        Parcel data;
140204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // send command
141204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInterfaceToken(IOboeAudioService::getInterfaceDescriptor());
142204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        remote()->transact(TICKLE, data, nullptr);
143204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
144204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
145204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    virtual oboe_result_t registerAudioThread(oboe_handle_t streamHandle, pid_t clientThreadId,
146204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk                                              oboe_nanoseconds_t periodNanoseconds)
147204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    override {
148204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        Parcel data, reply;
149204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // send command
150204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInterfaceToken(IOboeAudioService::getInterfaceDescriptor());
151204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInt32(streamHandle);
152204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInt32((int32_t) clientThreadId);
153204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInt64(periodNanoseconds);
154204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        status_t err = remote()->transact(REGISTER_AUDIO_THREAD, data, &reply);
155204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        if (err != NO_ERROR) {
156204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return OBOE_ERROR_INTERNAL; // TODO consider another error
157204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        }
158204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // parse reply
159204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        oboe_result_t res;
160204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        reply.readInt32(&res);
161204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        return res;
162204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
163204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
164204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    virtual oboe_result_t unregisterAudioThread(oboe_handle_t streamHandle, pid_t clientThreadId)
165204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    override {
166204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        Parcel data, reply;
167204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // send command
168204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInterfaceToken(IOboeAudioService::getInterfaceDescriptor());
169204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInt32(streamHandle);
170204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInt32((int32_t) clientThreadId);
171204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        status_t err = remote()->transact(UNREGISTER_AUDIO_THREAD, data, &reply);
172204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        if (err != NO_ERROR) {
173204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return OBOE_ERROR_INTERNAL; // TODO consider another error
174204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        }
175204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // parse reply
176204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        oboe_result_t res;
177204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        reply.readInt32(&res);
178204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        return res;
179204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
180204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
181204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk};
182204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
183204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk// Implement an interface to the service.
184204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk// This is here so that you don't have to link with liboboe static library.
185204a163c86f357a878873fe7d4c4164f3d55c9b6Phil BurkIMPLEMENT_META_INTERFACE(OboeAudioService, "IOboeAudioService");
186204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
187204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk// The order of parameters in the Parcels must match with code in BpOboeAudioService
188204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
189204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkstatus_t BnOboeAudioService::onTransact(uint32_t code, const Parcel& data,
190204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk                                        Parcel* reply, uint32_t flags) {
191204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    OboeStream stream;
192204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    OboeStreamRequest request;
193204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    OboeStreamConfiguration configuration;
194204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    pid_t pid;
195204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    oboe_nanoseconds_t nanoseconds;
196204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    oboe_result_t result;
197204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    ALOGV("BnOboeAudioService::onTransact(%i) %i", code, flags);
198204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    data.checkInterface(this);
199204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
200204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    switch(code) {
201204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        case OPEN_STREAM: {
202204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            request.readFromParcel(&data);
203204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            stream = openStream(request, configuration);
204204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            ALOGD("BnOboeAudioService::onTransact OPEN_STREAM 0x%08X", stream);
205204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            reply->writeInt32(stream);
206204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            configuration.writeToParcel(reply);
207204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return NO_ERROR;
208204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        } break;
209204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
210204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        case CLOSE_STREAM: {
211204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            data.readInt32(&stream);
212204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            ALOGD("BnOboeAudioService::onTransact CLOSE_STREAM 0x%08X", stream);
213204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            result = closeStream(stream);
214204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            reply->writeInt32(result);
215204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return NO_ERROR;
216204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        } break;
217204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
218204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        case GET_STREAM_DESCRIPTION: {
219204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            data.readInt32(&stream);
220204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            ALOGD("BnOboeAudioService::onTransact GET_STREAM_DESCRIPTION 0x%08X", stream);
221204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            oboe::AudioEndpointParcelable parcelable;
222204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            result = getStreamDescription(stream, parcelable);
223204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            if (result != OBOE_OK) {
224204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk                return -1; // FIXME
225204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            }
226204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            parcelable.dump();
227204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            result = parcelable.validate();
228204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            if (result != OBOE_OK) {
229204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk                return -1; // FIXME
230204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            }
231204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            parcelable.writeToParcel(reply);
232204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            reply->writeInt32(result);
233204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return NO_ERROR;
234204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        } break;
235204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
236204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        case START_STREAM: {
237204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            data.readInt32(&stream);
238204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            result = startStream(stream);
239204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            ALOGD("BnOboeAudioService::onTransact START_STREAM 0x%08X, result = %d",
240204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk                    stream, result);
241204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            reply->writeInt32(result);
242204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return NO_ERROR;
243204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        } break;
244204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
245204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        case PAUSE_STREAM: {
246204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            data.readInt32(&stream);
247204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            result = pauseStream(stream);
248204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            ALOGD("BnOboeAudioService::onTransact PAUSE_STREAM 0x%08X, result = %d",
249204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk                    stream, result);
250204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            reply->writeInt32(result);
251204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return NO_ERROR;
252204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        } break;
253204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
254204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        case FLUSH_STREAM: {
255204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            data.readInt32(&stream);
256204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            result = flushStream(stream);
257204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            ALOGD("BnOboeAudioService::onTransact FLUSH_STREAM 0x%08X, result = %d",
258204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk                    stream, result);
259204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            reply->writeInt32(result);
260204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return NO_ERROR;
261204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        } break;
262204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
263204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        case REGISTER_AUDIO_THREAD: {
264204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            data.readInt32(&stream);
265204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            data.readInt32(&pid);
266204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            data.readInt64(&nanoseconds);
267204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            result = registerAudioThread(stream, pid, nanoseconds);
268204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            ALOGD("BnOboeAudioService::onTransact REGISTER_AUDIO_THREAD 0x%08X, result = %d",
269204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk                    stream, result);
270204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            reply->writeInt32(result);
271204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return NO_ERROR;
272204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        } break;
273204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
274204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        case UNREGISTER_AUDIO_THREAD: {
275204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            data.readInt32(&stream);
276204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            data.readInt32(&pid);
277204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            result = unregisterAudioThread(stream, pid);
278204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            ALOGD("BnOboeAudioService::onTransact UNREGISTER_AUDIO_THREAD 0x%08X, result = %d",
279204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk                    stream, result);
280204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            reply->writeInt32(result);
281204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return NO_ERROR;
282204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        } break;
283204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
284204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        case TICKLE: {
285204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            ALOGV("BnOboeAudioService::onTransact TICKLE");
286204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            tickle();
287204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return NO_ERROR;
288204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        } break;
289204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
290204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        default:
291204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            // ALOGW("BnOboeAudioService::onTransact not handled %u", code);
292204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return BBinder::onTransact(code, data, reply, flags);
293204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
294204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk}
295204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
296204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk} /* namespace android */
297