Files
AC707N/SDK/interface/media/audio_decoder.h
T
2025-12-03 11:12:34 +08:00

329 lines
9.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef AUDIO_DECODER_H
#define AUDIO_DECODER_H
#include "generic/typedef.h"
#include "generic/list.h"
#include "media/audio_base.h"
#include "os/os_api.h"
#include "media_memory.h"
enum {
AUDIO_DEC_EVENT_CURR_TIME = 0x20,
AUDIO_DEC_EVENT_END,
AUDIO_DEC_EVENT_ERR,
AUDIO_DEC_EVENT_SUSPEND,
AUDIO_DEC_EVENT_RESUME,
AUDIO_DEC_EVENT_START,
};
enum {
AUDIO_PLAY_EVENT_CURR_TIME = 0x20,
AUDIO_PLAY_EVENT_END,
AUDIO_PLAY_EVENT_ERR,
AUDIO_PLAY_EVENT_SUSPEND,
AUDIO_PLAY_EVENT_RESUME,
};
enum {
AUDIO_RES_GET,
AUDIO_RES_PUT,
};
enum {
DEC_STA_TRY_START,
DEC_STA_START,
DEC_STA_WAIT_STOP,
DEC_STA_WAIT_SUSPEND,
DEC_STA_WAIT_RESUME,
DEC_STA_WAIT_PAUSE,
};
enum {
AUDIO_IOCTRL_CMD_SET_BREAKPOINT_A = 0x08, // 设置复读A点
AUDIO_IOCTRL_CMD_SET_BREAKPOINT_B, // 设置复读B点
AUDIO_IOCTRL_CMD_SET_BREAKPOINT_MODE, // 设置AB点复读模式
AUDIO_IOCTRL_CMD_REPEAT_PLAY = 0x90, // 设置循环播放
AUDIO_IOCTRL_CMD_SET_DEST_PLAYPOS = 0x93, // 设置指定位置播放
AUDIO_IOCTRL_CMD_GET_PLAYPOS = 0x94, // 获取毫秒级时间
//固件自定义命令(非解码器命令)
AUDIO_IOCTRL_CMD_START_SILENCT_DROP = 0x1000,//开头静音数据丢弃处理
};
/*
* 指定位置播放
* 设置后跳到start_time开始播放,
* 播放到dest_time后如果callback_func存在,则调用callback_func
* 可以在callback_func回调中实现对应需要的动作
*/
struct audio_dest_time_play_param {
u32 start_time; // 要跳转过去播放的起始时间。单位:ms
u32 dest_time; // 要跳转过去播放的目标时间。单位:ms
u32(*callback_func)(void *priv); // 到达目标时间后回调
void *callback_priv; // 回调参数
};
/*
* ab点复读模式结构体
*/
struct audio_ab_repeat_mode_param {
u32 value;
};
struct fixphase_repair_obj {
short fifo_buf[18 + 12][32][2];
};
struct audio_repeat_mode_param {
int flag;
int headcut_frame;
int tailcut_frame;
int (*repeat_callback)(void *);
void *callback_priv;
struct fixphase_repair_obj *repair_buf;
};
struct audio_res_wait {
struct list_head entry;
u8 priority;
u8 preemption : 1;
u8 protect : 1;
u8 only_del : 1; // 仅删除
u8 snatch_same_prio : 1; // 优先级相同也抢断
u32 format;
int (*handler)(struct audio_res_wait *, int event);
};
struct audio_decoder_task {
struct list_head head;
struct list_head wait;
const char *name;
int wakeup_timer;
int fmt_lock;
OS_SEM sem;
};
struct audio_dec_breakpoint {
int len;
u32 fptr;
int data_len;
u8 data[0];
// u8 data[128];
};
struct audio_decoder;
struct audio_dec_input {
u32 coding_type;
// 定义在p_more_coding_type数组中的解码器会依照顺序依次检测
// 先检测coding_type再检测p_more_coding_type
u32 *p_more_coding_type;
u32 data_type : 8;
union {
struct {
int (*fread)(struct audio_decoder *, void *buf, u32 len);
int (*fseek)(struct audio_decoder *, u32 offset, int seek_mode);
int (*ftell)(struct audio_decoder *);
int (*flen)(struct audio_decoder *);
} file;
struct {
int (*fget)(struct audio_decoder *, u8 **frame);
void (*fput)(struct audio_decoder *, u8 *frame);
int (*ffetch)(struct audio_decoder *, u8 **frame);
} frame;
} ops;
};
struct audio_dec_handler {
int (*dec_probe)(struct audio_decoder *);
int (*dec_output)(struct audio_decoder *, s16 *data, int len, void *priv);
int (*dec_post)(struct audio_decoder *);
int (*dec_stop)(struct audio_decoder *);
};
struct stream_codec_info {
int time;
int frame_num;
u32 frame_len;
int frame_points;
int sequence_number;
u32 sample_rate;
u8 channel;
};
/*! \brief 音频解码器抽象接口 */
struct audio_decoder_ops {
u32 coding_type; /*!< 解码格式*/
void *(*open)(void *priv); /*!< */
int (*start)(void *); /*!< */
int (*get_fmt)(void *, struct audio_fmt *fmt);
int (*set_output_channel)(void *, enum audio_channel);
int (*get_play_time)(void *);
int (*fast_forward)(void *, int step_s);
int (*fast_rewind)(void *, int step_s);
int (*get_breakpoint)(void *, struct audio_dec_breakpoint *);
int (*set_breakpoint)(void *, struct audio_dec_breakpoint *);
int (*stream_info_scan)(void *, struct stream_codec_info *info, void *data, int len);
int (*set_tws_mode)(void *, int);
int (*run)(void *, u8 *);
int (*stop)(void *);
int (*close)(void *);
int (*reset)(void *);
int (*ioctrl)(void *, u32 cmd, void *parm);
};
#define REGISTER_AUDIO_DECODER(ops) \
const struct audio_decoder_ops ops SEC(.audio_decoder)
extern const struct audio_decoder_ops audio_decoder_begin[];
extern const struct audio_decoder_ops audio_decoder_end[];
#define list_for_each_audio_decoder(p) \
for (p = audio_decoder_begin; p < audio_decoder_end; p++)
struct audio_decoder {
struct list_head entry;
struct audio_decoder_task *task;
struct audio_fmt fmt;
const char *evt_owner;
const struct audio_dec_input *input;
const struct audio_decoder_ops *dec_ops;
const struct audio_dec_handler *dec_handler;
void (*evt_handler)(struct audio_decoder *dec, int, int *);
void *dec_priv;
void *bp;
u16 id;
u16 pick : 1;
u16 tws : 1;
u16 resume_flag : 1;
u16 output_err : 1;
u16 read_err : 1;
u16 reserved : 11;
u8 run_max;
u8 output_channel;
u8 state;
u8 err;
u8 remain;
u32 magic;
};
#define AUDIO_DEC_ORIG_CH AUDIO_CH_LR
#define AUDIO_DEC_L_CH AUDIO_CH_L
#define AUDIO_DEC_R_CH AUDIO_CH_R
#define AUDIO_DEC_MONO_LR_CH AUDIO_CH_DIFF
#define AUDIO_DEC_DUAL_L_CH AUDIO_CH_DUAL_L
#define AUDIO_DEC_DUAL_R_CH AUDIO_CH_DUAL_R
#define AUDIO_DEC_DUAL_LR_CH AUDIO_CH_DUAL_LR
#define AUDIO_DEC_IS_MONO(ch) (((ch)==AUDIO_DEC_L_CH) || ((ch)==AUDIO_DEC_R_CH) || ((ch)==AUDIO_DEC_MONO_LR_CH))
int audio_decoder_task_create(struct audio_decoder_task *task, const char *name);
int audio_decoder_task_add_wait(struct audio_decoder_task *, struct audio_res_wait *);
void audio_decoder_task_del_wait(struct audio_decoder_task *, struct audio_res_wait *);
int audio_decoder_task_wait_state(struct audio_decoder_task *task);
int audio_decoder_resume_all(struct audio_decoder_task *task);
int audio_decoder_resume_off_limits(struct audio_decoder_task *task, u8 limit_num, int *limit_dec);
int audio_decoder_resume_all_by_sem(struct audio_decoder_task *task, int time_out);
int audio_decoder_fmt_lock(struct audio_decoder_task *task, int fmt);
int audio_decoder_fmt_unlock(struct audio_decoder_task *task, int fmt);
void *audio_decoder_get_output_buff(void *_dec, int *len);
int audio_decoder_put_output_buff(void *_dec, void *buff, int len, void *priv);
int audio_decoder_read_data(void *_dec, u8 *data, int len, u32 offset);
int audio_decoder_get_input_data_len(void *_dec);
int audio_decoder_get_frame(void *_dec, u8 **frame);
int audio_decoder_fetch_frame(void *_dec, u8 **frame);
void audio_decoder_put_frame(void *_dec, u8 *frame);
int audio_fmt_find_frame(void *_dec, u8 **frame);
int audio_decoder_open(struct audio_decoder *dec, const struct audio_dec_input *input,
struct audio_decoder_task *task);
int audio_decoder_data_type(void *_dec);
void audio_decoder_set_id(struct audio_decoder *dec, int);
int audio_decoder_get_fmt(struct audio_decoder *dec, struct audio_fmt **fmt);
int audio_decoder_set_fmt(struct audio_decoder *dec, struct audio_fmt *fmt);
int audio_decoder_get_fmt_info(struct audio_decoder *dec, struct audio_fmt *fmt);
void audio_decoder_set_handler(struct audio_decoder *dec, const struct audio_dec_handler *handler);
void audio_decoder_set_event_handler(struct audio_decoder *dec,
void (*handler)(struct audio_decoder *, int, int *), u32 magic);
void audio_decoder_set_input_buff(struct audio_decoder *dec, u8 *buff, u16 buff_size);
void audio_decoder_set_output_buffs(struct audio_decoder *dec, s16 *buffs,
u16 buff_size, u8 buff_num);
int audio_decoder_set_output_channel(struct audio_decoder *dec, enum audio_channel);
int audio_decoder_start(struct audio_decoder *dec);
int audio_decoder_stop(struct audio_decoder *dec);
int audio_decoder_pause(struct audio_decoder *dec);
int audio_decoder_suspend(struct audio_decoder *dec, int timeout_ms);
int audio_decoder_resume(struct audio_decoder *dec);
int audio_decoder_close(struct audio_decoder *dec);
int audio_decoder_reset(struct audio_decoder *dec);
int audio_decoder_set_breakpoint(struct audio_decoder *dec, struct audio_dec_breakpoint *bp);
int audio_decoder_get_breakpoint(struct audio_decoder *dec, struct audio_dec_breakpoint *bp);
int audio_decoder_forward(struct audio_decoder *dec, int step_s);
int audio_decoder_rewind(struct audio_decoder *dec, int step_s);
int audio_decoder_get_total_time(struct audio_decoder *dec);
int audio_decoder_get_play_time(struct audio_decoder *dec);
int audio_decoder_set_pick_stu(struct audio_decoder *dec, u8 pick);
int audio_decoder_get_pick_stu(struct audio_decoder *dec);
int audio_decoder_set_tws_stu(struct audio_decoder *dec, u8 tws);
int audio_decoder_get_tws_stu(struct audio_decoder *dec);
int audio_decoder_set_run_max(struct audio_decoder *dec, u8 run_max);
void audio_decoder_dual_switch(u8 ch_type, u8 half_lr, s16 *data, int len);
int audio_decoder_running_number(struct audio_decoder_task *task);
int audio_decoder_ioctrl(struct audio_decoder *dec, u32 cmd, void *parm);
void audio_decoder_set_channel(void *_dec, u8 ch_num);
int audio_decoder_get_channel(void *_dec);
int audio_decoder_get_frame_len(void *_dec);
int audio_decoder_get_sample_rate(void *_dec);
int audio_decoder_get_bit_rate(void *_dec);
#endif