pinebuds/apps/audioplayers/a2dp_decoder/a2dp_decoder.h

156 lines
5.8 KiB
C

/***************************************************************************
*
* Copyright 2015-2019 BES.
* All rights reserved. All unpublished rights reserved.
*
* No part of this work may be used or reproduced in any form or by any
* means, or stored in a database or retrieval system, without prior written
* permission of BES.
*
* Use of this work is governed by a license granted by BES.
* This work contains confidential and proprietary information of
* BES. which is protected by copyright, trade secret,
* trademark and other intellectual property rights.
*
****************************************************************************/
#ifndef __A2DPPLAY_H__
#define __A2DPPLAY_H__
#include "app_utils.h"
#include "avdtp_api.h"
#define A2DP_DECODER_HISTORY_SEQ_SAVE (25)
//#define A2DP_DECODER_HISTORY_LOCTIME_SAVE (1)
//#define A2DP_DECODER_HISTORY_CHECK_SUM_SAVE (1)
typedef uint16_t A2DP_AUDIO_CODEC_TYPE;
#define A2DP_AUDIO_CODEC_TYPE_SBC (1u<<0)
#define A2DP_AUDIO_CODEC_TYPE_MPEG2_4_AAC (1u<<1)
#define A2DP_AUDIO_CODEC_TYPE_OPUS (1u<<2)
#define A2DP_AUDIO_CODEC_TYPE_SCALABL (1u<<3)
#define A2DP_AUDIO_CODEC_TYPE_LHDC (1u<<4)
#define A2DP_AUDIO_CODEC_TYPE_LDAC (1u<<5)
#define A2DP_AUDIO_SYNCFRAME_MASK_SEQ (1u<<0)
#define A2DP_AUDIO_SYNCFRAME_MASK_TIMESTAMP (1u<<1)
#define A2DP_AUDIO_SYNCFRAME_MASK_CURRSUBSEQ (1u<<2)
#define A2DP_AUDIO_SYNCFRAME_MASK_TOTALSUBSEQ (1u<<3)
#define A2DP_AUDIO_SYNCFRAME_MASK_ALL (A2DP_AUDIO_SYNCFRAME_MASK_SEQ | \
A2DP_AUDIO_SYNCFRAME_MASK_TIMESTAMP | \
A2DP_AUDIO_SYNCFRAME_MASK_CURRSUBSEQ | \
A2DP_AUDIO_SYNCFRAME_MASK_TOTALSUBSEQ)
#define A2DP_AUDIO_SYNCFRAME_CHK(equ, mask_val, mask) (((equ)|!(mask_val&mask)))
typedef enum {
A2DP_AUDIO_LATENCY_STATUS_LOW,
A2DP_AUDIO_LATENCY_STATUS_HIGH,
} A2DP_AUDIO_LATENCY_STATUS_E;
typedef struct {
uint32_t sample_rate;
uint8_t num_channels;
uint8_t bits_depth;
uint8_t curr_bits;
uint32_t frame_samples;
float factor_reference;
} A2DP_AUDIO_OUTPUT_CONFIG_T;
typedef enum {
A2DP_AUDIO_CHANNEL_SELECT_STEREO,
A2DP_AUDIO_CHANNEL_SELECT_LRMERGE,
A2DP_AUDIO_CHANNEL_SELECT_LCHNL,
A2DP_AUDIO_CHANNEL_SELECT_RCHNL,
} A2DP_AUDIO_CHANNEL_SELECT_E;
typedef struct {
uint16_t sequenceNumber;
uint32_t timestamp;
uint16_t curSubSequenceNumber;
uint16_t totalSubSequenceNumber;
uint32_t frame_samples;
uint32_t list_samples;
uint32_t decoded_frames;
uint32_t undecode_frames;
uint32_t undecode_min_frames;
uint32_t undecode_max_frames;
uint32_t average_frames;
uint32_t check_sum;
A2DP_AUDIO_OUTPUT_CONFIG_T stream_info;
} A2DP_AUDIO_LASTFRAME_INFO_T;
typedef struct {
uint16_t sequenceNumber;
uint32_t timestamp;
uint16_t curSubSequenceNumber;
uint16_t totalSubSequenceNumber;
} A2DP_AUDIO_HEADFRAME_INFO_T;
typedef struct{
float proportiongain;
float integralgain;
float derivativegain;
float error[3];
float result;
}A2DP_AUDIO_SYNC_PID_T;
typedef A2DP_AUDIO_LASTFRAME_INFO_T A2DP_AUDIO_SYNCFRAME_INFO_T;
typedef int(*A2DP_AUDIO_DETECT_NEXT_PACKET_CALLBACK)(btif_media_header_t *, unsigned char *, unsigned int len);
#ifdef __cplusplus
extern "C" {
#endif
uint32_t a2dp_audio_playback_handler(uint8_t *buffer, uint32_t buffer_bytes);
float a2dp_audio_sync_pid_calc(A2DP_AUDIO_SYNC_PID_T *pid, float diff);
int a2dp_audio_sync_init(double ratio);
int a2dp_audio_sync_reset_data(void);
int a2dp_audio_sync_tune_sample_rate(double ratio);
int a2dp_audio_sync_direct_tune_sample_rate(double ratio);
int a2dp_audio_sync_tune_cancel(void);
int a2dp_audio_sysfreq_boost_start(uint32_t boost_cnt);
int a2dp_audio_sysfreq_boost_running(void);
int a2dp_audio_init(uint32_t sysfreq, A2DP_AUDIO_CODEC_TYPE codec_type, A2DP_AUDIO_OUTPUT_CONFIG_T *config,
A2DP_AUDIO_CHANNEL_SELECT_E chnl_sel, uint16_t dest_packet_mut);
int a2dp_audio_deinit(void);
int a2dp_audio_start(void);
int a2dp_audio_stop(void);
int a2dp_audio_detect_next_packet_callback_register(A2DP_AUDIO_DETECT_NEXT_PACKET_CALLBACK callback);
int a2dp_audio_detect_store_packet_callback_register(A2DP_AUDIO_DETECT_NEXT_PACKET_CALLBACK callback);
int a2dp_audio_detect_first_packet(void);
int a2dp_audio_detect_first_packet_clear(void);
int a2dp_audio_store_packet(btif_media_header_t * header, unsigned char *buf, unsigned int len);
int a2dp_audio_discards_packet(uint32_t packets);
int a2dp_audio_synchronize_dest_packet_mut(uint32_t mtu);
int a2dp_audio_discards_samples(uint32_t samples);
int a2dp_audio_convert_list_to_samples(uint32_t *samples);
int a2dp_audio_synchronize_packet(A2DP_AUDIO_SYNCFRAME_INFO_T *sync_info, uint32_t mask);
int a2dp_audio_decoder_headframe_info_get(A2DP_AUDIO_HEADFRAME_INFO_T *headframe_info);
int a2dp_audio_get_packet_samples(void);
int a2dp_audio_lastframe_info_get(A2DP_AUDIO_LASTFRAME_INFO_T *lastframe_info);
int a2dp_audio_lastframe_info_reset_undecodeframe(void);
void a2dp_audio_clear_input_raw_packet_list(void);
int a2dp_audio_refill_packet(void);
bool a2dp_audio_auto_synchronize_support(void);
A2DP_AUDIO_OUTPUT_CONFIG_T *a2dp_audio_get_output_config(void);
int a2dp_audio_latency_factor_setlow(void);
int a2dp_audio_latency_factor_sethigh(void);
float a2dp_audio_latency_factor_get(void);
int a2dp_audio_latency_factor_set(float factor);
int a2dp_audio_frame_delay_get(void);
int a2dp_audio_dest_packet_mut_get(void);
int a2dp_audio_latency_factor_status_get(A2DP_AUDIO_LATENCY_STATUS_E *latency_status, float *more_latency_factor);
#if A2DP_DECODER_HISTORY_SEQ_SAVE
int a2dp_audio_show_history_seq(void);
#endif
int a2dp_audio_set_channel_select(A2DP_AUDIO_CHANNEL_SELECT_E chnl_sel);
#ifdef __cplusplus
}
#endif
#endif//__A2DPPLAY_H__