pinebuds/apps/audioplayers/a2dp_decoder/a2dp_decoder_internal.h
2022-08-15 17:20:27 +08:00

201 lines
7.5 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 __A2DP_DECODER_INTERNAL_H__
#define __A2DP_DECODER_INTERNAL_H__
#include "list.h"
#include "a2dp_decoder.h"
#ifdef A2DP_CP_ACCEL
#include "a2dp_decoder_cp.h"
#include "hal_location.h"
#endif
#include "a2dp_decoder_trace.h"
#define TEXT_A2DP_LOC_A(n, l) __attribute__((section(#n "." #l)))
#define TEXT_A2DP_LOC(n, l) TEXT_A2DP_LOC_A(n, l)
#define TEXT_SBC_LOC TEXT_A2DP_LOC(.overlay_a2dp_sbc, __LINE__)
#define TEXT_AAC_LOC TEXT_A2DP_LOC(.overlay_a2dp_aac, __LINE__)
#define TEXT_SSC_LOC TEXT_A2DP_LOC(.overlay_a2dp_ssc, __LINE__)
#define TEXT_LDAC_LOC TEXT_A2DP_LOC(.overlay_a2dp_ldac, __LINE__)
#define TEXT_LHDC_LOC TEXT_A2DP_LOC(.overlay_a2dp_lhdc, __LINE__)
#define A2DP_DECODER_NO_ERROR (0)
#define A2DP_DECODER_DECODE_ERROR (-1)
#define A2DP_DECODER_BUSY_ERROR (-2)
#define A2DP_DECODER_MEMORY_ERROR (-3)
#define A2DP_DECODER_MTU_LIMTER_ERROR (-4)
#define A2DP_DECODER_CACHE_UNDERFLOW_ERROR (-5)
#define A2DP_DECODER_SYNC_ERROR (-6)
#define A2DP_DECODER_NOT_SUPPORT (-128)
#ifdef MIN
#undef MIN
#endif
#define MIN(a,b) ((a)<(b) ? (a):(b))
#ifdef MAX
#undef MAX
#endif
#define MAX(a,b) ((a)>(b) ? (a):(b))
typedef A2DP_AUDIO_OUTPUT_CONFIG_T AUDIO_DECODER_STREAM_INFO_T;
typedef int (*AUDIO_DECODER_INIT)(A2DP_AUDIO_OUTPUT_CONFIG_T *, void *);
typedef int (*AUDIO_DECODER_DEINIT)(void);
typedef int (*AUDIO_DECODER_DECODE_FRAME)(uint8_t *, uint32_t);
typedef int (*AUDIO_DECODER_PREPARSE_PACKET)(btif_media_header_t *, uint8_t *, uint32_t);
typedef int (*AUDIO_DECODER_STORE_PACKET)(btif_media_header_t *, uint8_t *, uint32_t);
typedef int (*AUDIO_DECODER_DISCARDS_PACKET)(uint32_t);
typedef int (*AUDIO_DECODER_SYNCHRONIZE_PACKET)(A2DP_AUDIO_SYNCFRAME_INFO_T *, uint32_t);
typedef int (*AUDIO_DECODER_SYNCHRONIZE_DEST_PACKET_MUT)(uint16_t);
typedef int (*AUDIO_DECODER_HEADFRAME_INFO_GET)(A2DP_AUDIO_HEADFRAME_INFO_T*);
typedef int (*AUDIO_DECODER_INFO_GET)(void *);
typedef void(*AUDIO_DECODER_PACKET_FREE)(void *);
typedef int (*AUDIO_DECODER_SYNCHRONIZE_CONVERT_LIST_TO_SAMPLES)(uint32_t *);
typedef int (*AUDIO_DECODER_SYNCHRONIZE_DISCARDS_SAMPLES)(uint32_t);
typedef int (*AUDIO_DECODER_CHANNEL_SELECT)(A2DP_AUDIO_CHANNEL_SELECT_E);
typedef struct {
AUDIO_DECODER_STREAM_INFO_T stream_info;
uint32_t auto_synchronize_support;
AUDIO_DECODER_INIT audio_decoder_init;
AUDIO_DECODER_DEINIT audio_decoder_deinit;
AUDIO_DECODER_DECODE_FRAME audio_decoder_decode_frame;
AUDIO_DECODER_PREPARSE_PACKET audio_decoder_preparse_packet;
AUDIO_DECODER_STORE_PACKET audio_decoder_store_packet;
AUDIO_DECODER_DISCARDS_PACKET audio_decoder_discards_packet;
AUDIO_DECODER_SYNCHRONIZE_PACKET audio_decoder_synchronize_packet;
AUDIO_DECODER_SYNCHRONIZE_DEST_PACKET_MUT audio_decoder_synchronize_dest_packet_mut;
AUDIO_DECODER_SYNCHRONIZE_CONVERT_LIST_TO_SAMPLES a2dp_audio_convert_list_to_samples;
AUDIO_DECODER_SYNCHRONIZE_DISCARDS_SAMPLES a2dp_audio_discards_samples;
AUDIO_DECODER_HEADFRAME_INFO_GET audio_decoder_headframe_info_get;
AUDIO_DECODER_INFO_GET audio_decoder_info_get;
AUDIO_DECODER_PACKET_FREE audio_decoder_packet_free;
AUDIO_DECODER_CHANNEL_SELECT audio_decoder_channel_select;
} A2DP_AUDIO_DECODER_T;
typedef struct {
list_t *input_raw_packet_list;
list_t *output_pcm_packet_list;
} A2DP_AUDIO_DATAPATH_T;
typedef struct {
bool enalbe;
void *semaphore;
} AUDIO_BUFFER_SEMAPHORE_T;
enum A2DP_AUDIO_DECODER_STATUS {
A2DP_AUDIO_DECODER_STATUS_NULL,
A2DP_AUDIO_DECODER_STATUS_READY,
A2DP_AUDIO_DECODER_STATUS_START,
A2DP_AUDIO_DECODER_STATUS_STOP
};
enum A2DP_AUDIO_DECODER_STORE_PACKET_STATUS {
A2DP_AUDIO_DECODER_STORE_PACKET_STATUS_IDLE,
A2DP_AUDIO_DECODER_STORE_PACKET_STATUS_BUSY,
};
enum A2DP_AUDIO_DECODER_PLAYBACK_STATUS {
A2DP_AUDIO_DECODER_PLAYBACK_STATUS_IDLE,
A2DP_AUDIO_DECODER_PLAYBACK_STATUS_BUSY,
};
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 check_sum;
A2DP_AUDIO_OUTPUT_CONFIG_T stream_info;
} A2DP_AUDIO_DECODER_LASTFRAME_INFO_T;
typedef struct {
A2DP_AUDIO_SYNC_PID_T pid;
uint32_t tick;
uint32_t cnt;
} A2DP_AUDIO_SYNC_T;
typedef struct {
A2DP_AUDIO_OUTPUT_CONFIG_T output_cfg;
float init_factor_reference;
A2DP_AUDIO_CHANNEL_SELECT_E chnl_sel;
uint16_t dest_packet_mut;
float average_packet_mut;
A2DP_AUDIO_DECODER_T audio_decoder;
A2DP_AUDIO_DATAPATH_T audio_datapath;
list_t *input_raw_packet_list;
list_t *output_pcm_packet_list;
bool need_detect_first_packet;
bool underflow_onporcess;
uint32_t skip_frame_cnt_after_no_cache;
uint32_t mute_frame_cnt_after_no_cache;
AUDIO_BUFFER_SEMAPHORE_T audio_semaphore;
void *audio_buffer_mutex;
void *audio_status_mutex;
void *audio_stop_mutex;
enum A2DP_AUDIO_DECODER_STATUS audio_decoder_status;
enum A2DP_AUDIO_DECODER_STORE_PACKET_STATUS store_packet_status;
enum A2DP_AUDIO_DECODER_PLAYBACK_STATUS playback_status;
A2DP_AUDIO_SYNC_T audio_sync;
#if A2DP_DECODER_HISTORY_SEQ_SAVE
uint16_t historySeq[A2DP_DECODER_HISTORY_SEQ_SAVE];
#ifdef A2DP_DECODER_HISTORY_LOCTIME_SAVE
uint32_t historyLoctime[A2DP_DECODER_HISTORY_SEQ_SAVE];
#endif
#ifdef A2DP_DECODER_HISTORY_CHECK_SUM_SAVE
uint32_t historyChecksum[A2DP_DECODER_HISTORY_SEQ_SAVE];
#endif
uint8_t historySeq_idx;
#endif
} A2DP_AUDIO_CONTEXT_T;
#ifdef __cplusplus
extern "C" {
#endif
void *a2dp_audio_heap_malloc(uint32_t size);
void *a2dp_audio_heap_cmalloc(uint32_t size);
void *a2dp_audio_heap_realloc(void *rmem, uint32_t newsize);
void a2dp_audio_heap_free(void *rmem);
list_node_t *a2dp_audio_list_begin(const list_t *list);
list_node_t *a2dp_audio_list_end(const list_t *list);
uint32_t a2dp_audio_list_length(const list_t *list);
void *a2dp_audio_list_node(const list_node_t *node);
list_node_t *a2dp_audio_list_next(const list_node_t *node);
bool a2dp_audio_list_remove(list_t *list, void *data);
bool a2dp_audio_list_append(list_t *list, void *data);
void a2dp_audio_list_clear(list_t *list);
void a2dp_audio_list_free(list_t *list);
list_t *a2dp_audio_list_new(list_free_cb callback, list_mempool_zmalloc zmalloc, list_mempool_free free);
int a2dp_audio_semaphore_wait(uint32_t timeout_ms);
int a2dp_audio_semaphore_release(void);
int a2dp_audio_decoder_internal_lastframe_info_set(A2DP_AUDIO_DECODER_LASTFRAME_INFO_T *lastframe_info);
uint32_t a2dp_audio_get_passed(uint32_t curr_ticks, uint32_t prev_ticks, uint32_t max_ticks);
uint32_t a2dp_audio_decoder_internal_check_sum_generate(const uint8_t *buf, uint32_t len);
#ifdef __cplusplus
}
#endif
#endif//__A2DPPLAY_H__