240 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			240 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef EFFECTRS_SYNC_H
 | ||
| #define EFFECTRS_SYNC_H
 | ||
| 
 | ||
| #include "generic/typedef.h"
 | ||
| #include "generic/list.h"
 | ||
| 
 | ||
| #define WL_PROTOCOL_RTP     0
 | ||
| #define WL_PROTOCOL_SCO     1
 | ||
| #define WL_PROTOCOL_FILE    2
 | ||
| 
 | ||
| #define SYNC_ERR_NONE               0
 | ||
| #define SYNC_ERR_PLAY_REJECTED      1
 | ||
| #define SYNC_ERR_PAUSE              2
 | ||
| #define SYNC_ERR_DISCARD_PKT        3
 | ||
| #define SYNC_ERR_PLAY_PREPARE       4
 | ||
| #define SYNC_ERR_NULL_PKT           5
 | ||
| #define SYNC_ERR_GRAB_AUDIO_STREAM  6
 | ||
| #define SYNC_ERR_DEC_RESET          7
 | ||
| enum {
 | ||
|     SYNC_DAC_CTL = 1,
 | ||
|     SYNC_GET_PCM_TOTAL,
 | ||
|     SYNC_GET_SRC_IN_LEN,
 | ||
|     SYNC_GET_SRC_STATE,
 | ||
|     SYNC_SET_PLAY_O_POINT,
 | ||
|     SYNC_WITE_DAC_MUTE_DATE,
 | ||
|     SET_LOCAL_US_TIME,
 | ||
|     SET_SYNC_RESET,
 | ||
|     SYNC_SWITCH_N_CH,
 | ||
| };
 | ||
| struct audio_packet_buffer {
 | ||
|     u8 	noblock;
 | ||
|     u8  state;
 | ||
|     u16 timeout;
 | ||
|     u32 slot_time;
 | ||
|     u32 len;
 | ||
|     u32 baddr;
 | ||
| };
 | ||
| struct audio_packet_stats {
 | ||
|     u32 total_size;
 | ||
|     u32 data_size;
 | ||
|     u32 remain_size;
 | ||
|     u8 ch;
 | ||
|     u8 grab_audio_stream_info_num;
 | ||
| };
 | ||
| typedef struct _SYNC_POINTER_ {
 | ||
|     volatile int *src_in_len;
 | ||
|     volatile int *set_sr_in;
 | ||
|     volatile int *set_sr_out;
 | ||
|     volatile int *more_less_points;
 | ||
| 
 | ||
|     volatile int *play_point;
 | ||
|     volatile int *fake_n_points;
 | ||
| } CPUSYNC_POINTERS;
 | ||
| 
 | ||
| /*
 | ||
|  * 播放动态src配置,start为配置一次变点
 | ||
|  */
 | ||
| struct audio_pcm_src {
 | ||
|     u8  convert; //启动转换
 | ||
|     u8  resample;//设置为变采样
 | ||
|     u16 ratio_i; //转换输入
 | ||
|     u16 ratio_o; //转换输出
 | ||
| };
 | ||
| 
 | ||
| /*
 | ||
|  * 同步需要的DAC协定启动配置
 | ||
|  */
 | ||
| struct audio_dac_ctl {
 | ||
|     u8  agreement; //
 | ||
|     u8  on; //启动/暂停
 | ||
|     // u8  time_unit; //时间单位(0 - us, 1 - ms, 2 - s)
 | ||
|     u32 pre_time;
 | ||
|     u32 time; //时间点(us)
 | ||
| };
 | ||
| // *INDENT-OFF*
 | ||
| struct sync_ops_t {
 | ||
|     void *(*open)(void);
 | ||
|     void (*set_handler)(void *, void *priv,
 | ||
|                         void (*handler)(void *, int *, int));
 | ||
|     u32 (*time)(u8 type, u32 time,u32 *pre_time);
 | ||
|     int (*send)(void *, void *buf, u32 len);
 | ||
|     int (*master)(u8 type);
 | ||
|     u8  (*online)(u8);
 | ||
|     void (*role_lock)(void *, u8);
 | ||
|     void (*close)(void *);
 | ||
|     void *(*audio_sync_open)(void *empty_priv,void (*empty_handler)(void *, u8),u8 protocol,u16 ch,u16 sr,int (*sync_output)(void *priv, void *data, int len),void*);
 | ||
|     int (*audio_sync_close)(void *sync);
 | ||
|     int (*audio_sync_run)(void *_sync,void *buf, int points_per_channel);
 | ||
|     int (*audio_sync_set_samplerate)(void *sync,int sr_in,int sr_out);
 | ||
| 	int (*audio_sync_control)(void* _priv,int cmd,u32 arg);
 | ||
| };
 | ||
