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_Create(const effect_uuid_t *uuid, 6904c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi int32_t sessionId, 7004c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi int32_t ioId, 7104c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi effect_handle_t *pHandle); 7204c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Triviint32_t DownmixLib_Release(effect_handle_t handle); 7304c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Triviint32_t DownmixLib_GetDescriptor(const effect_uuid_t *uuid, 7404c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi effect_descriptor_t *pDescriptor); 7504c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi 7604c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivistatic int Downmix_Process(effect_handle_t self, 7704c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi audio_buffer_t *inBuffer, 7804c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi audio_buffer_t *outBuffer); 7904c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivistatic int Downmix_Command(effect_handle_t self, 8004c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi uint32_t cmdCode, 8104c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi uint32_t cmdSize, 8204c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi void *pCmdData, 8304c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi uint32_t *replySize, 8404c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi void *pReplyData); 8504c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivistatic int Downmix_GetDescriptor(effect_handle_t self, 8604c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi effect_descriptor_t *pDescriptor); 8704c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi 8804c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi 8904c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi/*------------------------------------ 9004c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi * internal functions 9104c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi *------------------------------------ 9204c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi*/ 9304c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Triviint Downmix_Init(downmix_module_t *pDwmModule); 9404c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Triviint Downmix_Configure(downmix_module_t *pDwmModule, effect_config_t *pConfig, bool init); 9504c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Triviint Downmix_Reset(downmix_object_t *pDownmixer, bool init); 96b302bd5d288be2d3363b80053ca2392560b00b25Ashok Bhatint Downmix_setParameter(downmix_object_t *pDownmixer, int32_t param, uint32_t size, void *pValue); 97b302bd5d288be2d3363b80053ca2392560b00b25Ashok Bhatint Downmix_getParameter(downmix_object_t *pDownmixer, int32_t param, uint32_t *pSize, void *pValue); 9804c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi 9904c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivivoid Downmix_foldFromQuad(int16_t *pSrc, int16_t*pDst, size_t numFrames, bool accumulate); 10004c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivivoid Downmix_foldFrom5Point1(int16_t *pSrc, int16_t*pDst, size_t numFrames, bool accumulate); 10104c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivivoid Downmix_foldFrom7Point1(int16_t *pSrc, int16_t*pDst, size_t numFrames, bool accumulate); 1026895deeecc8797e6f5b28e7d07ec6bc499355c0cJean-Michel Trivibool Downmix_foldGeneric( 1036895deeecc8797e6f5b28e7d07ec6bc499355c0cJean-Michel Trivi uint32_t mask, int16_t *pSrc, int16_t*pDst, size_t numFrames, bool accumulate); 10404c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi 10504c1e531b5913c09aa9b2e59e2b8ed9b4d8a4cbaJean-Michel Trivi#endif /*ANDROID_EFFECTDOWNMIX_H_*/ 106