nodemcu-firmware/app/pcm/pcm.h

104 lines
2.2 KiB
C

#ifndef _PCM_H
#define _PCM_H
#include "task/task.h"
#include "platform.h"
//#define DEBUG_PIN 2
#ifdef DEBUG_PIN
# define dbg_platform_gpio_write(level) platform_gpio_write( DEBUG_PIN, level )
# define dbg_platform_gpio_mode(mode, pull) platform_gpio_mode( DEBUG_PIN, mode, pull)
#else
# define dbg_platform_gpio_write(level)
# define dbg_platform_gpio_mode(mode, pull)
#endif
#define BASE_RATE 1000000
enum pcm_driver_index {
PCM_DRIVER_SD = 0,
PCM_DRIVER_END = 1
};
enum pcm_rate_index {
PCM_RATE_1K = 0,
PCM_RATE_2K = 1,
PCM_RATE_4K = 2,
PCM_RATE_5K = 3,
PCM_RATE_8K = 4,
PCM_RATE_10K = 5,
PCM_RATE_12K = 6,
PCM_RATE_16K = 7,
};
static const uint16_t pcm_rate_def[] = {BASE_RATE / 1000, BASE_RATE / 2000, BASE_RATE / 4000,
BASE_RATE / 5000, BASE_RATE / 8000, BASE_RATE / 10000,
BASE_RATE / 12000, BASE_RATE / 16000};
typedef struct {
// available bytes in buffer
size_t len;
// next read position
size_t rpos;
// empty flag
uint8_t empty;
// allocated size
size_t buf_size;
uint8_t *data;
} pcm_buf_t;
typedef struct {
// selected sample rate
int rate;
// ISR throttle control
// -1 = ISR and data task throttled
// 1 = ISR throttled
// 0 = all running
sint8_t isr_throttled;
// buffer selectors
uint8_t rbuf_idx; // read by ISR
uint8_t fbuf_idx; // fill by data task
// callback fn refs
int self_ref;
int cb_data_ref, cb_drained_ref, cb_paused_ref, cb_stopped_ref, cb_vu_ref;
// data buffers
pcm_buf_t bufs[2];
// vu measuring
uint8_t vu_freq;
uint16_t vu_req_samples, vu_samples_tmp;
uint16_t vu_peak_tmp, vu_peak;
// sigma-delta: output pin
int pin;
} cfg_t;
typedef uint8_t (*drv_fn_t)(cfg_t *);
typedef struct {
drv_fn_t init;
drv_fn_t close;
drv_fn_t play;
drv_fn_t record;
drv_fn_t stop;
} drv_t;
typedef struct {
cfg_t cfg;
const drv_t *drv;
} pud_t;
void pcm_data_vu( task_param_t param, uint8 prio );
void pcm_data_play( task_param_t param, uint8 prio );
// task handles
extern task_handle_t pcm_data_vu_task, pcm_data_play_task, pcm_start_play_task;
#endif /* _PCM_H */