| 
 | ||
| struct audio_sync_parm {
 | ||
|     u8 channel;
 | ||
|     u8 top_percent; //上限比例
 | ||
|     u8 start_percent; //启动比例限值
 | ||
|     u8 bottom_percent; //下限比例
 | ||
|     u8 protocol; //音频包含协议
 | ||
|     u32 buffer_size;
 | ||
| 	u8 sync_time;
 | ||
|     const struct sync_ops_t *ops;
 | ||
| 	void *audio_dev;
 | ||
|     int (*sync_output)(void *priv, void *data, int len);
 | ||
| };
 | ||
| // *INDENT-ON*
 | ||
| 
 | ||
| extern void *audio_decoder_sync_open(struct audio_decoder *dec, struct audio_sync_parm *sync_parm);
 | ||
| extern void audio_decoder_sync_close(void *c);
 | ||
| extern int audio_decodr_sync_start(void *c, struct audio_packet_stats *stats, struct audio_packet_buffer *pkt);
 | ||
| extern int audio_decoder_sync_run(void *c, void *buf, int len);
 | ||
| extern int audio_decoder_sync_do(void *c, s16 *buf, int len);
 | ||
| extern int audio_sync_reset(void *c);
 | ||
| int audio_sync_set_remain_len(void *c, int len);
 | ||
| 
 | ||
| #if (defined CONFIG_CPU_BR26 || \
 | ||
| 	 defined CONFIG_CPU_BR23 || \
 | ||
|      defined CONFIG_CPU_BR25 || \
 | ||
|      defined CONFIG_CPU_BR30 || \
 | ||
|      defined CONFIG_CPU_BR34 || \
 | ||
|      defined CONFIG_CPU_BR28)
 | ||
| /*
 | ||
|  * BR26同步
 | ||
|  */
 | ||
| #define SYNC_ERR_NONE               0
 | ||
| #define SYNC_ERR_DEC_NOT_ALLOWED    1
 | ||
| #define SYNC_ERR_TIMEOUT            2
 | ||
| #define SYNC_ERR_STREAM_PASS        3
 | ||
| #define SYNC_ERR_STREAM_END         4
 | ||
| #define SYNC_ERR_PREPARE            5
 | ||
| #define SYNC_ERR_ALIGNED_AND_PASS   6
 | ||
| #define SYNC_ERR_STREAM_RESET       7
 | ||
| 
 | ||
| /***************** the step mean to get more or less  (sample_rate/step) points/sencond ********************/
 | ||
| #define SRC_DEC_STEP         2     //step to speed down
 | ||
| #define SRC_INC_STEP         2     // step  to speed up
 | ||
| 
 | ||
| #define SRC_POINT_AMPLIPY          5
 | ||
| 
 | ||
| #define AUDIO_SYNC_TARGET_DAC   0
 | ||
| #define AUDIO_SYNC_TARGET_FM    1
 | ||
| #define AUDIO_SYNC_TARGET_IIS   2
 | ||
| 
 | ||
| #define RX_DELAY_NULL           0 //延时未抖动
 | ||
| #define RX_DELAY_UP             1 //延时上浮
 | ||
| #define RX_DELAY_DOWN           2 //延时下浮
 | ||
| 
 | ||
| struct rt_stream_info {
 | ||
|     u8 noblock;
 | ||
|     u8 rx_delay;
 | ||
|     u16 seqn;
 | ||
|     u16 frame_num;
 | ||
|     u32 data_len;
 | ||
|     u32 remain_len;
 | ||
|     void *baddr;
 | ||
|     int len;
 | ||
| };
 | ||
| 
 | ||
