Files
2025-12-03 11:12:34 +08:00

230 lines
9.8 KiB
C

/*****************************************************************
>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