1faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana/* 2faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana * Copyright (C) 2013 The Android Open Source Project 3faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana * 4faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana * Licensed under the Apache License, Version 2.0 (the "License"); 5faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana * you may not use this file except in compliance with the License. 6faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana * You may obtain a copy of the License at 7faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana * 8faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana * http://www.apache.org/licenses/LICENSE-2.0 9faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana * 10faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana * Unless required by applicable law or agreed to in writing, software 11faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana * distributed under the License is distributed on an "AS IS" BASIS, 12faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana * See the License for the specific language governing permissions and 14faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana * limitations under the License. 15faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana */ 16faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana 17faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana#include <hardware/audio.h> 18faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana#include <hardware/audio_effect.h> 19f90c7e0bb8d83d8b7f733bdf430d331ea3f221e8jpadmana#include "EffectsFactory.h" 20f90c7e0bb8d83d8b7f733bdf430d331ea3f221e8jpadmana 21faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmananamespace android { 22faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmanaenum { 23faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana SUB_FX_HOST, // Index of HOST in the descriptor and handle arrays 24faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana // of the Proxy context 25faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana SUB_FX_OFFLOAD, // Index of OFFLOAD in the descriptor and handle arrays 26faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana // of the Proxy context 27faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana SUB_FX_COUNT // The number of sub effects for a Proxy(1 HW, 1 SW) 28faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana}; 29faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana#if __cplusplus 30faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmanaextern "C" { 31faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana#endif 32faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana 33faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmanaint EffectProxyCreate(const effect_uuid_t *uuid, 34faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana int32_t sessionId, 35faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana int32_t ioId, 36faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana effect_handle_t *pHandle); 37faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmanaint EffectProxyRelease(effect_handle_t handle); 38faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmanaint EffectProxyGetDescriptor(const effect_uuid_t *uuid, 39faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana effect_descriptor_t *pDescriptor); 40faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana/* Effect Control Interface Implementation: Process */ 41faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmanaint Effect_process(effect_handle_t self, 42faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana audio_buffer_t *inBuffer, 43faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana audio_buffer_t *outBuffer); 44faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana 45faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana/* Effect Control Interface Implementation: Command */ 46faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmanaint Effect_command(effect_handle_t self, 47faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana uint32_t cmdCode, 48faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana uint32_t cmdSize, 49faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana void *pCmdData, 50faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana uint32_t *replySize, 51faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana void *pReplyData); 52faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmanaint Effect_getDescriptor(effect_handle_t self, 53faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana effect_descriptor_t *pDescriptor); 54faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana 55faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmanaconst struct effect_interface_s gEffectInterface = { 56faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana Effect_process, 57faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana Effect_command, 58faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana Effect_getDescriptor, 59faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana NULL, 60faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana}; 61faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana 625d6d86a4d102704f49b9235eaf282c428d7100b6Eric Laurent#define PROXY_REPLY_SIZE_MAX (64 * 1024) // must be power of two 635d6d86a4d102704f49b9235eaf282c428d7100b6Eric Laurent#define PROXY_REPLY_SIZE_DEFAULT 32 // must be power of two 645d6d86a4d102704f49b9235eaf282c428d7100b6Eric Laurent 65faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmanastruct EffectContext { 66faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana const struct effect_interface_s *common_itfe; // Holds the itfe of the Proxy 67f90c7e0bb8d83d8b7f733bdf430d331ea3f221e8jpadmana sub_effect_entry_t** sube; // Points to the sub effects 68faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana effect_descriptor_t* desc; // Points to the sub effect descriptors 69f90c7e0bb8d83d8b7f733bdf430d331ea3f221e8jpadmana audio_effect_library_t** aeli; // Points to the sub effect aeli 70faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana effect_handle_t eHandle[SUB_FX_COUNT]; // The effect handles of the sub effects 71faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana int index; // The index that is currently active - HOST or OFFLOAD 72faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana int32_t sessionId; // The sessiond in which the effect is created. 73faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana // Stored in context to pass on to sub effect creation 74faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana int32_t ioId; // The ioId in which the effect is created. 75faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana // Stored in context to pass on to sub effect creation 76faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana effect_uuid_t uuid; // UUID of the Proxy 775d6d86a4d102704f49b9235eaf282c428d7100b6Eric Laurent char* replyData; // temporary buffer for non active sub effect command reply 785d6d86a4d102704f49b9235eaf282c428d7100b6Eric Laurent uint32_t replySize; // current size of temporary reply buffer 79faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana}; 80faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana 81faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana#if __cplusplus 82faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana} // extern "C" 83faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana#endif 84faca05e96744dfaa2f352e3dbb29eead4e55cfa0jpadmana} //namespace android 85