1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #pragma once 18*ec779b8eSAndroid Build Coastguard Worker 19*ec779b8eSAndroid Build Coastguard Worker #include <android-base/unique_fd.h> 20*ec779b8eSAndroid Build Coastguard Worker #include <cutils/ashmem.h> 21*ec779b8eSAndroid Build Coastguard Worker #include <stdint.h> 22*ec779b8eSAndroid Build Coastguard Worker #include <string> 23*ec779b8eSAndroid Build Coastguard Worker #include <sys/mman.h> 24*ec779b8eSAndroid Build Coastguard Worker 25*ec779b8eSAndroid Build Coastguard Worker #include "fifo/FifoBuffer.h" 26*ec779b8eSAndroid Build Coastguard Worker #include "binding/RingBufferParcelable.h" 27*ec779b8eSAndroid Build Coastguard Worker #include "binding/AudioEndpointParcelable.h" 28*ec779b8eSAndroid Build Coastguard Worker 29*ec779b8eSAndroid Build Coastguard Worker namespace aaudio { 30*ec779b8eSAndroid Build Coastguard Worker 31*ec779b8eSAndroid Build Coastguard Worker /** 32*ec779b8eSAndroid Build Coastguard Worker * Wrap the shared memory with read and write counters. Provide a fifo buffer to access the 33*ec779b8eSAndroid Build Coastguard Worker * wrapped shared memory. 34*ec779b8eSAndroid Build Coastguard Worker */ 35*ec779b8eSAndroid Build Coastguard Worker class SharedMemoryWrapper { 36*ec779b8eSAndroid Build Coastguard Worker public: 37*ec779b8eSAndroid Build Coastguard Worker explicit SharedMemoryWrapper(); 38*ec779b8eSAndroid Build Coastguard Worker 39*ec779b8eSAndroid Build Coastguard Worker virtual ~SharedMemoryWrapper(); 40*ec779b8eSAndroid Build Coastguard Worker getDataFileDescriptor()41*ec779b8eSAndroid Build Coastguard Worker android::base::unique_fd& getDataFileDescriptor() { return mDataFd; } 42*ec779b8eSAndroid Build Coastguard Worker 43*ec779b8eSAndroid Build Coastguard Worker aaudio_result_t setupFifoBuffer(android::fifo_frames_t bytesPerFrame, 44*ec779b8eSAndroid Build Coastguard Worker android::fifo_frames_t capacityInFrames); 45*ec779b8eSAndroid Build Coastguard Worker 46*ec779b8eSAndroid Build Coastguard Worker void reset(); 47*ec779b8eSAndroid Build Coastguard Worker 48*ec779b8eSAndroid Build Coastguard Worker enum CounterFilling { 49*ec779b8eSAndroid Build Coastguard Worker NONE = 0, 50*ec779b8eSAndroid Build Coastguard Worker READ = 1, 51*ec779b8eSAndroid Build Coastguard Worker WRITE = 2, 52*ec779b8eSAndroid Build Coastguard Worker }; 53*ec779b8eSAndroid Build Coastguard Worker /** 54*ec779b8eSAndroid Build Coastguard Worker * Fill shared memory into parcelable. 55*ec779b8eSAndroid Build Coastguard Worker * 56*ec779b8eSAndroid Build Coastguard Worker * @param endpointParcelable container for ring buffers and shared memories 57*ec779b8eSAndroid Build Coastguard Worker * @param ringBufferParcelable the ring buffer 58*ec779b8eSAndroid Build Coastguard Worker * @param bytesPerFrame the bytes per frame of the data memory 59*ec779b8eSAndroid Build Coastguard Worker * @param framesPerBurst the frame per burst of the data memory 60*ec779b8eSAndroid Build Coastguard Worker * @param capacityInFrames the capacity in frames of the data memory 61*ec779b8eSAndroid Build Coastguard Worker * @param counterFilling a bit mask to control if the counter from the wrapper should be filled 62*ec779b8eSAndroid Build Coastguard Worker * or not. 63*ec779b8eSAndroid Build Coastguard Worker */ 64*ec779b8eSAndroid Build Coastguard Worker void fillParcelable(AudioEndpointParcelable* endpointParcelable, 65*ec779b8eSAndroid Build Coastguard Worker RingBufferParcelable &ringBufferParcelable, 66*ec779b8eSAndroid Build Coastguard Worker int32_t bytesPerFrame, 67*ec779b8eSAndroid Build Coastguard Worker int32_t framesPerBurst, 68*ec779b8eSAndroid Build Coastguard Worker int32_t capacityInFrames, 69*ec779b8eSAndroid Build Coastguard Worker CounterFilling counterFilling = NONE); 70*ec779b8eSAndroid Build Coastguard Worker getFifoBuffer()71*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<android::FifoBuffer> getFifoBuffer() { 72*ec779b8eSAndroid Build Coastguard Worker return mFifoBuffer; 73*ec779b8eSAndroid Build Coastguard Worker } 74*ec779b8eSAndroid Build Coastguard Worker 75*ec779b8eSAndroid Build Coastguard Worker private: 76*ec779b8eSAndroid Build Coastguard Worker android::base::unique_fd mDataFd; 77*ec779b8eSAndroid Build Coastguard Worker android::base::unique_fd mCounterFd; 78*ec779b8eSAndroid Build Coastguard Worker uint8_t* mCounterMemoryAddress = nullptr; 79*ec779b8eSAndroid Build Coastguard Worker android::fifo_counter_t* mReadCounterAddress = nullptr; 80*ec779b8eSAndroid Build Coastguard Worker android::fifo_counter_t* mWriteCounterAddress = nullptr; 81*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<android::FifoBufferIndirect> mFifoBuffer; 82*ec779b8eSAndroid Build Coastguard Worker uint8_t* mSharedMemory = nullptr; 83*ec779b8eSAndroid Build Coastguard Worker int32_t mSharedMemorySizeInBytes = 0; 84*ec779b8eSAndroid Build Coastguard Worker }; 85*ec779b8eSAndroid Build Coastguard Worker 86*ec779b8eSAndroid Build Coastguard Worker } /* namespace aaudio */ 87