| struct remote_stream_info {
 | ||
|     u8 rx_delay; //音频接收数据流延时波动
 | ||
|     u16 seqn;    //音频数据包号信息
 | ||
|     u32 remain_len; //蓝牙接收buffer剩余空间
 | ||
| };
 | ||
| 
 | ||
| // *INDENT-OFF*
 | ||
| struct audio_tws_conn_ops {
 | ||
|     void *(*open)(void);
 | ||
|     void (*set_handler)(void *, void *priv,
 | ||
|                         void (*handler)(void *, int *, int));
 | ||
|     u32 (*time)(u8 type, u32 time, u32 *pre_time);
 | ||
|     int (*send)(void *, void *buf, u32 len);
 | ||
|     int (*master)(u8 type);
 | ||
|     u8  (*online)(u8);
 | ||
|     void (*close)(void *);
 | ||
| };
 | ||
| 
 | ||
| struct audio_wireless_sync_info {
 | ||
|     u8 channel;
 | ||
|     u8 target;  //本地目标设备
 | ||
|     u8 protocol; //音频同步协议类型
 | ||
|     u8 reset_enable; //内部检测异常后返回复位信息的使能
 | ||
|     u16 sample_rate; //解码采样率
 | ||
|     u16 output_rate; //输出采样率
 | ||
|     void *dev;
 | ||
|     void *sample_ch; //同步采样通道
 | ||
|     const struct audio_tws_conn_ops *tws_ops; //TWS相关的调用接口
 | ||
| };
 | ||
| // *INDENT-ON*
 | ||
| 
 | ||
| struct audio_wireless_sync {
 | ||
|     struct audio_stream_entry *entry;
 | ||
|     struct audio_stream_entry *resample_entry;
 | ||
|     void *context;
 | ||
|     void *sample_sync;
 | ||
| };
 | ||
| 
 | ||
| void *audio_wireless_sync_open(struct audio_wireless_sync_info *info, struct audio_stream_entry **entry);
 | ||
| 
 | ||
| int audio_wireless_sync_add_output(void *c, struct audio_wireless_sync_info *info);
 | ||
| 
 | ||
| int audio_wireless_sync_add_dev(void *c, struct audio_wireless_sync_info *info);
 | ||
| 
 | ||
| int audio_wireless_sync_probe(void *c, struct rt_stream_info *info);
 | ||
| 
 | ||
| void audio_wireless_sync_info_init(void *c, u32 sample_rate, u32 output_rate, u8 channel);
 | ||
| 
 | ||
| int audio_sync_set_tws_together(void *c, u8 together, u32 together_time);
 | ||
| 
 | ||
| int audio_wireless_sync_after_dec(void *c, s16 *data, int len);
 | ||
| 
 | ||
| int audio_wireless_sync_get_rate(void *c, u16 *input_rate, u16 *output_rate);
 | ||
| 
 | ||
| int audio_wireless_sync_stop(void *c);
 | ||
| 
 | ||
| int audio_wireless_sync_reset(void *c);
 | ||
| 
 | ||
| int audio_wireless_sync_suspend(void *c);
 | ||
| 
 | ||
| void audio_wireless_sync_close(void *c);
 | ||
| 
 | ||
| int audio_wireless_sync_add_output(void *c, struct audio_wireless_sync_info *info);
 | ||
| 
 | ||
| int audio_wireless_sync_with_stream(void *c, struct remote_stream_info *info);
 | ||
| 
 | ||
| int audio_wireless_sync_drop_samples(void *c, int samples);
 | ||
| 
 | ||
| int audio_wireless_sync_set_tws_time(void *c, int time);
 | ||
| 
 | ||
| int audio_wireless_sync_is_working(void *c);
 | ||
| 
 | ||
| int audio_wireless_sync_sound_reset(void *c, int time);
 | ||
| 
 | ||
| int audio_wireless_sync_sound_fade_in(void *c, u16 time);
 | ||
| #endif
 | ||
| /*
 | ||
| #if (defined CONFIG_CPU_BR26 || \
 | ||
| 	(defined CONFIG_CPU_BR23 || \
 | ||
|      defined CONFIG_CPU_BR25)
 | ||
| */
 | ||
| #endif
 |