141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George/*
241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George * Copyright (C) 2014 The Android Open Source Project
341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George *
441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George * Licensed under the Apache License, Version 2.0 (the "License");
541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George * you may not use this file except in compliance with the License.
641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George * You may obtain a copy of the License at
741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George *
841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George *      http://www.apache.org/licenses/LICENSE-2.0
941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George *
1041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George * Unless required by applicable law or agreed to in writing, software
1141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George * distributed under the License is distributed on an "AS IS" BASIS,
1241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George * See the License for the specific language governing permissions and
1441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George * limitations under the License.
1541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George */
1641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
1741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#ifndef OFFLOAD_EFFECT_BUNDLE_H
1841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#define OFFLOAD_EFFECT_BUNDLE_H
1941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
2041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#include <tinyalsa/asoundlib.h>
2141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#include <sound/audio_effects.h>
2241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#include "effect_api.h"
2341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
2441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George/* Retry for delay for mixer open */
2541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#define RETRY_NUMBER 10
2641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#define RETRY_US 500000
2741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
2841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#define MIXER_CARD 0
2941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#define SOUND_CARD 0
3041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
3141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeextern const struct effect_interface_s effect_interface;
3241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
3341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgetypedef struct output_context_s output_context_t;
3441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgetypedef struct effect_ops_s effect_ops_t;
3541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgetypedef struct effect_context_s effect_context_t;
3641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
3741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgestruct output_context_s {
3841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    /* node in active_outputs_list */
3941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    struct listnode outputs_list_node;
4041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    /* io handle */
4141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    audio_io_handle_t handle;
4241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    /* list of effects attached to this output */
4341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    struct listnode effects_list;
4441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    /* pcm device id */
4541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int pcm_device_id;
4641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    struct mixer *mixer;
4741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    struct mixer_ctl *ctl;
4841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George};
4941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
5041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George/* effect specific operations.
5141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George * Only the init() and process() operations must be defined.
5241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George * Others are optional.
5341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George */
5441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgestruct effect_ops_s {
5541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int (*init)(effect_context_t *context);
5641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int (*release)(effect_context_t *context);
5741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int (*reset)(effect_context_t *context);
5841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int (*enable)(effect_context_t *context);
5941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int (*start)(effect_context_t *context, output_context_t *output);
6041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int (*stop)(effect_context_t *context, output_context_t *output);
6141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int (*disable)(effect_context_t *context);
6241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int (*process)(effect_context_t *context, audio_buffer_t *in, audio_buffer_t *out);
6341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int (*set_parameter)(effect_context_t *context, effect_param_t *param, uint32_t size);
6441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int (*get_parameter)(effect_context_t *context, effect_param_t *param, uint32_t *size);
6541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int (*set_device)(effect_context_t *context, uint32_t device);
6641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int (*command)(effect_context_t *context, uint32_t cmdCode, uint32_t cmdSize,
6741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            void *pCmdData, uint32_t *replySize, void *pReplyData);
6841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George};
6941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
7041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgestruct effect_context_s {
7141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    const struct effect_interface_s *itfe;
7241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    /* node in created_effects_list */
7341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    struct listnode effects_list_node;
7441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    /* node in output_context_t.effects_list */
7541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    struct listnode output_node;
7641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    effect_config_t config;
7741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    const effect_descriptor_t *desc;
7841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    /* io handle of the output the effect is attached to */
7941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    audio_io_handle_t out_handle;
8041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    uint32_t state;
8141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    bool offload_enabled;
8241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    effect_ops_t ops;
8341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George};
8441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
8541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint set_config(effect_context_t *context, effect_config_t *config);
8641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
8741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgebool effect_is_active(effect_context_t *context);
8841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
8941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#endif /* OFFLOAD_EFFECT_BUNDLE_H */
90