RingBufferParcelable.cpp revision 204a163c86f357a878873fe7d4c4164f3d55c9b6
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 17204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include <stdint.h> 18204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 19204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include <binder/Parcelable.h> 20204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 21204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "binding/OboeServiceDefinitions.h" 22204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "binding/SharedRegionParcelable.h" 23204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "binding/RingBufferParcelable.h" 24204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 25204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkusing namespace oboe; 26204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 27204a163c86f357a878873fe7d4c4164f3d55c9b6Phil BurkRingBufferParcelable::RingBufferParcelable() {} 28204a163c86f357a878873fe7d4c4164f3d55c9b6Phil BurkRingBufferParcelable::~RingBufferParcelable() {} 29204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 30204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk// TODO This assumes that all three use the same SharedMemoryParcelable 31204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkvoid RingBufferParcelable::setupMemory(int32_t sharedMemoryIndex, 32204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk int32_t dataMemoryOffset, 33204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk int32_t dataSizeInBytes, 34204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk int32_t readCounterOffset, 35204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk int32_t writeCounterOffset, 36204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk int32_t counterSizeBytes) { 37204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mReadCounterParcelable.setup(sharedMemoryIndex, readCounterOffset, counterSizeBytes); 38204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mWriteCounterParcelable.setup(sharedMemoryIndex, writeCounterOffset, counterSizeBytes); 39204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mDataParcelable.setup(sharedMemoryIndex, dataMemoryOffset, dataSizeInBytes); 40204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk} 41204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 42204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkvoid RingBufferParcelable::setupMemory(int32_t sharedMemoryIndex, 43204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk int32_t dataMemoryOffset, 44204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk int32_t dataSizeInBytes) { 45204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mReadCounterParcelable.setup(sharedMemoryIndex, 0, 0); 46204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mWriteCounterParcelable.setup(sharedMemoryIndex, 0, 0); 47204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mDataParcelable.setup(sharedMemoryIndex, dataMemoryOffset, dataSizeInBytes); 48204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk} 49204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 50204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkint32_t RingBufferParcelable::getBytesPerFrame() { 51204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return mBytesPerFrame; 52204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk} 53204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 54204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkvoid RingBufferParcelable::setBytesPerFrame(int32_t bytesPerFrame) { 55204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mBytesPerFrame = bytesPerFrame; 56204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk} 57204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 58204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkint32_t RingBufferParcelable::getFramesPerBurst() { 59204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return mFramesPerBurst; 60204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk} 61204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 62204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkvoid RingBufferParcelable::setFramesPerBurst(int32_t framesPerBurst) { 63204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mFramesPerBurst = framesPerBurst; 64204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk} 65204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 66204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkint32_t RingBufferParcelable::getCapacityInFrames() { 67204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return mCapacityInFrames; 68204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk} 69204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 70204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkvoid RingBufferParcelable::setCapacityInFrames(int32_t capacityInFrames) { 71204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mCapacityInFrames = capacityInFrames; 72204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk} 73204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 74204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk/** 75204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * The read and write must be symmetric. 76204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk */ 77204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkstatus_t RingBufferParcelable::writeToParcel(Parcel* parcel) const { 78204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk parcel->writeInt32(mCapacityInFrames); 79204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk if (mCapacityInFrames > 0) { 80204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk parcel->writeInt32(mBytesPerFrame); 81204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk parcel->writeInt32(mFramesPerBurst); 82204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk parcel->writeInt32(mFlags); 83204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mReadCounterParcelable.writeToParcel(parcel); 84204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mWriteCounterParcelable.writeToParcel(parcel); 85204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mDataParcelable.writeToParcel(parcel); 86204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 87204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return NO_ERROR; // TODO check for errors above 88204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk} 89204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 90204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkstatus_t RingBufferParcelable::readFromParcel(const Parcel* parcel) { 91204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk parcel->readInt32(&mCapacityInFrames); 92204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk if (mCapacityInFrames > 0) { 93204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk parcel->readInt32(&mBytesPerFrame); 94204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk parcel->readInt32(&mFramesPerBurst); 95204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk parcel->readInt32((int32_t *)&mFlags); 96204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mReadCounterParcelable.readFromParcel(parcel); 97204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mWriteCounterParcelable.readFromParcel(parcel); 98204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mDataParcelable.readFromParcel(parcel); 99204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 100204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return NO_ERROR; // TODO check for errors above 101204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk} 102204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 103204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkoboe_result_t RingBufferParcelable::resolve(SharedMemoryParcelable *memoryParcels, RingBufferDescriptor *descriptor) { 104204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk oboe_result_t result; 105204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 106204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk result = mReadCounterParcelable.resolve(memoryParcels, 107204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk (void **) &descriptor->readCounterAddress); 108204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk if (result != OBOE_OK) { 109204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return result; 110204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 111204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 112204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk result = mWriteCounterParcelable.resolve(memoryParcels, 113204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk (void **) &descriptor->writeCounterAddress); 114204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk if (result != OBOE_OK) { 115204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return result; 116204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 117204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 118204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk result = mDataParcelable.resolve(memoryParcels, (void **) &descriptor->dataAddress); 119204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk if (result != OBOE_OK) { 120204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return result; 121204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 122204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 123204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk descriptor->bytesPerFrame = mBytesPerFrame; 124204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk descriptor->framesPerBurst = mFramesPerBurst; 125204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk descriptor->capacityInFrames = mCapacityInFrames; 126204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk descriptor->flags = mFlags; 127204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return OBOE_OK; 128204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk} 129204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 130204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkoboe_result_t RingBufferParcelable::validate() { 131204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk oboe_result_t result; 132204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk if (mCapacityInFrames < 0 || mCapacityInFrames >= 32 * 1024) { 133204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk ALOGE("RingBufferParcelable invalid mCapacityInFrames = %d", mCapacityInFrames); 134204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return OBOE_ERROR_INTERNAL; 135204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 136204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk if (mBytesPerFrame < 0 || mBytesPerFrame >= 256) { 137204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk ALOGE("RingBufferParcelable invalid mBytesPerFrame = %d", mBytesPerFrame); 138204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return OBOE_ERROR_INTERNAL; 139204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 140204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk if (mFramesPerBurst < 0 || mFramesPerBurst >= 1024) { 141204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk ALOGE("RingBufferParcelable invalid mFramesPerBurst = %d", mFramesPerBurst); 142204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return OBOE_ERROR_INTERNAL; 143204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 144204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk if ((result = mReadCounterParcelable.validate()) != OBOE_OK) { 145204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk ALOGE("RingBufferParcelable invalid mReadCounterParcelable = %d", result); 146204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return result; 147204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 148204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk if ((result = mWriteCounterParcelable.validate()) != OBOE_OK) { 149204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk ALOGE("RingBufferParcelable invalid mWriteCounterParcelable = %d", result); 150204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return result; 151204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 152204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk if ((result = mDataParcelable.validate()) != OBOE_OK) { 153204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk ALOGE("RingBufferParcelable invalid mDataParcelable = %d", result); 154204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return result; 155204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 156204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return OBOE_OK; 157204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk} 158204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 159204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 160204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkvoid RingBufferParcelable::dump() { 161204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk ALOGD("RingBufferParcelable mCapacityInFrames = %d ---------", mCapacityInFrames); 162204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk if (mCapacityInFrames > 0) { 163204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk ALOGD("RingBufferParcelable mBytesPerFrame = %d", mBytesPerFrame); 164204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk ALOGD("RingBufferParcelable mFramesPerBurst = %d", mFramesPerBurst); 165204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk ALOGD("RingBufferParcelable mFlags = %u", mFlags); 166204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mReadCounterParcelable.dump(); 167204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mWriteCounterParcelable.dump(); 168204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk mDataParcelable.dump(); 169204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 170204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk} 171