64 lines
1.6 KiB
C++
64 lines
1.6 KiB
C++
|
/**
|
||
|
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
|
||
|
*
|
||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||
|
*/
|
||
|
#pragma once
|
||
|
#include "pico/audio_i2s.h"
|
||
|
|
||
|
#define SAMPLES_PER_BUFFER 256
|
||
|
|
||
|
|
||
|
typedef int16_t (*buffer_callback)(void);
|
||
|
|
||
|
struct audio_buffer_pool *init_audio(uint32_t sample_rate, uint8_t pin_data, uint8_t pin_bclk, uint8_t pio_sm=0, uint8_t dma_ch=0) {
|
||
|
static audio_format_t audio_format = {
|
||
|
.sample_freq = sample_rate,
|
||
|
.format = AUDIO_BUFFER_FORMAT_PCM_S16,
|
||
|
.channel_count = 1,
|
||
|
};
|
||
|
|
||
|
static struct audio_buffer_format producer_format = {
|
||
|
.format = &audio_format,
|
||
|
.sample_stride = 2
|
||
|
};
|
||
|
|
||
|
struct audio_buffer_pool *producer_pool = audio_new_producer_pool(
|
||
|
&producer_format,
|
||
|
3,
|
||
|
SAMPLES_PER_BUFFER
|
||
|
);
|
||
|
|
||
|
const struct audio_format *output_format;
|
||
|
|
||
|
struct audio_i2s_config config = {
|
||
|
.data_pin = pin_data,
|
||
|
.clock_pin_base = pin_bclk,
|
||
|
.dma_channel = dma_ch,
|
||
|
.pio_sm = pio_sm,
|
||
|
};
|
||
|
|
||
|
output_format = audio_i2s_setup(&audio_format, &config);
|
||
|
if (!output_format) {
|
||
|
panic("PicoAudio: Unable to open audio device.\n");
|
||
|
}
|
||
|
|
||
|
bool status = audio_i2s_connect(producer_pool);
|
||
|
if (!status) {
|
||
|
panic("PicoAudio: Unable to connect to audio device.\n");
|
||
|
}
|
||
|
|
||
|
audio_i2s_set_enabled(true);
|
||
|
|
||
|
return producer_pool;
|
||
|
}
|
||
|
|
||
|
void update_buffer(struct audio_buffer_pool *ap, buffer_callback cb) {
|
||
|
struct audio_buffer *buffer = take_audio_buffer(ap, true);
|
||
|
int16_t *samples = (int16_t *) buffer->buffer->bytes;
|
||
|
for (uint i = 0; i < buffer->max_sample_count; i++) {
|
||
|
samples[i] = cb();
|
||
|
}
|
||
|
buffer->sample_count = buffer->max_sample_count;
|
||
|
give_audio_buffer(ap, buffer);
|
||
|
}
|