1a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov/*
2a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov * Copyright (C) 2017 The Android Open Source Project
3a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov *
4a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov * Licensed under the Apache License, Version 2.0 (the "License");
5a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov * you may not use this file except in compliance with the License.
6a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov * You may obtain a copy of the License at
7a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov *
8a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov *      http://www.apache.org/licenses/LICENSE-2.0
9a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov *
10a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov * Unless required by applicable law or agreed to in writing, software
11a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov * distributed under the License is distributed on an "AS IS" BASIS,
12a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov * See the License for the specific language governing permissions and
14a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov * limitations under the License.
15a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov */
16a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov
1762588b69f6289e2ccb7a363a4b0727d51b76bfb5Kevin Rocard#include <common/all-versions/IncludeGuard.h>
18a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov
19a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov#include <mutex>
20a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov
21a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov#include <android/hidl/memory/1.0/IMemory.h>
22a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov#include <system/audio_effect.h>
23a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov#include <utils/KeyedVector.h>
2422505e6bf1959d2b2217a399f75e0721631718d5Kevin Rocard#include <utils/RefBase.h>
25a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov#include <utils/Singleton.h>
26a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov
2762588b69f6289e2ccb7a363a4b0727d51b76bfb5Kevin Rocardusing ::android::hardware::audio::effect::AUDIO_HAL_VERSION::AudioBuffer;
28a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganovusing ::android::hidl::memory::V1_0::IMemory;
29a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov
30a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganovnamespace android {
31a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganovnamespace hardware {
32a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganovnamespace audio {
33a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganovnamespace effect {
3462588b69f6289e2ccb7a363a4b0727d51b76bfb5Kevin Rocardnamespace AUDIO_HAL_VERSION {
35a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganovnamespace implementation {
36a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov
37a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganovclass AudioBufferWrapper : public RefBase {
3822505e6bf1959d2b2217a399f75e0721631718d5Kevin Rocard   public:
39a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov    explicit AudioBufferWrapper(const AudioBuffer& buffer);
40a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov    virtual ~AudioBufferWrapper();
41a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov    bool init();
42a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov    audio_buffer_t* getHalBuffer() { return &mHalBuffer; }
4322505e6bf1959d2b2217a399f75e0721631718d5Kevin Rocard
4422505e6bf1959d2b2217a399f75e0721631718d5Kevin Rocard   private:
45a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov    AudioBufferWrapper(const AudioBufferWrapper&) = delete;
46a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov    void operator=(AudioBufferWrapper) = delete;
47a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov
48a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov    AudioBuffer mHidlBuffer;
49a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov    sp<IMemory> mHidlMemory;
50a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov    audio_buffer_t mHalBuffer;
51a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov};
52a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov
53a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov}  // namespace implementation
5462588b69f6289e2ccb7a363a4b0727d51b76bfb5Kevin Rocard}  // namespace AUDIO_HAL_VERSION
55a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov}  // namespace effect
56a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov}  // namespace audio
57a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov}  // namespace hardware
58a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov}  // namespace android
59a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov
6062588b69f6289e2ccb7a363a4b0727d51b76bfb5Kevin Rocardusing ::android::hardware::audio::effect::AUDIO_HAL_VERSION::implementation::AudioBufferWrapper;
61a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov
62a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganovnamespace android {
63a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov
64a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov// This class needs to be in 'android' ns because Singleton macros require that.
65a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganovclass AudioBufferManager : public Singleton<AudioBufferManager> {
6622505e6bf1959d2b2217a399f75e0721631718d5Kevin Rocard   public:
67a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov    bool wrap(const AudioBuffer& buffer, sp<AudioBufferWrapper>* wrapper);
68a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov
6922505e6bf1959d2b2217a399f75e0721631718d5Kevin Rocard   private:
7062588b69f6289e2ccb7a363a4b0727d51b76bfb5Kevin Rocard    friend class hardware::audio::effect::AUDIO_HAL_VERSION::implementation::AudioBufferWrapper;
71a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov
72a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov    // Called by AudioBufferWrapper.
73a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov    void removeEntry(uint64_t id);
74a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov
75a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov    std::mutex mLock;
76a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov    KeyedVector<uint64_t, wp<AudioBufferWrapper>> mBuffers;
77a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov};
78a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov
79a331de14219b34b08f4cbb462a45f1fd82a92d48Mikhail Naganov}  // namespace android
80