63 lines
1.6 KiB
C
63 lines
1.6 KiB
C
|
#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
|