@@ -43,8 +43,6 @@ audio_buffer_format_t pio_i2s_consumer_buffer_format = {
43
43
.format = & pio_i2s_consumer_format ,
44
44
};
45
45
46
- static audio_buffer_t silence_buffer ;
47
-
48
46
static void __isr __time_critical_func (audio_i2s_dma_irq_handler )();
49
47
50
48
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
61
59
62
60
audio_i2s_program_init (audio_pio , sm , offset , config -> data_pin , config -> clock_pin_base );
63
61
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
-
68
62
__mem_fence_release ();
69
63
uint8_t dma_channel = config -> dma_channel ;
70
64
dma_channel_claim (dma_channel );
@@ -93,11 +87,9 @@ const audio_format_t *audio_i2s_setup(const audio_format_t *intended_audio_forma
93
87
static audio_buffer_pool_t * audio_i2s_consumer ;
94
88
95
89
static void update_pio_frequency (uint32_t sample_freq ) {
96
- printf ("setting pio freq %d\n" , (int ) sample_freq );
97
90
uint32_t system_clock_frequency = clock_get_hz (clk_sys );
98
91
assert (system_clock_frequency < 0x40000000 );
99
92
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 );
101
93
assert (divider < 0x1000000 );
102
94
pio_sm_set_clkdiv_int_frac (audio_pio , shared_state .pio_sm , divider >> 8u , divider & 0xffu );
103
95
shared_state .freq = sample_freq ;
@@ -163,6 +155,23 @@ static struct producer_pool_blocking_give_connection m2s_audio_i2s_pg_connection
163
155
}
164
156
};
165
157
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
+
166
175
bool audio_i2s_connect_thru (audio_buffer_pool_t * producer , audio_connection_t * connection ) {
167
176
return audio_i2s_connect_extra (producer , false, 2 , 256 , connection );
168
177
}
@@ -216,7 +225,10 @@ bool audio_i2s_connect_extra(audio_buffer_pool_t *producer, bool buffer_on_give,
216
225
printf ("Converting mono to stereo at %d Hz\n" , (int ) producer -> format -> sample_freq );
217
226
#endif
218
227
}
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 ;
220
232
}
221
233
audio_complete_connection (connection , producer , audio_i2s_consumer );
222
234
return true;
@@ -297,7 +309,12 @@ static inline void audio_start_dma_transfer() {
297
309
DEBUG_PINS_XOR (audio_timing , 1 );
298
310
//DEBUG_PINS_XOR(audio_timing, 2);
299
311
// 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 ;
301
318
}
302
319
assert (ab -> sample_count );
303
320
// todo better naming of format->format->format!!
@@ -309,6 +326,9 @@ static inline void audio_start_dma_transfer() {
309
326
assert (ab -> format -> format -> channel_count == 2 );
310
327
assert (ab -> format -> sample_stride == 4 );
311
328
#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);
312
332
dma_channel_transfer_from_buffer_now (shared_state .dma_channel , ab -> buffer -> bytes , ab -> sample_count );
313
333
}
314
334
0 commit comments