@@ -150,15 +150,7 @@ void audio_dma_load_next_block(audio_dma_t *dma) {
150
150
audio_dma_stop (dma );
151
151
return ;
152
152
}
153
- bool busy0 = dma_channel_is_busy (dma -> channel [0 ]);
154
- bool busy1 = dma_channel_is_busy (dma -> channel [1 ]);
155
- if (busy0 == busy1 ) {
156
- mp_printf (& mp_plat_print , "busy: %d %d\n" , busy0 , busy1 );
157
- }
158
153
159
- if (buffer_length < 256 ) {
160
- mp_printf (& mp_plat_print , "%d length: %d\n" , dma -> first_channel_free , buffer_length );
161
- }
162
154
audio_dma_convert_signed (dma , buffer , buffer_length , & output_buffer , & output_buffer_length );
163
155
164
156
// If we don't have an output buffer, save the pointer to first_buffer for use in the single
@@ -169,13 +161,21 @@ void audio_dma_load_next_block(audio_dma_t *dma) {
169
161
170
162
dma_channel_set_trans_count (dma_channel , output_buffer_length / dma -> output_size , false /* trigger */ );
171
163
dma_channel_set_read_addr (dma_channel , output_buffer , false /* trigger */ );
164
+
172
165
if (get_buffer_result == GET_BUFFER_DONE ) {
173
166
if (dma -> loop ) {
174
167
audiosample_reset_buffer (dma -> sample , dma -> single_channel_output , dma -> audio_channel );
175
168
} else {
176
- // Set channel trigger to ourselves so we don't keep going.
177
- dma_channel_hw_t * c = & dma_hw -> ch [dma_channel ];
178
- c -> al1_ctrl = (c -> al1_ctrl & ~DMA_CH0_CTRL_TRIG_CHAIN_TO_BITS ) | (dma_channel << DMA_CH0_CTRL_TRIG_CHAIN_TO_LSB );
169
+ if (output_buffer_length == 0 &&
170
+ !dma_channel_is_busy (dma -> channel [0 ]) &&
171
+ !dma_channel_is_busy (dma -> channel [1 ])) {
172
+ // No data has been read, and both DMA channels have now finished, so it's safe to stop.
173
+ audio_dma_stop (dma );
174
+ } else {
175
+ // Set channel trigger to ourselves so we don't keep going.
176
+ dma_channel_hw_t * c = & dma_hw -> ch [dma_channel ];
177
+ c -> al1_ctrl = (c -> al1_ctrl & ~DMA_CH0_CTRL_TRIG_CHAIN_TO_BITS ) | (dma_channel << DMA_CH0_CTRL_TRIG_CHAIN_TO_LSB );
178
+ }
179
179
}
180
180
}
181
181
}
@@ -217,18 +217,17 @@ audio_dma_result audio_dma_setup_playback(audio_dma_t *dma,
217
217
dma -> first_channel_free = true;
218
218
dma -> output_resolution = output_resolution ;
219
219
dma -> sample_resolution = audiosample_bits_per_sample (sample );
220
+ dma -> output_register_address = output_register_address ;
221
+
220
222
audiosample_reset_buffer (sample , single_channel_output , audio_channel );
221
223
222
224
bool single_buffer ;
223
225
bool samples_signed ;
224
226
uint32_t max_buffer_length ;
225
227
audiosample_get_buffer_structure (sample , single_channel_output , & single_buffer , & samples_signed ,
226
228
& max_buffer_length , & dma -> sample_spacing );
227
- mp_printf (& mp_plat_print , "single_buffer: %d, samples_signed: %d, max_buffer_length: %d, dma->sample_spacing: %d\n" ,
228
- single_buffer , samples_signed , max_buffer_length , dma -> sample_spacing ); ////
229
+
229
230
// Check to see if we have to scale the resolution up.
230
- mp_printf (& mp_plat_print , "dma->sample_resolution: %d, dma->output_resolution: %d, output_signed: %d, single_channel_output: %d\n" ,
231
- dma -> sample_resolution , dma -> output_resolution , output_signed , single_channel_output );
232
231
if (dma -> sample_resolution <= 8 && dma -> output_resolution > 8 ) {
233
232
max_buffer_length *= 2 ;
234
233
}
@@ -343,6 +342,14 @@ void audio_dma_stop(audio_dma_t *dma) {
343
342
if (dma_channel_is_busy (channel )) {
344
343
dma_channel_abort (channel );
345
344
}
345
+
346
+ // Write a zero as the last sample. This stops any PWM output.
347
+ if (dma -> output_resolution <= 8 ) {
348
+ * ((uint8_t * )dma -> output_register_address ) = 0 ;
349
+ } else {
350
+ * ((uint16_t * )dma -> output_register_address ) = 0 ;
351
+ }
352
+
346
353
dma_channel_set_read_addr (channel , NULL , false /* trigger */ );
347
354
dma_channel_set_write_addr (channel , NULL , false /* trigger */ );
348
355
dma_channel_set_trans_count (channel , 0 , false /* trigger */ );
0 commit comments