#define SAMPLE_FREQUENCY 16000
#define NUMBER_OF_CHANNELS 1
#endif
#define SAMPLE_BIT_WIDTH 16
#define BYTES_PER_SAMPLE sizeof(int16_t)
/* Such block length provides an echo with the delay of 100 ms. */
#define SAMPLES_PER_BLOCK ((SAMPLE_FREQUENCY / 10) * NUMBER_OF_CHANNELS)
#define ZEPHYR_AUDIO_BLOCK_SIZE (BYTES_PER_SAMPLE * SAMPLES_PER_BLOCK)
#define ZEPHYR_AUDIO_INITIAL_BLOCKS 2
//#define ZEPHYR_AUDIO_BLOCK_COUNT ZEPHYR_AUDIO_INITIAL_BLOCKS + 4
#define ZEPHYR_AUDIO_BLOCK_COUNT ZEPHYR_AUDIO_INITIAL_BLOCKS + 32
typedef void I2S_Stream;
int zephyr_i2s_audio_init(void);
int zephyr_i2s_get_rate();
int zephyr_i2s_open_stream(I2S_Stream **stream, uint8_t *buf, uint8_t audio_in);
int zephyr_i2s_close_stream(I2S_Stream *stream);
int zephyr_i2s_start(uint8_t audio_in);
int zephyr_i2s_stop(uint8_t audio_in);
K_MEM_SLAB_DEFINE_IN_SECT_STATIC(mem_slab, __dtcm_noinit_section, ZEPHYR_AUDIO_BLOCK_SIZE, ZEPHYR_AUDIO_BLOCK_COUNT, 4);
int zephyr_i2s_audio_init(void)
{
struct i2s_config config;
#if DT_NODE_HAS_STATUS(DT_NODELABEL(audio_codec), okay)
const struct device *const codec_dev = DEVICE_DT_GET(DT_NODELABEL(audio_codec));
struct audio_codec_cfg audio_cfg;
audio_cfg.dai_route = AUDIO_ROUTE_PLAYBACK_CAPTURE;
audio_cfg.dai_type = AUDIO_DAI_TYPE_I2S;
audio_cfg.dai_cfg.i2s.word_size = SAMPLE_BIT_WIDTH;
audio_cfg.dai_cfg.i2s.channels = NUMBER_OF_CHANNELS;
audio_cfg.dai_cfg.i2s.format = I2S_FMT_DATA_FORMAT_I2S;
audio_cfg.dai_cfg.i2s.options = I2S_OPT_FRAME_CLK_MASTER;
audio_cfg.dai_cfg.i2s.frame_clk_freq = SAMPLE_FREQUENCY;
audio_cfg.dai_cfg.i2s.mem_slab = &mem_slab;
audio_cfg.dai_cfg.i2s.block_size = ZEPHYR_AUDIO_BLOCK_SIZE;
audio_codec_configure(codec_dev, &audio_cfg);
k_msleep(1000);
#else
printf("No found audio_codec int DTS!!! Error\n");
return -1;
#endif
if (!device_is_ready(i2s_dev_rx))
{
printk("%s is not ready\n", i2s_dev_rx->name);
return -1;
}
if (i2s_dev_rx != i2s_dev_tx && !device_is_ready(i2s_dev_tx))
{
printk("%s is not ready\n", i2s_dev_tx->name);
return -1;
}
config.word_size = SAMPLE_BIT_WIDTH;
config.channels = NUMBER_OF_CHANNELS;
config.format = I2S_FMT_DATA_FORMAT_I2S;
config.options = I2S_OPT_BIT_CLK_MASTER | I2S_OPT_FRAME_CLK_MASTER;
config.frame_clk_freq = SAMPLE_FREQUENCY;
config.mem_slab = &mem_slab;
config.block_size = ZEPHYR_AUDIO_BLOCK_SIZE;
config.timeout = TIMEOUT;
if (!configure_streams(i2s_dev_rx, i2s_dev_tx, &config))
{
return -1;
}
return 0;
}
memslab используется для TX и RX - проанализируй запас размера буфера для i2s in и i2s out