1*4d7e907cSAndroid Build Coastguard Worker /* 2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project 3*4d7e907cSAndroid Build Coastguard Worker * 4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*4d7e907cSAndroid Build Coastguard Worker * 8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*4d7e907cSAndroid Build Coastguard Worker * 10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License. 15*4d7e907cSAndroid Build Coastguard Worker */ 16*4d7e907cSAndroid Build Coastguard Worker 17*4d7e907cSAndroid Build Coastguard Worker #include "AudioBufferManager.h" 18*4d7e907cSAndroid Build Coastguard Worker 19*4d7e907cSAndroid Build Coastguard Worker #include <atomic> 20*4d7e907cSAndroid Build Coastguard Worker 21*4d7e907cSAndroid Build Coastguard Worker #include <hidlmemory/mapping.h> 22*4d7e907cSAndroid Build Coastguard Worker 23*4d7e907cSAndroid Build Coastguard Worker namespace android { 24*4d7e907cSAndroid Build Coastguard Worker 25*4d7e907cSAndroid Build Coastguard Worker ANDROID_SINGLETON_STATIC_INSTANCE(AudioBufferManager); 26*4d7e907cSAndroid Build Coastguard Worker wrap(const AudioBuffer & buffer,sp<AudioBufferWrapper> * wrapper)27*4d7e907cSAndroid Build Coastguard Workerbool AudioBufferManager::wrap(const AudioBuffer& buffer, sp<AudioBufferWrapper>* wrapper) { 28*4d7e907cSAndroid Build Coastguard Worker // Check if we have this buffer already 29*4d7e907cSAndroid Build Coastguard Worker std::lock_guard<std::mutex> lock(mLock); 30*4d7e907cSAndroid Build Coastguard Worker ssize_t idx = mBuffers.indexOfKey(buffer.id); 31*4d7e907cSAndroid Build Coastguard Worker if (idx >= 0) { 32*4d7e907cSAndroid Build Coastguard Worker *wrapper = mBuffers[idx].promote(); 33*4d7e907cSAndroid Build Coastguard Worker if (*wrapper != nullptr) { 34*4d7e907cSAndroid Build Coastguard Worker (*wrapper)->getHalBuffer()->frameCount = buffer.frameCount; 35*4d7e907cSAndroid Build Coastguard Worker return true; 36*4d7e907cSAndroid Build Coastguard Worker } 37*4d7e907cSAndroid Build Coastguard Worker mBuffers.removeItemsAt(idx); 38*4d7e907cSAndroid Build Coastguard Worker } 39*4d7e907cSAndroid Build Coastguard Worker // Need to create and init a new AudioBufferWrapper. 40*4d7e907cSAndroid Build Coastguard Worker sp<AudioBufferWrapper> tempBuffer(new AudioBufferWrapper(buffer)); 41*4d7e907cSAndroid Build Coastguard Worker if (!tempBuffer->init()) return false; 42*4d7e907cSAndroid Build Coastguard Worker *wrapper = tempBuffer; 43*4d7e907cSAndroid Build Coastguard Worker mBuffers.add(buffer.id, *wrapper); 44*4d7e907cSAndroid Build Coastguard Worker return true; 45*4d7e907cSAndroid Build Coastguard Worker } 46*4d7e907cSAndroid Build Coastguard Worker removeEntry(uint64_t id)47*4d7e907cSAndroid Build Coastguard Workervoid AudioBufferManager::removeEntry(uint64_t id) { 48*4d7e907cSAndroid Build Coastguard Worker std::lock_guard<std::mutex> lock(mLock); 49*4d7e907cSAndroid Build Coastguard Worker ssize_t idx = mBuffers.indexOfKey(id); 50*4d7e907cSAndroid Build Coastguard Worker if (idx >= 0) mBuffers.removeItemsAt(idx); 51*4d7e907cSAndroid Build Coastguard Worker } 52*4d7e907cSAndroid Build Coastguard Worker 53*4d7e907cSAndroid Build Coastguard Worker namespace hardware { 54*4d7e907cSAndroid Build Coastguard Worker namespace audio { 55*4d7e907cSAndroid Build Coastguard Worker namespace effect { 56*4d7e907cSAndroid Build Coastguard Worker namespace CPP_VERSION { 57*4d7e907cSAndroid Build Coastguard Worker namespace implementation { 58*4d7e907cSAndroid Build Coastguard Worker AudioBufferWrapper(const AudioBuffer & buffer)59*4d7e907cSAndroid Build Coastguard WorkerAudioBufferWrapper::AudioBufferWrapper(const AudioBuffer& buffer) 60*4d7e907cSAndroid Build Coastguard Worker : mHidlBuffer(buffer), mHalBuffer{0, {nullptr}} {} 61*4d7e907cSAndroid Build Coastguard Worker ~AudioBufferWrapper()62*4d7e907cSAndroid Build Coastguard WorkerAudioBufferWrapper::~AudioBufferWrapper() { 63*4d7e907cSAndroid Build Coastguard Worker AudioBufferManager::getInstance().removeEntry(mHidlBuffer.id); 64*4d7e907cSAndroid Build Coastguard Worker } 65*4d7e907cSAndroid Build Coastguard Worker init()66*4d7e907cSAndroid Build Coastguard Workerbool AudioBufferWrapper::init() { 67*4d7e907cSAndroid Build Coastguard Worker if (mHalBuffer.raw != nullptr) { 68*4d7e907cSAndroid Build Coastguard Worker ALOGE("An attempt to init AudioBufferWrapper twice"); 69*4d7e907cSAndroid Build Coastguard Worker return false; 70*4d7e907cSAndroid Build Coastguard Worker } 71*4d7e907cSAndroid Build Coastguard Worker mHidlMemory = mapMemory(mHidlBuffer.data); 72*4d7e907cSAndroid Build Coastguard Worker if (mHidlMemory == nullptr) { 73*4d7e907cSAndroid Build Coastguard Worker ALOGE("Could not map HIDL memory to IMemory"); 74*4d7e907cSAndroid Build Coastguard Worker return false; 75*4d7e907cSAndroid Build Coastguard Worker } 76*4d7e907cSAndroid Build Coastguard Worker mHalBuffer.raw = static_cast<void*>(mHidlMemory->getPointer()); 77*4d7e907cSAndroid Build Coastguard Worker if (mHalBuffer.raw == nullptr) { 78*4d7e907cSAndroid Build Coastguard Worker ALOGE("IMemory buffer pointer is null"); 79*4d7e907cSAndroid Build Coastguard Worker return false; 80*4d7e907cSAndroid Build Coastguard Worker } 81*4d7e907cSAndroid Build Coastguard Worker mHalBuffer.frameCount = mHidlBuffer.frameCount; 82*4d7e907cSAndroid Build Coastguard Worker return true; 83*4d7e907cSAndroid Build Coastguard Worker } 84*4d7e907cSAndroid Build Coastguard Worker 85*4d7e907cSAndroid Build Coastguard Worker } // namespace implementation 86*4d7e907cSAndroid Build Coastguard Worker } // namespace CPP_VERSION 87*4d7e907cSAndroid Build Coastguard Worker } // namespace effect 88*4d7e907cSAndroid Build Coastguard Worker } // namespace audio 89*4d7e907cSAndroid Build Coastguard Worker } // namespace hardware 90*4d7e907cSAndroid Build Coastguard Worker } // namespace android 91