#ifndef _AUDIO_HW_H #define _AUDIO_HW_H #include #include "co_list.h" typedef void (*audio_hw_request_pcm_t)(void *pcm, uint32_t samples, uint8_t channels); typedef void (*audio_hw_receive_pcm_ntf_t)(uint32_t samples); typedef enum { AUDIO_HW_TYPE_I2S, AUDIO_HW_TYPE_CODEC, AUDIO_HW_TYPE_PDM, } audio_hw_type_t; typedef enum { AUDIO_HW_DIR_IN = 0x01, AUDIO_HW_DIR_OUT = 0x02, AUDIO_HW_DIR_INOUT = (AUDIO_HW_DIR_IN | AUDIO_HW_DIR_OUT), } audio_hw_dir_t; typedef struct { struct co_list_hdr hdr; audio_hw_type_t type; audio_hw_dir_t dir; uint8_t channels; uint32_t sample_rate; uint32_t base_addr; void *hw_handle; /* used for output mode */ audio_hw_request_pcm_t request_handler; int16_t *pcm_out; /* used for input mode */ uint32_t wr_ptr; /* unit is sample */ struct co_list output_list; uint32_t pcm_samples; /* unit is sample */ uint8_t *pcm; } audio_hw_t; typedef struct { struct co_list_hdr hdr; audio_hw_t *audio_hw; audio_hw_receive_pcm_ntf_t handler; uint32_t rd_ptr; /* unit is sample */ } audio_hw_output_t; audio_hw_t *audio_hw_create(audio_hw_type_t type, audio_hw_request_pcm_t handler, uint32_t base_addr, audio_hw_dir_t dir, uint32_t sample_rate, uint8_t channels); void audio_hw_destroy(audio_hw_t *hw); audio_hw_output_t *audio_hw_output_add(audio_hw_t *hw, audio_hw_receive_pcm_ntf_t handler); void audio_hw_output_remove(audio_hw_t *hw, audio_hw_output_t *output); uint32_t audio_hw_read_pcm(audio_hw_output_t *output, void *pcm, uint32_t samples, uint8_t channels); #endif // _AUDIO_HW_H