blob: 46635779394f98119f31af0913ca4a991155eea3 [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef AUDIO_PROXY_H
#define AUDIO_PROXY_H
#include <system/audio.h>
#include <hardware/hardware.h>
#include <hardware/audio.h>
#include <hardware/audio_alsaops.h>
#include <audio_utils/resampler.h>
#include "alsa_device_profile.h"
#include "alsa_device_proxy.h"
#include "alsa_logging.h"
#include "audio_streams.h"
#include "audio_usages.h"
#include "audio_devices.h"
#include "audio_offload.h"
#include "audio_pcm.h"
#include "audio_mixer.h"
#include "audio_abox.h"
#include "audio_streamconfig.h"
#include "audio_board_info.h"
/* Data Structure for Audio Proxy */
struct audio_proxy_stream
{
audio_stream_type stream_type;
audio_usage stream_usage;
// Real configuration for PCM/Compress Device
int sound_card;
int sound_device;
/* DMA pcm handle is required for triggering Virtual node use-case */
struct pcm *dma_pcm;
/* Can be actual DMA handle or virtual pcm depends upon scenario */
struct pcm *pcm;
struct pcm_config pcmconfig;
// Offload Specific
struct compress *compress;
struct compr_config comprconfig;
int nonblock_flag;
int ready_new_metadata;
struct compr_gapless_mdata offload_metadata;
// USB Specific
alsa_device_profile *usb_profile;
alsa_device_proxy *usb_proxy;
// Common
unsigned int requested_sample_rate;
audio_channel_mask_t requested_channel_mask;
audio_format_t requested_format;
float vol_left, vol_right;
uint64_t frames; /* total frames written, not cleared when entering standby */
// Channel Conversion & Resample for Recording
bool need_channelconversion;
bool need_resampling;
int16_t* actual_read_buf;
int actual_read_status;
size_t actual_read_buf_size;
size_t read_buf_frames;
void * proc_buf_out;
int proc_buf_size;
// Resampler
struct resampler_itfe * resampler;
struct resampler_buffer_provider buf_provider;
#ifdef SUPPORT_STHAL_INTERFACE
int soundtrigger_handle;
#ifdef SEAMLESS_DUMP
FILE *fp;
#endif
#endif
bool need_update_pcm_config;
bool skip_ch_convert;
bool need_channelpadding;
};
struct audio_proxy
{
// Audio Path Routing
struct mixer *mixer;
struct audio_route *aroute;
char *xml_path;
// Mixer Update Thread
pthread_rwlock_t mixer_update_lock;
pthread_t mixer_update_thread;
audio_usage active_playback_ausage;
device_type active_playback_device;
modifier_type active_playback_modifier;
audio_usage active_capture_ausage;
device_type active_capture_device;
modifier_type active_capture_modifier;
// Primary Output Stream Proxy
struct audio_proxy_stream *primary_out;
/* Device Configuration */
int num_earpiece;
int num_speaker;
int num_proximity;
/* BuiltIn MIC Characteristics Map */
int num_mic;
struct audio_microphone_characteristic_t mic_info[AUDIO_MICROPHONE_MAX_COUNT];
// PCM Devices for Audio Path(Loopback / ERAP)
bool support_out_loopback;
struct pcm *out_loopback;
struct pcm *erap_in;
/* Speaker AMP Configuration */
bool support_spkamp;
struct pcm *spkamp_reference;
struct pcm *spkamp_playback;
/* Bluetooth Configuration */
bool bt_internal;
bool bt_external;
#ifdef SUPPORT_BTA2DP_OFFLOAD
pthread_mutex_t a2dp_lock;
bool support_bta2dp;
bool a2dp_out_enabled;
bool a2dp_suspend;
uint32_t a2dp_delay;
uint32_t a2dp_default_delay;
struct pcm *bta2dp_playback;
struct pcm *bta2dp_out_loopback;
struct pcm *a2dp_mute_playback;
#endif
bool support_btsco;
struct pcm *btsco_playback;
/* FM Radio Configuration */
bool fm_internal;
bool fm_external;
struct pcm *fm_playback; // FM PCM Playback from A-Box
struct pcm *fm_capture; // FM PCM Capture to A-Box
/* USB Configuration */
bool usb_by_primary;
bool is_usb_single_clksrc; // USB device clock source info
void *usb_aproxy;
// PCM Devices for USB Audio
bool support_usb_out_loopback;
struct pcm *usb_out_loopback;
bool support_usb_in_loopback;
struct pcm *usb_in_loopback;
/* PCM Devices for Voice Call */
struct pcm *call_rx; // CP to Output Devices
struct pcm *call_tx; // Input Devices to CP
struct pcm *call_tx_direct; // Direct routing for Input Devices
// Call State
bool call_state;
/* Audio Mode */
int audio_mode;
bool skip_internalpath; // flag to skip internal pcm close/re-open
// Voice WakeUp
#ifdef SUPPORT_STHAL_INTERFACE
/* SoundTrigger library interface */
void *sound_trigger_lib;
int (*sound_trigger_open_for_streaming)();
size_t (*sound_trigger_read_samples)(int, void*, size_t);
int (*sound_trigger_close_for_streaming)(int);
int (*sound_trigger_open_recording)();
size_t (*sound_trigger_read_recording_samples)(void*, size_t);
int (*sound_trigger_close_recording)();
int (*sound_trigger_headset_status)(int);
int (*sound_trigger_voicecall_status)(int);
int sthal_state;
#endif
void *offload_effect_lib;
void (*offload_effect_lib_update)(struct mixer *, int);
bool support_dualspk; //Dual Speaker
bool spk_ampL_powerOn; //Dual Speaker
};
#define MIXER_UPDATE_TIMEOUT 5 // 5 seconds
#define STR(s) #s
#define XSTR(s) STR(s)
#ifdef SUPPORT_STHAL_INTERFACE
#define SOUND_TRIGGER_HAL_LIBRARY_PATH "sound_trigger.primary.%s.so"
#endif
#ifndef ENABLE_SPKAMP_PLAYBACK
#define ENABLE_SPKAMP_PLAYBACK false
#endif
#endif /* AUDIO_PROXY_H */