pimoroni-pico/examples/pico_audio/audio.hpp

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);
}