1204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk/* 2204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * Copyright 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 17c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#define LOG_TAG "AAudio" 18c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk//#define LOG_NDEBUG 0 19c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include <utils/Log.h> 20c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 21204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include <stdint.h> 22204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 23204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include <binder/Parcel.h> 24204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include <binder/Parcelable.h> 25c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include <utility/AAudioUtilities.h> 26204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 275ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#include "binding/AAudioServiceDefinitions.h" 28204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "binding/RingBufferParcelable.h" 29204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "binding/AudioEndpointParcelable.h" 30204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 31204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkusing android::NO_ERROR; 32204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkusing android::status_t; 33204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkusing android::Parcel; 34204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkusing android::Parcelable; 35204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 365ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burkusing namespace aaudio; 37204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 38204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk/** 39204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * Container for information about the message queues plus 405ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk * general stream information needed by AAudio clients. 41204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * It contains no addresses, just sizes, offsets and file descriptors for 42204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * shared memory that can be passed through Binder. 43204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk */ 44204a163c86f357a878873fe7d4c4164f3d55c9b6Phil BurkAudioEndpointParcelable::AudioEndpointParcelable() {} 45204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 46204a163c86f357a878873fe7d4c4164f3d55c9b6Phil BurkAudioEndpointParcelable::~AudioEndpointParcelable() {} 47204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 48204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk/** 49204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * Add the file descriptor to the table. 50204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * @return index in table or negative error 51204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk */ 52204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkint32_t AudioEndpointParcelable::addFileDescriptor(int fd, int32_t sizeInBytes) { 53204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk if (mNumSharedMemories >= MAX_SHARED_MEMORIES) { 545ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk return AAUDIO_ERROR_OUT_OF_RANGE; 55204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 56204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk int32_t index = mNumSharedMemories++; 57204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mSharedMemories[index].setup(fd, sizeInBytes); 58204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return index; 59204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk} 60204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 61204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk/** 62204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * The read and write must be symmetric. 63204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk */ 64204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkstatus_t AudioEndpointParcelable::writeToParcel(Parcel* parcel) const { 65204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk parcel->writeInt32(mNumSharedMemories); 66204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk for (int i = 0; i < mNumSharedMemories; i++) { 67204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mSharedMemories[i].writeToParcel(parcel); 68204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 69204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mUpMessageQueueParcelable.writeToParcel(parcel); 70204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mDownMessageQueueParcelable.writeToParcel(parcel); 71204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mUpDataQueueParcelable.writeToParcel(parcel); 72204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mDownDataQueueParcelable.writeToParcel(parcel); 73204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return NO_ERROR; // TODO check for errors above 74204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk} 75204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 76204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkstatus_t AudioEndpointParcelable::readFromParcel(const Parcel* parcel) { 77204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk parcel->readInt32(&mNumSharedMemories); 78204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk for (int i = 0; i < mNumSharedMemories; i++) { 79204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mSharedMemories[i].readFromParcel(parcel); 80204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 81204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mUpMessageQueueParcelable.readFromParcel(parcel); 82204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mDownMessageQueueParcelable.readFromParcel(parcel); 83204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mUpDataQueueParcelable.readFromParcel(parcel); 84204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mDownDataQueueParcelable.readFromParcel(parcel); 85204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return NO_ERROR; // TODO check for errors above 86204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk} 87204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 885ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burkaaudio_result_t AudioEndpointParcelable::resolve(EndpointDescriptor *descriptor) { 89c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t result = mUpMessageQueueParcelable.resolve(mSharedMemories, 90c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk &descriptor->upMessageQueueDescriptor); 91c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk if (result != AAUDIO_OK) return result; 92c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk result = mDownMessageQueueParcelable.resolve(mSharedMemories, 93204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk &descriptor->downMessageQueueDescriptor); 94c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk if (result != AAUDIO_OK) return result; 95c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 96c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk result = mDownDataQueueParcelable.resolve(mSharedMemories, 9787c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk &descriptor->dataQueueDescriptor); 98c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk return result; 99c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk} 100c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 101c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkaaudio_result_t AudioEndpointParcelable::close() { 102c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int err = 0; 103c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk for (int i = 0; i < mNumSharedMemories; i++) { 104c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int lastErr = mSharedMemories[i].close(); 105c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk if (lastErr < 0) err = lastErr; 106c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk } 107c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk return AAudioConvert_androidToAAudioResult(err); 108204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk} 109204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 1105ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burkaaudio_result_t AudioEndpointParcelable::validate() { 1115ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk aaudio_result_t result; 112204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk if (mNumSharedMemories < 0 || mNumSharedMemories >= MAX_SHARED_MEMORIES) { 113204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk ALOGE("AudioEndpointParcelable invalid mNumSharedMemories = %d", mNumSharedMemories); 1145ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk return AAUDIO_ERROR_INTERNAL; 115204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 116204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk for (int i = 0; i < mNumSharedMemories; i++) { 117204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk result = mSharedMemories[i].validate(); 1185ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk if (result != AAUDIO_OK) { 119c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk ALOGE("AudioEndpointParcelable invalid mSharedMemories[%d] = %d", i, result); 120204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return result; 121204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 122204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 1235ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk if ((result = mUpMessageQueueParcelable.validate()) != AAUDIO_OK) { 124204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk ALOGE("AudioEndpointParcelable invalid mUpMessageQueueParcelable = %d", result); 125204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return result; 126204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 1275ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk if ((result = mDownMessageQueueParcelable.validate()) != AAUDIO_OK) { 128204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk ALOGE("AudioEndpointParcelable invalid mDownMessageQueueParcelable = %d", result); 129204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return result; 130204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 1315ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk if ((result = mUpDataQueueParcelable.validate()) != AAUDIO_OK) { 132204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk ALOGE("AudioEndpointParcelable invalid mUpDataQueueParcelable = %d", result); 133204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return result; 134204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 1355ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk if ((result = mDownDataQueueParcelable.validate()) != AAUDIO_OK) { 136204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk ALOGE("AudioEndpointParcelable invalid mDownDataQueueParcelable = %d", result); 137204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return result; 138204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 1395ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk return AAUDIO_OK; 140204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk} 141204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 142204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkvoid AudioEndpointParcelable::dump() { 143204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk ALOGD("AudioEndpointParcelable ======================================= BEGIN"); 144204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk ALOGD("AudioEndpointParcelable mNumSharedMemories = %d", mNumSharedMemories); 145204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk for (int i = 0; i < mNumSharedMemories; i++) { 146204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mSharedMemories[i].dump(); 147204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 148204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk ALOGD("AudioEndpointParcelable mUpMessageQueueParcelable ========="); 149204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mUpMessageQueueParcelable.dump(); 150204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk ALOGD("AudioEndpointParcelable mDownMessageQueueParcelable ======="); 151204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mDownMessageQueueParcelable.dump(); 152204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk ALOGD("AudioEndpointParcelable mUpDataQueueParcelable ============"); 153204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mUpDataQueueParcelable.dump(); 154204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk ALOGD("AudioEndpointParcelable mDownDataQueueParcelable =========="); 155204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mDownDataQueueParcelable.dump(); 156204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk ALOGD("AudioEndpointParcelable ======================================= END"); 157204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk} 158204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 159