rp2040-i2s
All Classes Files Functions Variables Typedefs Modules Pages
audio.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef _PICO_AUDIO_H
8 #define _PICO_AUDIO_H
9 
10 #include "pico.h"
12 #include "hardware/sync.h"
13 
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17 
25 // PICO_CONFIG: SPINLOCK_ID_AUDIO_FREE_LIST_LOCK, Spinlock number for the audio free list, min=0, max=31, default=6, group=audio
26 #ifndef SPINLOCK_ID_AUDIO_FREE_LIST_LOCK
27 #define SPINLOCK_ID_AUDIO_FREE_LIST_LOCK 6
28 #endif
29 
30 // PICO_CONFIG: SPINLOCK_ID_AUDIO_PREPARED_LISTS_LOCK, Spinlock number for the audio prepared list, min=0, max=31, default=7, group=audio
31 #ifndef SPINLOCK_ID_AUDIO_PREPARED_LISTS_LOCK
32 #define SPINLOCK_ID_AUDIO_PREPARED_LISTS_LOCK 7
33 #endif
34 
35 // PICO_CONFIG: PICO_AUDIO_NOOP, Enable/disable audio by forcing NOOPS, type=bool, default=0, group=audio
36 #ifndef PICO_AUDIO_NOOP
37 #define PICO_AUDIO_NOOP 0
38 #endif
39 
40 
41 #define AUDIO_BUFFER_FORMAT_PCM_S16 1
42 #define AUDIO_BUFFER_FORMAT_PCM_S8 2
43 #define AUDIO_BUFFER_FORMAT_PCM_U16 3
44 #define AUDIO_BUFFER_FORMAT_PCM_U8 4
45 
48 typedef struct audio_format {
49  uint32_t sample_freq;
50  uint16_t format;
51  uint16_t channel_count;
53 
56 typedef struct audio_buffer_format {
58  uint16_t sample_stride;
60 
63 typedef struct audio_buffer {
64  mem_buffer_t *buffer;
65  const audio_buffer_format_t *format;
66  uint32_t sample_count;
67  uint32_t max_sample_count;
68  uint32_t user_data; // only valid while the user has the buffer
69  // private - todo make an internal version
70  struct audio_buffer *next;
72 
74 
75 typedef struct audio_buffer_pool {
76  enum {
77  ac_producer, ac_consumer
78  } type;
79  const audio_format_t *format;
80  // private
81  audio_connection_t *connection;
82  spin_lock_t *free_list_spin_lock;
83  // ----- begin protected by free_list_spin_lock -----
84  audio_buffer_t *free_list;
85  spin_lock_t *prepared_list_spin_lock;
86  audio_buffer_t *prepared_list;
87  audio_buffer_t *prepared_list_tail;
89 
91 
93  audio_buffer_t *(*producer_pool_take)(audio_connection_t *connection, bool block);
94 
95  void (*producer_pool_give)(audio_connection_t *connection, audio_buffer_t *buffer);
96 
97  audio_buffer_t *(*consumer_pool_take)(audio_connection_t *connection, bool block);
98 
99  void (*consumer_pool_give)(audio_connection_t *connection, audio_buffer_t *buffer);
100 
101  audio_buffer_pool_t *producer_pool;
102  audio_buffer_pool_t *consumer_pool;
103 };
104 
114  int buffer_sample_count);
115 
125  int buffer_sample_count);
126 
135 
143 audio_buffer_t *audio_new_buffer(audio_buffer_format_t *format, int buffer_sample_count);
144 
152 void audio_init_buffer(audio_buffer_t *audio_buffer, audio_buffer_format_t *format, int buffer_sample_count);
153 
162 
169 
174 static inline void release_audio_buffer(audio_buffer_pool_t *ac, audio_buffer_t *buffer) {
175  buffer->sample_count = 0;
176  give_audio_buffer(ac, buffer);
177 }
178 
185 void audio_upsample(int16_t *input, int16_t *output, uint output_count, uint32_t step);
186 
193 void audio_upsample_words(int16_t *input, int16_t *output_aligned, uint output_word_count, uint32_t step);
194 
198 void audio_upsample_double(int16_t *input, int16_t *output, uint output_count, uint32_t step);
199 
204  audio_buffer_pool_t *consumer);
205 
210 
215 
220 
225 
232 
237 
242 
247 
248 enum audio_correction_mode {
249  none,
250  fixed_dither,
251  dither,
252  noise_shaped_dither,
253 };
254 
256  struct audio_connection core;
257  audio_buffer_t *current_producer_buffer;
258  uint32_t current_producer_buffer_pos;
259 };
260 
262  audio_connection_t core;
263  audio_buffer_t *current_consumer_buffer;
264  uint32_t current_consumer_buffer_pos;
265 };
266 
271 
276 
281 
286 
291 
296 
297 // not worth a separate header for now
298 typedef struct __packed pio_audio_channel_config {
299  uint8_t base_pin;
300  uint8_t dma_channel;
301  uint8_t pio_sm;
302 } pio_audio_channel_config_t;
303 
304 #ifdef __cplusplus
305 }
306 #endif
307 
308 #endif //_AUDIO_H
struct audio_format audio_format_t
Audio format definition.
struct audio_buffer_format audio_buffer_format_t
Audio buffer format definition.
struct audio_buffer audio_buffer_t
Audio buffer definition.
audio_buffer_t * mono_s8_to_stereo_consumer_take(audio_connection_t *connection, bool block)
Definition: audio.cpp:248
audio_buffer_t * get_full_audio_buffer(audio_buffer_pool_t *context, bool block)
Definition: audio.cpp:98
audio_buffer_pool_t * audio_new_consumer_pool(audio_buffer_format_t *format, int buffer_count, int buffer_sample_count)
Allocate and initialise an audio consumer pool.
Definition: audio.cpp:196
audio_buffer_pool_t * audio_new_producer_pool(audio_buffer_format_t *format, int buffer_count, int buffer_sample_count)
Allocate and initialise an audio producer pool.
Definition: audio.cpp:189
void queue_free_audio_buffer(audio_buffer_pool_t *context, audio_buffer_t *ab)
Definition: audio.cpp:90
audio_buffer_t * mono_to_mono_consumer_take(audio_connection_t *connection, bool block)
Definition: audio.cpp:230
audio_buffer_t * mono_s8_to_mono_consumer_take(audio_connection_t *connection, bool block)
Definition: audio.cpp:244
audio_buffer_t * audio_new_wrapping_buffer(audio_buffer_format_t *format, mem_buffer_t *buffer)
Allocate and initialise an audio wrapping buffer.
Definition: audio.cpp:175
void producer_pool_give_buffer_default(audio_connection_t *connection, audio_buffer_t *buffer)
Definition: audio.cpp:119
audio_buffer_t * audio_new_buffer(audio_buffer_format_t *format, int buffer_sample_count)
Allocate and initialise an new audio buffer.
Definition: audio.cpp:142
void queue_full_audio_buffer(audio_buffer_pool_t *context, audio_buffer_t *ab)
Definition: audio.cpp:111
audio_buffer_t * consumer_pool_take_buffer_default(audio_connection_t *connection, bool block)
Definition: audio.cpp:131
void give_audio_buffer(audio_buffer_pool_t *ac, audio_buffer_t *buffer)
Definition: audio.cpp:212
audio_buffer_t * mono_to_stereo_consumer_take(audio_connection_t *connection, bool block)
Definition: audio.cpp:240
void consumer_pool_give_buffer_default(audio_connection_t *connection, audio_buffer_t *buffer)
Definition: audio.cpp:127
audio_buffer_t * producer_pool_take_buffer_default(audio_connection_t *connection, bool block)
Definition: audio.cpp:123
void stereo_to_stereo_producer_give(audio_connection_t *connection, audio_buffer_t *buffer)
Definition: audio.cpp:252
void audio_upsample(int16_t *input, int16_t *output, uint output_count, uint32_t step)
audio_buffer_t * take_audio_buffer(audio_buffer_pool_t *ac, bool block)
Definition: audio.cpp:221
audio_buffer_t * stereo_to_stereo_consumer_take(audio_connection_t *connection, bool block)
Definition: audio.cpp:235
audio_buffer_t * get_free_audio_buffer(audio_buffer_pool_t *context, bool block)
Definition: audio.cpp:77
void audio_upsample_words(int16_t *input, int16_t *output_aligned, uint output_word_count, uint32_t step)
void audio_init_buffer(audio_buffer_t *audio_buffer, audio_buffer_format_t *format, int buffer_sample_count)
Initialise an audio buffer.
Definition: audio.cpp:148
void audio_upsample_double(int16_t *input, int16_t *output, uint output_count, uint32_t step)
void audio_complete_connection(audio_connection_t *connection, audio_buffer_pool_t *producer, audio_buffer_pool_t *consumer)
Definition: audio.cpp:202
Audio buffer format definition.
Definition: audio.h:56
uint16_t sample_stride
Sample stride.
Definition: audio.h:58
const audio_format_t * format
Audio format.
Definition: audio.h:57
Definition: audio.h:75
Audio buffer definition.
Definition: audio.h:63
Definition: audio.h:92
Audio format definition.
Definition: audio.h:48
uint16_t channel_count
Number of channels.
Definition: audio.h:51
uint16_t format
Audio format audio_formats.
Definition: audio.h:50
uint32_t sample_freq
Sample frequency in Hz.
Definition: audio.h:49
Wrapper structure around a memory buffer.
Definition: buffer.h:40
Definition: audio.h:298