Skip to content

Commit 8fc4f12

Browse files
committed
fixup passthru (single buffer) for I2S audio, and remove explicit silence buffer in favor of sending zeros
1 parent e60a7db commit 8fc4f12

File tree

2 files changed

+30
-11
lines changed

2 files changed

+30
-11
lines changed

src/rp2_common/pico_audio_i2s/audio_i2s.c

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,6 @@ audio_buffer_format_t pio_i2s_consumer_buffer_format = {
4343
.format = &pio_i2s_consumer_format,
4444
};
4545

46-
static audio_buffer_t silence_buffer;
47-
4846
static void __isr __time_critical_func(audio_i2s_dma_irq_handler)();
4947

5048
const audio_format_t *audio_i2s_setup(const audio_format_t *intended_audio_format,
@@ -61,10 +59,6 @@ const audio_format_t *audio_i2s_setup(const audio_format_t *intended_audio_forma
6159

6260
audio_i2s_program_init(audio_pio, sm, offset, config->data_pin, config->clock_pin_base);
6361

64-
silence_buffer.buffer = pico_buffer_alloc(PICO_AUDIO_I2S_BUFFER_SAMPLE_LENGTH * 4);
65-
silence_buffer.sample_count = PICO_AUDIO_I2S_BUFFER_SAMPLE_LENGTH;
66-
silence_buffer.format = &pio_i2s_consumer_buffer_format;
67-
6862
__mem_fence_release();
6963
uint8_t dma_channel = config->dma_channel;
7064
dma_channel_claim(dma_channel);
@@ -93,11 +87,9 @@ const audio_format_t *audio_i2s_setup(const audio_format_t *intended_audio_forma
9387
static audio_buffer_pool_t *audio_i2s_consumer;
9488

9589
static void update_pio_frequency(uint32_t sample_freq) {
96-
printf("setting pio freq %d\n", (int) sample_freq);
9790
uint32_t system_clock_frequency = clock_get_hz(clk_sys);
9891
assert(system_clock_frequency < 0x40000000);
9992
uint32_t divider = system_clock_frequency * 4 / sample_freq; // avoid arithmetic overflow
100-
printf("System clock at %u, I2S clock divider 0x%x/256\n", (uint) system_clock_frequency, (uint)divider);
10193
assert(divider < 0x1000000);
10294
pio_sm_set_clkdiv_int_frac(audio_pio, shared_state.pio_sm, divider >> 8u, divider & 0xffu);
10395
shared_state.freq = sample_freq;
@@ -163,6 +155,23 @@ static struct producer_pool_blocking_give_connection m2s_audio_i2s_pg_connection
163155
}
164156
};
165157

158+
static void pass_thru_producer_give(audio_connection_t *connection, audio_buffer_t *buffer) {
159+
queue_full_audio_buffer(connection->consumer_pool, buffer);
160+
}
161+
162+
static void pass_thru_consumer_give(audio_connection_t *connection, audio_buffer_t *buffer) {
163+
queue_free_audio_buffer(connection->producer_pool, buffer);
164+
}
165+
166+
static struct producer_pool_blocking_give_connection audio_i2s_pass_thru_connection = {
167+
.core = {
168+
.consumer_pool_take = consumer_pool_take_buffer_default,
169+
.consumer_pool_give = pass_thru_consumer_give,
170+
.producer_pool_take = producer_pool_take_buffer_default,
171+
.producer_pool_give = pass_thru_producer_give,
172+
}
173+
};
174+
166175
bool audio_i2s_connect_thru(audio_buffer_pool_t *producer, audio_connection_t *connection) {
167176
return audio_i2s_connect_extra(producer, false, 2, 256, connection);
168177
}
@@ -216,7 +225,10 @@ bool audio_i2s_connect_extra(audio_buffer_pool_t *producer, bool buffer_on_give,
216225
printf("Converting mono to stereo at %d Hz\n", (int) producer->format->sample_freq);
217226
#endif
218227
}
219-
connection = buffer_on_give ? &m2s_audio_i2s_pg_connection.core : &m2s_audio_i2s_ct_connection.core;
228+
if (!buffer_count)
229+
connection = &audio_i2s_pass_thru_connection.core;
230+
else
231+
connection = buffer_on_give ? &m2s_audio_i2s_pg_connection.core : &m2s_audio_i2s_ct_connection.core;
220232
}
221233
audio_complete_connection(connection, producer, audio_i2s_consumer);
222234
return true;
@@ -297,7 +309,12 @@ static inline void audio_start_dma_transfer() {
297309
DEBUG_PINS_XOR(audio_timing, 1);
298310
//DEBUG_PINS_XOR(audio_timing, 2);
299311
// just play some silence
300-
ab = &silence_buffer;
312+
static uint32_t zero;
313+
dma_channel_config c = dma_get_channel_config(shared_state.dma_channel);
314+
channel_config_set_read_increment(&c, false);
315+
dma_channel_set_config(shared_state.dma_channel, &c, false);
316+
dma_channel_transfer_from_buffer_now(shared_state.dma_channel, &zero, PICO_AUDIO_I2S_SILENCE_BUFFER_SAMPLE_LENGTH);
317+
return;
301318
}
302319
assert(ab->sample_count);
303320
// todo better naming of format->format->format!!
@@ -309,6 +326,9 @@ static inline void audio_start_dma_transfer() {
309326
assert(ab->format->format->channel_count == 2);
310327
assert(ab->format->sample_stride == 4);
311328
#endif
329+
dma_channel_config c = dma_get_channel_config(shared_state.dma_channel);
330+
channel_config_set_read_increment(&c, true);
331+
dma_channel_set_config(shared_state.dma_channel, &c, false);
312332
dma_channel_transfer_from_buffer_now(shared_state.dma_channel, ab->buffer->bytes, ab->sample_count);
313333
}
314334

src/rp2_common/pico_audio_i2s/include/pico/audio_i2s.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,6 @@ bool audio_i2s_connect(audio_buffer_pool_t *producer);
152152
* \param producer
153153
*/
154154
bool audio_i2s_connect_s8(audio_buffer_pool_t *producer);
155-
bool audio_i2s_connect_extra(audio_buffer_pool_t *producer, bool buffer_on_give, uint buffer_count, uint samples_per_buffer, audio_connection_t *connection);
156155

157156
/** \brief \todo
158157
* \ingroup pico_audio_i2s

0 commit comments

Comments
 (0)