Files
2026-08-24 10:03:24 +08:00

192 lines
5.6 KiB
C

/*
* Copyright (C) 2017 Amlogic Corporation.
*
* 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 DEVICE_PATCH_H_
#define DEVICE_PATCH_H_
#include <sys/types.h>
#include <system/audio.h>
#include <pthread.h>
#include "aml_ringbuffer.h"
#include "component_picture_mode.h"
#include "aml_audio_resampler.h"
#include "aml_audio_heaacparser.h"
#include "dtv_patch_utils.h"
#include "dtv_patch.h"
#include "dtv_patch_hal_avsync.h"
typedef void (*dtv_avsync_process_cb)(struct audio_stream_out *stream, size_t bytes, audio_format_t output_format);
enum patch_route_e {
/*source is device, sink is device*/
PATCH_ROUTE_DEV_DEV = 0,
/*source is mix, sink is device*/
PATCH_ROUTE_MIX_DEV = 1,
/*source is dev, sink is mix*/
PATCH_ROUTE_DEV_MIX = 2,
/*source is mix, sink is mix*/
PATCH_ROUTE_MIX_MIX = 3,
};
enum patch_type_e
{
PATCH_TYPE_TV = 1,
PATCH_TYPE_DTV = 1 << 1,
PATCH_TYPE_ALL = 1 << 2,
PATCH_TYPE_INVAL = 1 << 3,
};
/**\brief Audio output mode*/
typedef enum
{
AM_AOUT_OUTPUT_STEREO, /**< Stereo output*/
AM_AOUT_OUTPUT_DUAL_LEFT, /**< Left audio output to dual channel*/
AM_AOUT_OUTPUT_DUAL_RIGHT, /**< Right audio output to dual channel*/
AM_AOUT_OUTPUT_SWAP, /**< Swap left and right channel*/
AM_AOUT_OUTPUT_LRMIX, /**< mix left and right channel*/
AM_AOUT_OUTPUT_JOINT_STEREO /**< JOINT output*/
} AM_AOUT_OutputMode_t;
/* all latency in unit 'ms' */
struct audio_patch_latency_detail
{
unsigned int ringbuffer_latency;
unsigned int smringbuffer_latency;
unsigned int user_tune_latency;
unsigned int alsa_in_latency;
unsigned int alsa_i2s_out_latency;
unsigned int alsa_spdif_out_latency;
unsigned int ms12_latency;
unsigned int submix_in_latency;
unsigned int total_latency;
};
struct tv_stream_param {
hdmiin_audio_packet_t audio_packet_type;
hdmiin_audio_packet_t last_audio_packet_type;
int read_mul_factor;
bool patch_input_thread_exit;
};
struct aml_audio_patch
{
struct aml_audio_device *dev;
enum patch_source patch_src;
ring_buffer_t aml_ringbuffer;
int decoder_id;
dtv_path_t dtv_path[DVB_DEMUX_SUPPORT_MAX_NUM];
pthread_t audio_input_threadID;
pthread_t audio_output_threadID;
pthread_t audio_signal_detect_threadID;
int signal_detect_thread_exit;
pthread_t audio_parse_threadID;
void *audio_parse_para;
pthread_mutex_t mutex;
pthread_cond_t cond;
bool av_audio_only;
struct timespec patch_start_ts;
//for input
audio_devices_t input_device;
audio_input_config_t input_config;
audio_input_type_e input_type;
int input_open_counter;
struct tv_stream_param tv_param;
void *in_buf;
size_t in_buf_size;
int input_thread_exit;
audio_channel_mask_t in_chanmask;
int in_sample_rate;//For HDMI source: If hw resample is turned on, this value is 48000; if not, this value is the sample rate obtained from HDMI input
audio_format_t in_format; //used for input read, only AUDIO_FORMAT_PCM_16_BIT or AUDIO_FORMAT_PCM_32_BIT
int in_channel_count;
void *input_tmp_buffer;
size_t input_tmp_buffer_size;
int in_read_frame_size;
bool arc_layout_b;
bool last_layout_b;
int spdif_fmt_hw; /* HW parser audio format */
int last_parser_type;
//for input status monitor
bool mute_flag;
int mute_log_cntr;
int mute_mdelay;
struct timespec mute_start_ts;
//for input data continuous check
int sync_offset;
int read_size;
struct timespec start_ts;
int mdelay;
bool start_mute;
bool digital_input_fmt_change;
//for output
void *out_buf;
size_t out_buf_size;
int output_thread_exit;
audio_devices_t output_device;
audio_channel_mask_t out_chanmask;
int out_channel_count;
int out_sample_rate;
audio_format_t out_format;
struct audio_stream_out *stream_out;
audio_format_t aformat; //current output audio format
/* user setting picture mode */
bool is_game_mode;
picture_mode_t pic_mode;
bool IEC61937_format;
bool mode_reconfig_flag;
/* user setting picture mode end */
/* for hdmirx->earc multich passthrough */
bool hdmi_earc_passthrough_mode;//mch earc passthrough
int hdmi_sample_rate;//pcm input sample rate before hw resample
/* for AVSYNC tuning */
int vltcy;
int altcy;
int average_vltcy;
int average_altcy;
int avsync_sample_accumulated;
int max_video_latency;
int min_video_latency;
bool need_do_avsync;
bool input_signal_stable;
bool is_avsync_start;
bool skip_frames;
int timeout_avsync_cnt;
struct audio_patch_latency_detail audio_latency;
/* end of AVSYNC tuning */
/*for dtv play parameters */
unsigned char dtv_NchOriginal;
unsigned char dtv_lfepresent;
/*end dtv play*/
// correspond to audio_patch:: audio_patch_handle_t id;
// patch unique ID
};
void create_tvin_buffer(struct aml_audio_patch *patch);
void release_tvin_buffer(struct aml_audio_patch *patch);
void adev_audio_patches_dump(struct aml_audio_device *aml_dev, int fd);
#endif