/* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #include #include #include #include "fifo/FifoBuffer.h" #include "binding/RingBufferParcelable.h" #include "binding/AudioEndpointParcelable.h" namespace aaudio { /** * Wrap the shared memory with read and write counters. Provide a fifo buffer to access the * wrapped shared memory. */ class SharedMemoryWrapper { public: explicit SharedMemoryWrapper(); virtual ~SharedMemoryWrapper(); android::base::unique_fd& getDataFileDescriptor() { return mDataFd; } aaudio_result_t setupFifoBuffer(android::fifo_frames_t bytesPerFrame, android::fifo_frames_t capacityInFrames); void reset(); enum CounterFilling { NONE = 0, READ = 1, WRITE = 2, }; /** * Fill shared memory into parcelable. * * @param endpointParcelable container for ring buffers and shared memories * @param ringBufferParcelable the ring buffer * @param bytesPerFrame the bytes per frame of the data memory * @param framesPerBurst the frame per burst of the data memory * @param capacityInFrames the capacity in frames of the data memory * @param counterFilling a bit mask to control if the counter from the wrapper should be filled * or not. */ void fillParcelable(AudioEndpointParcelable* endpointParcelable, RingBufferParcelable &ringBufferParcelable, int32_t bytesPerFrame, int32_t framesPerBurst, int32_t capacityInFrames, CounterFilling counterFilling = NONE); std::shared_ptr getFifoBuffer() { return mFifoBuffer; } private: android::base::unique_fd mDataFd; android::base::unique_fd mCounterFd; uint8_t* mCounterMemoryAddress = nullptr; android::fifo_counter_t* mReadCounterAddress = nullptr; android::fifo_counter_t* mWriteCounterAddress = nullptr; std::shared_ptr mFifoBuffer; uint8_t* mSharedMemory = nullptr; int32_t mSharedMemorySizeInBytes = 0; }; } /* namespace aaudio */