145ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie/*
245ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie * Copyright (C) 2015 The Android Open Source Project
345ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie *
445ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie * Licensed under the Apache License, Version 2.0 (the "License");
545ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie * you may not use this file except in compliance with the License.
645ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie * You may obtain a copy of the License at
745ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie *
845ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie *      http://www.apache.org/licenses/LICENSE-2.0
945ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie *
1045ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie * Unless required by applicable law or agreed to in writing, software
1145ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie * distributed under the License is distributed on an "AS IS" BASIS,
1245ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1345ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie * See the License for the specific language governing permissions and
1445ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie * limitations under the License.
1545ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie */
1645ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie
1745ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie#pragma once
1845ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie
1945ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie#include <RoutingStrategy.h>
2000260b5e6996b0a4b12f71c5b84e44adea040534Mikhail Naganov#include <system/audio_effect.h>
2145ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie#include <utils/KeyedVector.h>
2245ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie#include <utils/RefBase.h>
2345ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie#include <utils/Errors.h>
2445ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie
2545ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffienamespace android {
2645ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie
2745ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie
2845ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffieclass EffectDescriptor : public RefBase
2945ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie{
3045ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffiepublic:
3145ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie    status_t dump(int fd);
3245ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie
3345ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie    int mIo;                // io the effect is attached to
3445ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie    routing_strategy mStrategy; // routing strategy the effect is associated to
3545ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie    int mSession;               // audio session the effect is on
3645ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie    effect_descriptor_t mDesc;  // effect descriptor
3745ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie    bool mEnabled;              // enabled state: CPU load being used or not
3845ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie};
3945ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie
4045ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffieclass EffectDescriptorCollection : public KeyedVector<int, sp<EffectDescriptor> >
4145ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie{
4245ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffiepublic:
4345ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie    EffectDescriptorCollection();
4445ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie
4545ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie    status_t registerEffect(const effect_descriptor_t *desc, audio_io_handle_t io,
4645ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie                            uint32_t strategy, int session, int id);
4745ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie    status_t unregisterEffect(int id);
4845ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie    status_t setEffectEnabled(int id, bool enabled);
4945ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie    uint32_t getMaxEffectsCpuLoad() const;
5045ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie    uint32_t getMaxEffectsMemory() const;
5145ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie    bool isNonOffloadableEffectEnabled();
5245ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie
5345ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie    status_t dump(int fd);
5445ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie
5545ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffieprivate:
5645ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie    status_t setEffectEnabled(const sp<EffectDescriptor> &effectDesc, bool enabled);
5745ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie
585f1fa3053c87dd8e9dc528fb8c101907ff747746Andy Hung    uint32_t mTotalEffectsCpuLoad; // current CPU load used by effects (in MIPS)
595f1fa3053c87dd8e9dc528fb8c101907ff747746Andy Hung    uint32_t mTotalEffectsMemory;  // current memory used by effects (in KB)
605f1fa3053c87dd8e9dc528fb8c101907ff747746Andy Hung    uint32_t mTotalEffectsMemoryMaxUsed; // maximum memory used by effects (in KB)
6145ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie
6245ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie    /**
6345ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie     * Maximum CPU load allocated to audio effects in 0.1 MIPS (ARMv5TE, 0 WS memory) units
6445ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie     */
6545ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie    static const uint32_t MAX_EFFECTS_CPU_LOAD = 1000;
6645ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie    /**
6745ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie     * Maximum memory allocated to audio effects in KB
6845ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie     */
6945ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie    static const uint32_t MAX_EFFECTS_MEMORY = 512;
7045ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie};
7145ed3b053d9af2250f5ece9ee4e826905c3763a7François Gaffie
721b2a794a27caab3a1320d22b872b04ef73e96555Mikhail Naganov} // namespace android
73