161e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti/*
261e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti * Copyright (c) 2013, The Linux Foundation. All rights reserved.
361e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti * Not a contribution.
461e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti *
561e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti * Copyright (C) 2013 The Android Open Source Project
661e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti *
761e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti * Licensed under the Apache License, Version 2.0 (the "License");
861e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti * you may not use this file except in compliance with the License.
961e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti * You may obtain a copy of the License at
1061e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti *
1161e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti *      http://www.apache.org/licenses/LICENSE-2.0
1261e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti *
1361e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti * Unless required by applicable law or agreed to in writing, software
1461e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti * distributed under the License is distributed on an "AS IS" BASIS,
1561e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1661e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti * See the License for the specific language governing permissions and
1761e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti * limitations under the License.
1861e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti */
1961e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti
2061e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti#ifndef OFFLOAD_EFFECT_BUNDLE_H
2161e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti#define OFFLOAD_EFFECT_BUNDLE_H
2261e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti
2361e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti#include <tinyalsa/asoundlib.h>
2461e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti#include <sound/audio_effects.h>
2561e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti#include "effect_api.h"
2661e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti
2761e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti/* Retry for delay for mixer open */
2861e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti#define RETRY_NUMBER 10
2961e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti#define RETRY_US 500000
3061e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti
3161e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti#define MIXER_CARD 0
3261e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti#define SOUND_CARD 0
3361e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti
3461e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuletiextern const struct effect_interface_s effect_interface;
3561e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti
3661e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuletitypedef struct output_context_s output_context_t;
3761e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuletitypedef struct effect_ops_s effect_ops_t;
3861e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuletitypedef struct effect_context_s effect_context_t;
3961e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti
4061e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuletistruct output_context_s {
4161e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    /* node in active_outputs_list */
4261e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    struct listnode outputs_list_node;
4361e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    /* io handle */
4461e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    audio_io_handle_t handle;
4561e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    /* list of effects attached to this output */
4661e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    struct listnode effects_list;
4761e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    /* pcm device id */
4861e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    int pcm_device_id;
4961e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    struct mixer *mixer;
5061e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    struct mixer_ctl *ctl;
5161e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti};
5261e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti
5361e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti/* effect specific operations.
5461e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti * Only the init() and process() operations must be defined.
5561e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti * Others are optional.
5661e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti */
5761e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuletistruct effect_ops_s {
5861e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    int (*init)(effect_context_t *context);
5961e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    int (*release)(effect_context_t *context);
6061e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    int (*reset)(effect_context_t *context);
6161e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    int (*enable)(effect_context_t *context);
6261e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    int (*start)(effect_context_t *context, output_context_t *output);
6361e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    int (*stop)(effect_context_t *context, output_context_t *output);
6461e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    int (*disable)(effect_context_t *context);
6561e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    int (*process)(effect_context_t *context, audio_buffer_t *in, audio_buffer_t *out);
6661e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    int (*set_parameter)(effect_context_t *context, effect_param_t *param, uint32_t size);
6761e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    int (*get_parameter)(effect_context_t *context, effect_param_t *param, uint32_t *size);
6861e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    int (*set_device)(effect_context_t *context, uint32_t device);
6961e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    int (*command)(effect_context_t *context, uint32_t cmdCode, uint32_t cmdSize,
7061e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti            void *pCmdData, uint32_t *replySize, void *pReplyData);
7161e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti};
7261e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti
7361e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuletistruct effect_context_s {
7461e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    const struct effect_interface_s *itfe;
7561e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    /* node in created_effects_list */
7661e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    struct listnode effects_list_node;
7761e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    /* node in output_context_t.effects_list */
7861e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    struct listnode output_node;
7961e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    effect_config_t config;
8061e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    const effect_descriptor_t *desc;
8161e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    /* io handle of the output the effect is attached to */
8261e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    audio_io_handle_t out_handle;
8361e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    uint32_t state;
8461e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    bool offload_enabled;
8561e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti    effect_ops_t ops;
8661e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti};
8761e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti
8861e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuletiint set_config(effect_context_t *context, effect_config_t *config);
8961e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti
9061e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuletibool effect_is_active(effect_context_t *context);
9161e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti
9261e21a4fe27118141afc13323807f83b733cf426Uday Kishore Pasupuleti#endif /* OFFLOAD_EFFECT_BUNDLE_H */
93