pinebuds/services/bt_app/app_bt_stream.h
2022-08-15 17:20:27 +08:00

242 lines
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 __APP_BT_STREAM_H__
#define __APP_BT_STREAM_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "hal_aud.h"
#include "stdint.h"
#define BT_AUDIO_BUFF_AAC_SIZE (1024*2*2*2)
#if defined(__3M_PACK__)
#define BT_AUDIO_BUFF_SBC_SIZE (128*7*2*2*2)
#else
#define BT_AUDIO_BUFF_SBC_44P1K_SIZE (128*5*2*2*2)
#define BT_AUDIO_BUFF_SBC_48K_SIZE (128*6*2*2*2)
#endif
#if defined(A2DP_LDAC_ON)
#define BT_AUDIO_BUFF_SIZE_LDAC (256*4*2*2*2)
#endif
#define BT_AUDIO_CACHE_2_UNCACHE(addr) \
((unsigned char *)((unsigned int)addr & ~(0x04000000)))
// #if BT_AUDIO_BUFF_SIZE < BT_AUDIO_SCO_BUFF_SIZE * 4
// #error BT_AUDIO_BUFF_SIZE must be at least BT_AUDIO_SCO_BUFF_SIZE * 4
// #endif
// low 11 bits are output streams index while high 5 bits are input streams index
// one output stream and one input stream can exit at the same time,
// while two streams with the same direction are mutex
#define APP_BT_STREAM_BORDER_BIT_OFFSET 12
// the index < the border is the output stream
// the index >= the border is the input stream
#define APP_BT_STREAM_BORDER_INDEX (1 << APP_BT_STREAM_BORDER_BIT_OFFSET)
// output streams
#define APP_BT_STREAM_HFP_PCM (1 << 0)
#define APP_BT_STREAM_HFP_CVSD (1 << 1)
#define APP_BT_STREAM_HFP_VENDOR (1 << 2)
#define APP_BT_STREAM_A2DP_SBC (1 << 3)
#define APP_BT_STREAM_A2DP_AAC (1 << 4)
#define APP_BT_STREAM_A2DP_VENDOR (1 << 5)
#ifdef __FACTORY_MODE_SUPPORT__
#define APP_FACTORYMODE_AUDIO_LOOP (1 << 6)
#endif
#define APP_PLAY_BACK_AUDIO (1 << 7)
#ifdef RB_CODEC
#define APP_BT_STREAM_RBCODEC (1 << 8)
#endif
#ifdef AUDIO_LINEIN
#define APP_PLAY_LINEIN_AUDIO (1 << 9)
#endif
#if defined(APP_LINEIN_A2DP_SOURCE)||defined(__APP_A2DP_SOURCE__)||(APP_I2S_A2DP_SOURCE)
#define APP_A2DP_SOURCE_LINEIN_AUDIO (1 << 10)
#define APP_A2DP_SOURCE_I2S_AUDIO (1 << 11)
#endif
// input streams
#ifdef VOICE_DATAPATH
#define APP_BT_STREAM_VOICEPATH (1 << APP_BT_STREAM_BORDER_BIT_OFFSET)
#endif
#ifdef __AI_VOICE__
#define APP_BT_STREAM_AI_VOICE (1 << (APP_BT_STREAM_BORDER_BIT_OFFSET+1))
#endif
#ifdef __THIRDPARTY
#define APP_BT_STREAM_THIRDPARTY_VOICE (1 << (APP_BT_STREAM_BORDER_BIT_OFFSET+2))
#endif
#define APP_BT_STREAM_INVALID 0
#define APP_BT_OUTPUT_STREAM_INDEX(player) ((player) & ((1 << APP_BT_STREAM_BORDER_BIT_OFFSET) - 1))
#define APP_BT_INPUT_STREAM_INDEX(player) ((player) & (~((1 << APP_BT_STREAM_BORDER_BIT_OFFSET) - 1)))
#include <stdint.h>
enum APP_BT_SETTING_T {
APP_BT_SETTING_OPEN = 0,
APP_BT_SETTING_CLOSE,
APP_BT_SETTING_SETUP,
APP_BT_SETTING_RESTART,
APP_BT_SETTING_CLOSEALL,
APP_BT_SETTING_CLOSEMEDIA,
APP_BT_SETTING_NUM,
};
enum APP_BT_AUDIO_Q_POS {
APP_BT_SETTING_Q_POS_HEAD = 0,
APP_BT_SETTING_Q_POS_TAIL = 1,
};
typedef struct {
uint16_t id;
uint16_t status;
uint16_t aud_type;
uint16_t aud_id;
uint8_t freq;
}APP_AUDIO_STATUS;
const char *player2str(uint16_t player_type);
int app_bt_stream_init(void);
int app_bt_stream_open(APP_AUDIO_STATUS* status);
int app_bt_stream_close(uint16_t player);
int app_bt_stream_setup(uint16_t player, uint8_t status);
int app_bt_stream_restart(APP_AUDIO_STATUS* status);
int app_bt_stream_closeall();
bool app_bt_stream_isrun(uint16_t player);
void app_bt_set_volume(uint16_t type,uint8_t level);
void app_bt_stream_volumeup(void);
void app_bt_stream_volumedown(void);
void app_bt_stream_volume_ptr_update(uint8_t *bdAddr);
struct btdevice_volume * app_bt_stream_volume_get_ptr(void);
int app_bt_stream_volumeset(int8_t vol);
uint8_t app_bt_stream_a2dpvolume_get(void);
uint8_t app_bt_stream_hfpvolume_get(void);
void app_bt_stream_a2dpvolume_reset(void);
void app_bt_stream_hfpvolume_reset(void);
void app_bt_stream_copy_track_one_to_two_24bits(int32_t *dst_buf, int32_t *src_buf, uint32_t src_len);
void app_bt_stream_copy_track_one_to_two_16bits(int16_t *dst_buf, int16_t *src_buf, uint32_t src_len);
void app_bt_stream_copy_track_two_to_one_16bits(int16_t *dst_buf, int16_t *src_buf, uint32_t dst_len);
enum AUD_SAMPRATE_T bt_get_sbc_sample_rate(void);
void bt_store_sbc_sample_rate(enum AUD_SAMPRATE_T sample_rate);
enum AUD_SAMPRATE_T bt_parse_store_sbc_sample_rate(uint8_t sbc_samp_rate);
bool app_bt_stream_is_mic_mix_during_music_enabled(void);
void app_bt_sream_set_mix_mic_flag(bool isEnable);
void bt_sbc_mix_mic_init(void);
void bt_sbc_mix_mic_deinit(void);
uint32_t bt_sbc_codec_capture_data(uint8_t *buf, uint32_t len);
void app_audio_buffer_check(void);
// =======================================================
// APP RESAMPLE
// =======================================================
#include "hal_aud.h"
typedef int (*APP_RESAMPLE_BUF_ALLOC_CALLBACK)(uint8_t **buff, uint32_t size);
typedef int (*APP_RESAMPLE_ITER_CALLBACK)(uint8_t *buf, uint32_t len);
struct APP_RESAMPLE_T {
enum AUD_STREAM_T stream;
void *id;
APP_RESAMPLE_ITER_CALLBACK cb;
uint8_t *iter_buf;
uint32_t iter_len;
uint32_t offset;
float ratio_step;
};
struct APP_RESAMPLE_T *app_playback_resample_open(enum AUD_SAMPRATE_T sample_rate, enum AUD_CHANNEL_NUM_T chans,
APP_RESAMPLE_ITER_CALLBACK cb, uint32_t iter_len);
struct APP_RESAMPLE_T *app_playback_resample_any_open(enum AUD_CHANNEL_NUM_T chans,
APP_RESAMPLE_ITER_CALLBACK cb, uint32_t iter_len,
float ratio_step);
struct APP_RESAMPLE_T *app_playback_resample_any_open_with_pre_allocated_buffer(enum AUD_CHANNEL_NUM_T chans,
APP_RESAMPLE_ITER_CALLBACK cb, uint32_t iter_len,
float ratio_step, uint8_t* ptrBuf, uint32_t bufSize);
struct APP_RESAMPLE_T *app_capture_resample_14k7_to_16k(enum AUD_CHANNEL_NUM_T chans,
APP_RESAMPLE_ITER_CALLBACK cb, uint32_t iter_len,
float ratio_step, uint8_t* ptrBuf, uint32_t bufSize);
int app_playback_resample_close(struct APP_RESAMPLE_T *resamp);
int app_playback_resample_run(struct APP_RESAMPLE_T *resamp, uint8_t *buf, uint32_t len);
struct APP_RESAMPLE_T *app_capture_resample_open(enum AUD_SAMPRATE_T sample_rate, enum AUD_CHANNEL_NUM_T chans,
APP_RESAMPLE_ITER_CALLBACK cb, uint32_t iter_len);
struct APP_RESAMPLE_T *app_capture_resample_any_open(enum AUD_CHANNEL_NUM_T chans,
APP_RESAMPLE_ITER_CALLBACK cb, uint32_t iter_len,
float ratio_step);
int app_capture_resample_close(struct APP_RESAMPLE_T *resamp);
int app_capture_resample_run(struct APP_RESAMPLE_T *resamp, uint8_t *buf, uint32_t len);
void app_resample_reset(struct APP_RESAMPLE_T *resamp);
void app_resample_tune(struct APP_RESAMPLE_T *resamp, float ratio);
APP_RESAMPLE_BUF_ALLOC_CALLBACK app_resample_set_buf_alloc_callback(APP_RESAMPLE_BUF_ALLOC_CALLBACK cb);
uint16_t app_bt_stream_ibrt_trigger_seq_diff_calc(int32_t dma_samples, int32_t frame_samples, int32_t sub_seq, int32_t interval);
void app_bt_stream_volumeset_handler(int8_t vol);
#ifdef TX_RX_PCM_MASK
void store_encode_frame2buff();
#endif
#ifdef BONE_SENSOR_TDM
void bt_sco_get_tdm_buffer(uint8_t **buf, uint32_t *len);
#endif
int app_bt_stream_local_volume_get(void);
bool bt_is_playback_triggered(void);
#ifdef __cplusplus
}
#endif
#endif