104c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi/* 204c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi * Copyright (C) 2012 The Android Open Source Project 304c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi * 404c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 504c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi * you may not use this file except in compliance with the License. 604c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi * You may obtain a copy of the License at 704c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi * 804c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 904c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi * 1004c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 1104c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 1204c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1304c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi * See the License for the specific language governing permissions and 1404c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi * limitations under the License. 1504c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi */ 1604c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi 1704c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi#ifndef ANDROID_EFFECTDOWNMIX_H_ 1804c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi#define ANDROID_EFFECTDOWNMIX_H_ 1904c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi 2004c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi#include <audio_effects/effect_downmix.h> 2104c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi#include <audio_utils/primitives.h> 2204c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi#include <system/audio.h> 2304c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi 2404c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi/*------------------------------------ 2504c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi * definitions 2604c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi *------------------------------------ 2704c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi*/ 2804c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi 2904c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi#define DOWNMIX_OUTPUT_CHANNELS AUDIO_CHANNEL_OUT_STEREO 3004c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi 3104c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivitypedef enum { 3204c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi DOWNMIX_STATE_UNINITIALIZED, 3304c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi DOWNMIX_STATE_INITIALIZED, 3404c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi DOWNMIX_STATE_ACTIVE, 3504c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi} downmix_state_t; 3604c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi 3704c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi/* parameters for each downmixer */ 3804c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivitypedef struct { 3904c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi downmix_state_t state; 4004c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi downmix_type_t type; 4104c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi bool apply_volume_correction; 4204c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi uint8_t input_channel_count; 4304c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi} downmix_object_t; 4404c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi 4504c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi 4604c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivitypedef struct downmix_module_s { 4704c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi const struct effect_interface_s *itfe; 4804c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi effect_config_t config; 4904c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi downmix_object_t context; 5004c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi} downmix_module_t; 5104c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi 526895deeecc8797e6f5b28e7d07ec6bc499355c0cJean-Michel Triviconst uint32_t kSides = AUDIO_CHANNEL_OUT_SIDE_LEFT | AUDIO_CHANNEL_OUT_SIDE_RIGHT; 536895deeecc8797e6f5b28e7d07ec6bc499355c0cJean-Michel Triviconst uint32_t kBacks = AUDIO_CHANNEL_OUT_BACK_LEFT | AUDIO_CHANNEL_OUT_BACK_RIGHT; 546895deeecc8797e6f5b28e7d07ec6bc499355c0cJean-Michel Triviconst uint32_t kUnsupported = 556895deeecc8797e6f5b28e7d07ec6bc499355c0cJean-Michel Trivi AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER | AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER | 566895deeecc8797e6f5b28e7d07ec6bc499355c0cJean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_CENTER | 576895deeecc8797e6f5b28e7d07ec6bc499355c0cJean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT | 586895deeecc8797e6f5b28e7d07ec6bc499355c0cJean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER | 596895deeecc8797e6f5b28e7d07ec6bc499355c0cJean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT | 606895deeecc8797e6f5b28e7d07ec6bc499355c0cJean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_BACK_LEFT | 616895deeecc8797e6f5b28e7d07ec6bc499355c0cJean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_BACK_CENTER | 626895deeecc8797e6f5b28e7d07ec6bc499355c0cJean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT; 6304c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi 6404c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi/*------------------------------------ 6504c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi * Effect API 6604c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi *------------------------------------ 6704c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi*/ 6804c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Triviint32_t DownmixLib_QueryNumberEffects(uint32_t *pNumEffects); 6904c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Triviint32_t DownmixLib_QueryEffect(uint32_t index, 7004c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi effect_descriptor_t *pDescriptor); 7104c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Triviint32_t DownmixLib_Create(const effect_uuid_t *uuid, 7204c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi int32_t sessionId, 7304c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi int32_t ioId, 7404c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi effect_handle_t *pHandle); 7504c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Triviint32_t DownmixLib_Release(effect_handle_t handle); 7604c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Triviint32_t DownmixLib_GetDescriptor(const effect_uuid_t *uuid, 7704c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi effect_descriptor_t *pDescriptor); 7804c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi 7904c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivistatic int Downmix_Process(effect_handle_t self, 8004c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi audio_buffer_t *inBuffer, 8104c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi audio_buffer_t *outBuffer); 8204c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivistatic int Downmix_Command(effect_handle_t self, 8304c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi uint32_t cmdCode, 8404c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi uint32_t cmdSize, 8504c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi void *pCmdData, 8604c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi uint32_t *replySize, 8704c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi void *pReplyData); 8804c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivistatic int Downmix_GetDescriptor(effect_handle_t self, 8904c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi effect_descriptor_t *pDescriptor); 9004c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi 9104c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi 9204c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi/*------------------------------------ 9304c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi * internal functions 9404c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi *------------------------------------ 9504c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi*/ 9604c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Triviint Downmix_Init(downmix_module_t *pDwmModule); 9704c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Triviint Downmix_Configure(downmix_module_t *pDwmModule, effect_config_t *pConfig, bool init); 9804c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Triviint Downmix_Reset(downmix_object_t *pDownmixer, bool init); 9904c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Triviint Downmix_setParameter(downmix_object_t *pDownmixer, int32_t param, size_t size, void *pValue); 10004c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Triviint Downmix_getParameter(downmix_object_t *pDownmixer, int32_t param, size_t *pSize, void *pValue); 10104c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi 10204c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivivoid Downmix_foldFromQuad(int16_t *pSrc, int16_t*pDst, size_t numFrames, bool accumulate); 10304c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivivoid Downmix_foldFromSurround(int16_t *pSrc, int16_t*pDst, size_t numFrames, bool accumulate); 10404c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivivoid Downmix_foldFrom5Point1(int16_t *pSrc, int16_t*pDst, size_t numFrames, bool accumulate); 10504c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivivoid Downmix_foldFrom7Point1(int16_t *pSrc, int16_t*pDst, size_t numFrames, bool accumulate); 1066895deeecc8797e6f5b28e7d07ec6bc499355c0cJean-Michel Trivibool Downmix_foldGeneric( 1076895deeecc8797e6f5b28e7d07ec6bc499355c0cJean-Michel Trivi uint32_t mask, int16_t *pSrc, int16_t*pDst, size_t numFrames, bool accumulate); 10804c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi 10904c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi#endif /*ANDROID_EFFECTDOWNMIX_H_*/ 110