/***************************************************************** >file name : audio_cfifo.h >author : lichao >create time : Tue 10 Nov 2020 02:22:37 PM CST *****************************************************************/ #ifndef _AUDIO_CFIFO_H_ #define _AUDIO_CFIFO_H_ #include "generic/list.h" #include "typedef.h" #include "system/spinlock.h" #define WRITE_MODE_BLOCK 0 #define WRITE_MODE_FORCE 1 struct audio_cfifo { u8 sample_channel; /*fifo采样声道数*/ s16 *addr; /*fifo首地址*/ u16 sample_size; /*fifo采样长度*/ u16 wp; /*fifo写偏移*/ u16 rp; /*fifo读偏移*/ u16 lock_rp; /*fifo不可擦写的已读偏移*/ u16 free_samples; /*fifo可写入样点个数*/ s16 unread_samples; /*fifo未读样点个数*/ int sample_rate; /*fifo对应的音频采样率*/ u32 sw_ptr; u32 hw_ptr; struct list_head head; /*子通道数据链表头*/ spinlock_t lock; u8 bit_wide; }; struct audio_cfifo_channel { u8 write_mode; /*写入模式*/ u16 delay_time; /*最大延时(ms)*/ u16 rsp; /*读偏移*/ u16 wsp; /*写偏移*/ s16 unread_samples; /*通道未读样点个数*/ u16 max_samples; /*通道缓冲最大样点个数*/ u32 sw_ptr; u32 hw_ptr; struct audio_cfifo *fifo; /*主fifo指针*/ struct list_head entry; /*通道接入entry*/ u8 bit_wide; }; /************************************************************************* * Audio cfifo主fifo初始化 * INPUT : fifo - 主fifo结构指针, * buf - fifo缓冲地址 * len - fifo缓冲长度 * sample_rate - fifo音频采样率 * channel - fifo音频声道数 * OUTPUT : 0 - 成功,非0 - 失败. * WARNINGS : 无. * HISTORY : 2020/12/28 by Lichao. *=======================================================================*/ int audio_cfifo_init(struct audio_cfifo *fifo, void *buf, int len, int sample_rate, u8 channel); /************************************************************************* * Audio cfifo主fifo复位 * INPUT : fifo - 主fifo结构指针, * buf - fifo缓冲地址 * len - fifo缓冲长度 * sample_rate - fifo音频采样率 * channel - fifo音频声道数 * OUTPUT : 0 - 成功,非0 - 失败. * WARNINGS : 这里与audio_cfifo_init类似但意义不一样,不可以当作init使用. * HISTORY : 2020/12/28 by Lichao. *=======================================================================*/ int audio_cfifo_reset(struct audio_cfifo *fifo, void *buf, int len, int sample_rate, u8 channel); /************************************************************************* * 添加fifo子通道 * INPUT : fifo - 主fifo结构指针, * ch - fifo子通道 * delay_time - 子通道延时 * write_mode - 子通道写入模式 * OUTPUT : 0 - 成功,非0 - 失败. * WARNINGS : 无. * HISTORY : 2020/12/28 by Lichao. *=======================================================================*/ int audio_cfifo_channel_add(struct audio_cfifo *fifo, struct audio_cfifo_channel *ch, int delay_time, u8 write_mode); /************************************************************************* * 删除fifo子通道 * INPUT : ch - fifo子通道 * OUTPUT : 无. * WARNINGS : 无. * HISTORY : 2020/12/28 by Lichao. *=======================================================================*/ void audio_cfifo_channel_del(struct audio_cfifo_channel *ch); /************************************************************************* * 主fifo读数更新 * INPUT : fifo - 主fifo结构指针, samples - 读取的样点个数 * OUTPUT : 成功更新的样点个数. * WARNINGS : 无. * HISTORY : 2020/12/28 by Lichao. *=======================================================================*/ int audio_cfifo_read_update(struct audio_cfifo *fifo, int samples); /************************************************************************* * fifo子通道数据写入 * INPUT : ch - fifo子通道, data - 数据指针, len - 数据长度 * OUTPUT : 写入fifo的长度. * WARNINGS : 强制写入模式无论是否可以写入都将返回预期写入长度. * HISTORY : 2020/12/28 by Lichao. *=======================================================================*/ int audio_cfifo_channel_write(struct audio_cfifo_channel *ch, void *data, int len); /************************************************************************* * fifo子通道写入直流数据 * INPUT : ch - fifo子通道, data - 直流值, len - 长度 * OUTPUT : 写入fifo的长度. * WARNINGS : 强制写入模式无论是否可以写入都将返回预期写入长度. * HISTORY : 2020/12/28 by Lichao. *=======================================================================*/ int audio_cfifo_channel_write_fixed_data(struct audio_cfifo_channel *ch, s16 data, int len); /************************************************************************* * fifo子通道擦除 * INPUT : ch - fifo子通道 * OUTPUT : 未知. * WARNINGS : 待开发. * HISTORY : 2020/12/28 by Lichao. *=======================================================================*/ int audio_cfifo_channel_clear(struct audio_cfifo_channel *ch); /************************************************************************* * 主fifo获取写偏移 * INPUT : fifo - 主fifo结构指针 * OUTPUT : fifo写入偏移. * WARNINGS : 无. * HISTORY : 2020/12/28 by Lichao. *=======================================================================*/ int audio_cfifo_get_write_offset(struct audio_cfifo *fifo); /************************************************************************* * 主fifo获取未读样点查询 * INPUT : fifo - 主fifo结构指针 * OUTPUT : 样点个数. * WARNINGS : 无. * HISTORY : 2020/12/28 by Lichao. *=======================================================================*/ int audio_cfifo_get_unread_samples(struct audio_cfifo *fifo); /************************************************************************* * 主fifo与子fifo未读样点个数差值 * INPUT : ch - fifo子通道 * OUTPUT : 样点个数. * WARNINGS : 无. * HISTORY : 2020/12/28 by Lichao. *=======================================================================*/ int audio_cfifo_channel_unread_diff_samples(struct audio_cfifo_channel *ch); /************************************************************************* * 主fifo通道个数 * INPUT : fifo - 主fifo结构指针 * OUTPUT : 通道个数. * WARNINGS : 无. * HISTORY : 2020/12/28 by Lichao. *=======================================================================*/ int audio_cfifo_channel_num(struct audio_cfifo *fifo); /************************************************************************* * 主fifo设置已读样点不可擦除区域 * INPUT : fifo - 主fifo结构指针, samples - 不可擦除样点个数 * OUTPUT : 无. * WARNINGS : 特殊处理,无需理解,仅作为开发人员使用. * HISTORY : 2020/12/28 by Lichao. *=======================================================================*/ void audio_cfifo_set_readlock_samples(struct audio_cfifo *fifo, int samples); /************************************************************************* * 获取主fifo设置已读样点不可擦除区域大小 * INPUT : fifo - 主fifo结构指针. * OUTPUT : 不可擦除样点个数. * WARNINGS : 特殊处理,无需理解,仅作为开发人员使用. * HISTORY : 2020/12/28 by Lichao. *=======================================================================*/ int audio_cfifo_get_readlock_samples(struct audio_cfifo *fifo); /************************************************************************* * fifo使用回调读取通道的有效混合数据 * INPUT : fifo - 主fifo结构指针 * offset - 读偏移 * samples - 读取样点个数 * priv - 回调私有指针 * read_callback - 读回调 * OUTPUT : 读取长度. * WARNINGS : 无. * HISTORY : 2020/12/28 by Lichao. *=======================================================================*/ int audio_cfifo_read_with_callback(struct audio_cfifo *fifo, int offset, int samples, void *priv, int (*read_callback)(void *priv, void *data, int len)); /************************************************************************* * fifo子通道未读样点查询 * INPUT : ch - fifo子通道 * OUTPUT : 样点个数. * WARNINGS : 无. * HISTORY : 2020/12/28 by Lichao. *=======================================================================*/ int audio_cfifo_channel_unread_samples(struct audio_cfifo_channel *ch); /************************************************************************* * fifo子通道获取写偏移 * INPUT : ch - fifo子通道 * OUTPUT : 偏移. * WARNINGS : 无. * HISTORY : 2020/12/28 by Lichao. *=======================================================================*/ int audio_cfifo_channel_write_offset(struct audio_cfifo_channel *ch); /************************************************************************* * fifo获取缓冲最小的子通道 * INPUT : fifo - 主fifo结构指针 * OUTPUT : fifo子通道指针. * WARNINGS : 无. * HISTORY : 2020/12/28 by Lichao. *=======================================================================*/ struct audio_cfifo_channel *audio_cfifo_min_samples_channel(struct audio_cfifo *fifo); int audio_cfifo_get_sw_ptr(struct audio_cfifo *fifo); int audio_cfifo_get_hw_ptr(struct audio_cfifo *fifo); int audio_cfifo_read_data(struct audio_cfifo *fifo, s16 *out_buf, int len); #endif