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