MXC-A36_2024.04.18/fr3092_mcu/components/modules/audio/audio_hw.h

63 lines
1.6 KiB
C
Raw Normal View History

2024-04-17 19:45:26 +08:00
#ifndef _AUDIO_HW_H
#define _AUDIO_HW_H
#include <stdint.h>
#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