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