IAAudioService.cpp revision c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fb
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
175ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#include <aaudio/AAudioDefinitions.h>
18204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
19204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "binding/AudioEndpointParcelable.h"
205ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#include "binding/AAudioStreamRequest.h"
213316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk#include "binding/AAudioServiceDefinitions.h"
225ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#include "binding/AAudioStreamConfiguration.h"
235ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#include "binding/IAAudioService.h"
245ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#include "utility/AAudioUtilities.h"
25204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
26204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burknamespace android {
27204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
283316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burkusing aaudio::aaudio_handle_t;
293316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk
30204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk/**
315ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk * This is used by the AAudio Client to talk to the AAudio Service.
32204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk *
335ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk * The order of parameters in the Parcels must match with code in AAudioService.cpp.
34204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk */
355ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burkclass BpAAudioService : public BpInterface<IAAudioService>
36204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk{
37204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkpublic:
385ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    explicit BpAAudioService(const sp<IBinder>& impl)
395ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk        : BpInterface<IAAudioService>(impl)
40204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    {
41204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
42204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
43c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    virtual aaudio_handle_t openStream(const aaudio::AAudioStreamRequest &request,
44c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk                                     aaudio::AAudioStreamConfiguration &configurationOutput) override {
45204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        Parcel data, reply;
46204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // send command
475ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk        data.writeInterfaceToken(IAAudioService::getInterfaceDescriptor());
48c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk        ALOGE("BpAAudioService::client openStream request dump --------------------");
49c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk        request.dump();
50204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        request.writeToParcel(&data);
51204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        status_t err = remote()->transact(OPEN_STREAM, data, &reply);
52204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        if (err != NO_ERROR) {
535ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk            return AAudioConvert_androidToAAudioResult(err);
54204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        }
55204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // parse reply
565ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk        aaudio_handle_t stream;
57204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        reply.readInt32(&stream);
58c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk        err = configurationOutput.readFromParcel(&reply);
59c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk        if (err != NO_ERROR) {
60c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            ALOGE("BpAAudioService::client openStream readFromParcel failed %d", err);
61c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            closeStream(stream);
62c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            return AAudioConvert_androidToAAudioResult(err);
63c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk        }
64204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        return stream;
65204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
66204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
675ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    virtual aaudio_result_t closeStream(aaudio_handle_t streamHandle) override {
68204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        Parcel data, reply;
69204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // send command
705ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk        data.writeInterfaceToken(IAAudioService::getInterfaceDescriptor());
71204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInt32(streamHandle);
72204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        status_t err = remote()->transact(CLOSE_STREAM, data, &reply);
73204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        if (err != NO_ERROR) {
745ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk            return AAudioConvert_androidToAAudioResult(err);
75204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        }
76204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // parse reply
775ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk        aaudio_result_t res;
78204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        reply.readInt32(&res);
79204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        return res;
80204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
81204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
825ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    virtual aaudio_result_t getStreamDescription(aaudio_handle_t streamHandle,
835ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk                                               aaudio::AudioEndpointParcelable &parcelable)   {
84204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        Parcel data, reply;
85204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // send command
865ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk        data.writeInterfaceToken(IAAudioService::getInterfaceDescriptor());
87204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInt32(streamHandle);
88204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        status_t err = remote()->transact(GET_STREAM_DESCRIPTION, data, &reply);
89204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        if (err != NO_ERROR) {
90c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            ALOGE("BpAAudioService::client transact(GET_STREAM_DESCRIPTION) returns %d", err);
915ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk            return AAudioConvert_androidToAAudioResult(err);
92204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        }
93204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // parse reply
94c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk        aaudio_result_t result;
95c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk        err = reply.readInt32(&result);
96c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk        if (err != NO_ERROR) {
97c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            ALOGE("BpAAudioService::client transact(GET_STREAM_DESCRIPTION) readInt %d", err);
98c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            return AAudioConvert_androidToAAudioResult(err);
99c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk        } else if (result != AAUDIO_OK) {
100c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            ALOGE("BpAAudioService::client GET_STREAM_DESCRIPTION passed result %d", result);
101c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            return result;
102c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk        }
103c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk        err = parcelable.readFromParcel(&reply);;
104c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk        if (err != NO_ERROR) {
105c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            ALOGE("BpAAudioService::client transact(GET_STREAM_DESCRIPTION) read endpoint %d", err);
106c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            return AAudioConvert_androidToAAudioResult(err);
107c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk        }
108c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk        //parcelable.dump();
109c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk        result = parcelable.validate();
1105ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk        if (result != AAUDIO_OK) {
111c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            ALOGE("BpAAudioService::client GET_STREAM_DESCRIPTION validation fails %d", result);
112204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return result;
113204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        }
114204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        return result;
115204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
116204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
117204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    // TODO should we wait for a reply?
1185ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    virtual aaudio_result_t startStream(aaudio_handle_t streamHandle) override {
119204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        Parcel data, reply;
120204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // send command
1215ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk        data.writeInterfaceToken(IAAudioService::getInterfaceDescriptor());
122204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInt32(streamHandle);
123204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        status_t err = remote()->transact(START_STREAM, data, &reply);
124204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        if (err != NO_ERROR) {
1255ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk            return AAudioConvert_androidToAAudioResult(err);
126204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        }
127204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // parse reply
1285ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk        aaudio_result_t res;
129204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        reply.readInt32(&res);
130204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        return res;
131204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
132204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
1335ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    virtual aaudio_result_t pauseStream(aaudio_handle_t streamHandle) override {
134204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        Parcel data, reply;
135204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // send command
1365ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk        data.writeInterfaceToken(IAAudioService::getInterfaceDescriptor());
137204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInt32(streamHandle);
138204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        status_t err = remote()->transact(PAUSE_STREAM, data, &reply);
139204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        if (err != NO_ERROR) {
1405ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk            return AAudioConvert_androidToAAudioResult(err);
141204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        }
142204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // parse reply
1435ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk        aaudio_result_t res;
144204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        reply.readInt32(&res);
145204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        return res;
146204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
147204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
1485ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    virtual aaudio_result_t flushStream(aaudio_handle_t streamHandle) override {
149204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        Parcel data, reply;
150204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // send command
1515ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk        data.writeInterfaceToken(IAAudioService::getInterfaceDescriptor());
152204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInt32(streamHandle);
153204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        status_t err = remote()->transact(FLUSH_STREAM, data, &reply);
154204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        if (err != NO_ERROR) {
1555ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk            return AAudioConvert_androidToAAudioResult(err);
156204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        }
157204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // parse reply
1585ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk        aaudio_result_t res;
159204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        reply.readInt32(&res);
160204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        return res;
161204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
162204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
163c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    virtual aaudio_result_t registerAudioThread(aaudio_handle_t streamHandle,
164c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk                                              pid_t clientProcessId,
165c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk                                              pid_t clientThreadId,
1663316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk                                              int64_t periodNanoseconds)
167204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    override {
168204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        Parcel data, reply;
169204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // send command
1705ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk        data.writeInterfaceToken(IAAudioService::getInterfaceDescriptor());
171204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInt32(streamHandle);
172c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk        data.writeInt32((int32_t) clientProcessId);
173204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInt32((int32_t) clientThreadId);
174204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInt64(periodNanoseconds);
175204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        status_t err = remote()->transact(REGISTER_AUDIO_THREAD, data, &reply);
176204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        if (err != NO_ERROR) {
1775ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk            return AAudioConvert_androidToAAudioResult(err);
178204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        }
179204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // parse reply
1805ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk        aaudio_result_t res;
181204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        reply.readInt32(&res);
182204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        return res;
183204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
184204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
185c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    virtual aaudio_result_t unregisterAudioThread(aaudio_handle_t streamHandle,
186c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk                                                  pid_t clientProcessId,
187c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk                                                  pid_t clientThreadId)
188204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    override {
189204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        Parcel data, reply;
190204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // send command
1915ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk        data.writeInterfaceToken(IAAudioService::getInterfaceDescriptor());
192204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInt32(streamHandle);
193c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk        data.writeInt32((int32_t) clientProcessId);
194204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        data.writeInt32((int32_t) clientThreadId);
195204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        status_t err = remote()->transact(UNREGISTER_AUDIO_THREAD, data, &reply);
196204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        if (err != NO_ERROR) {
1975ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk            return AAudioConvert_androidToAAudioResult(err);
198204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        }
199204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        // parse reply
2005ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk        aaudio_result_t res;
201204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        reply.readInt32(&res);
202204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        return res;
203204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
204204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
205204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk};
206204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
207204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk// Implement an interface to the service.
208c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk// This is here so that you don't have to link with libaaudio static library.
2095ed503c7a66c90f93759c90237a9b432dbd93f9fPhil BurkIMPLEMENT_META_INTERFACE(AAudioService, "IAAudioService");
210204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
2115ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk// The order of parameters in the Parcels must match with code in BpAAudioService
212204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
2135ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burkstatus_t BnAAudioService::onTransact(uint32_t code, const Parcel& data,
214204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk                                        Parcel* reply, uint32_t flags) {
2153316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk    aaudio_handle_t stream;
2165ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    aaudio::AAudioStreamRequest request;
2175ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    aaudio::AAudioStreamConfiguration configuration;
218204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    pid_t pid;
219c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    pid_t tid;
2203316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk    int64_t nanoseconds;
2215ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    aaudio_result_t result;
2225ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    ALOGV("BnAAudioService::onTransact(%i) %i", code, flags);
223204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    data.checkInterface(this);
224204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
225204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    switch(code) {
226204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        case OPEN_STREAM: {
227204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            request.readFromParcel(&data);
228c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk
229c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            ALOGD("BnAAudioService::client openStream request dump --------------------");
230c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            request.dump();
231c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk
232204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            stream = openStream(request, configuration);
233c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            ALOGV("BnAAudioService::onTransact OPEN_STREAM server handle = 0x%08X", stream);
234204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            reply->writeInt32(stream);
235204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            configuration.writeToParcel(reply);
236204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return NO_ERROR;
237204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        } break;
238204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
239204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        case CLOSE_STREAM: {
240204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            data.readInt32(&stream);
241c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            ALOGV("BnAAudioService::onTransact CLOSE_STREAM 0x%08X", stream);
242204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            result = closeStream(stream);
243204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            reply->writeInt32(result);
244204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return NO_ERROR;
245204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        } break;
246204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
247204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        case GET_STREAM_DESCRIPTION: {
248204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            data.readInt32(&stream);
249c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            ALOGI("BnAAudioService::onTransact GET_STREAM_DESCRIPTION 0x%08X", stream);
2505ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk            aaudio::AudioEndpointParcelable parcelable;
251204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            result = getStreamDescription(stream, parcelable);
252c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            ALOGI("BnAAudioService::onTransact getStreamDescription() returns %d", result);
2535ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk            if (result != AAUDIO_OK) {
2545ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk                return AAudioConvert_aaudioToAndroidStatus(result);
255204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            }
256204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            result = parcelable.validate();
2575ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk            if (result != AAUDIO_OK) {
258c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk                ALOGE("BnAAudioService::onTransact getStreamDescription() returns %d", result);
259c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk                parcelable.dump();
2605ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk                return AAudioConvert_aaudioToAndroidStatus(result);
261204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            }
262204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            reply->writeInt32(result);
263c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            parcelable.writeToParcel(reply);
264204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return NO_ERROR;
265204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        } break;
266204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
267204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        case START_STREAM: {
268204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            data.readInt32(&stream);
269204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            result = startStream(stream);
270c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            ALOGV("BnAAudioService::onTransact START_STREAM 0x%08X, result = %d",
271204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk                    stream, result);
272204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            reply->writeInt32(result);
273204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return NO_ERROR;
274204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        } break;
275204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
276204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        case PAUSE_STREAM: {
277204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            data.readInt32(&stream);
278204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            result = pauseStream(stream);
279c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            ALOGV("BnAAudioService::onTransact PAUSE_STREAM 0x%08X, result = %d",
280204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk                    stream, result);
281204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            reply->writeInt32(result);
282204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return NO_ERROR;
283204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        } break;
284204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
285204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        case FLUSH_STREAM: {
286204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            data.readInt32(&stream);
287204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            result = flushStream(stream);
288c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            ALOGV("BnAAudioService::onTransact FLUSH_STREAM 0x%08X, result = %d",
289204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk                    stream, result);
290204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            reply->writeInt32(result);
291204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return NO_ERROR;
292204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        } break;
293204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
294204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        case REGISTER_AUDIO_THREAD: {
295204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            data.readInt32(&stream);
296204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            data.readInt32(&pid);
297c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            data.readInt32(&tid);
298204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            data.readInt64(&nanoseconds);
299c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            result = registerAudioThread(stream, pid, tid, nanoseconds);
300c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            ALOGV("BnAAudioService::onTransact REGISTER_AUDIO_THREAD 0x%08X, result = %d",
301204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk                    stream, result);
302204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            reply->writeInt32(result);
303204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return NO_ERROR;
304204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        } break;
305204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
306204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        case UNREGISTER_AUDIO_THREAD: {
307204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            data.readInt32(&stream);
308204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            data.readInt32(&pid);
309c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            data.readInt32(&tid);
310c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            result = unregisterAudioThread(stream, pid, tid);
311c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk            ALOGV("BnAAudioService::onTransact UNREGISTER_AUDIO_THREAD 0x%08X, result = %d",
312204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk                    stream, result);
313204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            reply->writeInt32(result);
314204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return NO_ERROR;
315204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        } break;
316204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
317204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        default:
3185ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk            // ALOGW("BnAAudioService::onTransact not handled %u", code);
319204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk            return BBinder::onTransact(code, data, reply, flags);
320204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
321204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk}
322204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
323204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk} /* namespace android */
324