@@ -125,25 +125,21 @@ STATIC void fill_buffers(audiopwmio_pwmaudioout_obj_t *self, int buf) {
125
125
if (self -> loop && get_buffer_result == GET_BUFFER_DONE ) {
126
126
audiosample_reset_buffer (self -> sample , false, 0 );
127
127
} else if (get_buffer_result == GET_BUFFER_DONE ) {
128
- self -> pwm -> LOOP = 0 ;
128
+ self -> pwm -> SHORTS = NRF_PWM_SHORT_SEQEND0_STOP_MASK | NRF_PWM_SHORT_SEQEND1_STOP_MASK ;
129
129
self -> stopping = true;
130
- } else {
131
- self -> pwm -> LOOP = 0xffff ;
132
130
}
133
131
}
134
132
135
133
STATIC void audiopwmout_background_obj (audiopwmio_pwmaudioout_obj_t * self ) {
136
134
if (!common_hal_audiopwmio_pwmaudioout_get_playing (self ))
137
135
return ;
138
- if (self -> loop && self -> single_buffer ) {
139
- self -> pwm -> LOOP = 0xffff ;
140
- } else if (self -> stopping ) {
136
+ if (self -> stopping ) {
141
137
bool stopped =
142
138
(self -> pwm -> EVENTS_SEQEND [0 ] || !self -> pwm -> EVENTS_SEQSTARTED [0 ]) &&
143
139
(self -> pwm -> EVENTS_SEQEND [1 ] || !self -> pwm -> EVENTS_SEQSTARTED [1 ]);
144
140
if (stopped )
145
141
self -> pwm -> TASKS_STOP = 1 ;
146
- } else if (!self -> single_buffer ) {
142
+ } else if (!self -> paused && ! self -> single_buffer ) {
147
143
if (self -> pwm -> EVENTS_SEQSTARTED [0 ]) fill_buffers (self , 1 );
148
144
if (self -> pwm -> EVENTS_SEQSTARTED [1 ]) fill_buffers (self , 0 );
149
145
}
@@ -248,21 +244,17 @@ void common_hal_audiopwmio_pwmaudioout_play(audiopwmio_pwmaudioout_obj_t* self,
248
244
self -> scale = top - 1 ;
249
245
self -> pwm -> COUNTERTOP = top ;
250
246
251
- if (!self -> single_buffer )
252
- self -> pwm -> LOOP = 1 ;
253
- else if (self -> loop )
254
- self -> pwm -> LOOP = 0xffff ;
255
- else
256
- self -> pwm -> LOOP = 0 ;
247
+ self -> pwm -> LOOP = 1 ;
257
248
audiosample_reset_buffer (self -> sample , false, 0 );
258
249
activate_audiopwmout_obj (self );
259
250
fill_buffers (self , 0 );
260
251
self -> pwm -> SEQ [1 ].PTR = self -> pwm -> SEQ [0 ].PTR ;
261
252
self -> pwm -> SEQ [1 ].CNT = self -> pwm -> SEQ [0 ].CNT ;
262
253
self -> pwm -> EVENTS_SEQSTARTED [0 ] = 0 ;
263
254
self -> pwm -> EVENTS_SEQSTARTED [1 ] = 0 ;
264
- self -> pwm -> TASKS_SEQSTART [0 ] = 1 ;
265
255
self -> pwm -> EVENTS_STOPPED = 0 ;
256
+ self -> pwm -> SHORTS = NRF_PWM_SHORT_LOOPSDONE_SEQSTART0_MASK ;
257
+ self -> pwm -> TASKS_SEQSTART [0 ] = 1 ;
266
258
self -> playing = true;
267
259
self -> stopping = false;
268
260
self -> paused = false;
@@ -282,7 +274,7 @@ void common_hal_audiopwmio_pwmaudioout_stop(audiopwmio_pwmaudioout_obj_t* self)
282
274
}
283
275
284
276
bool common_hal_audiopwmio_pwmaudioout_get_playing (audiopwmio_pwmaudioout_obj_t * self ) {
285
- if (self -> pwm -> EVENTS_STOPPED ) {
277
+ if (! self -> paused && self -> pwm -> EVENTS_STOPPED ) {
286
278
self -> playing = false;
287
279
self -> pwm -> EVENTS_STOPPED = 0 ;
288
280
}
@@ -307,10 +299,15 @@ bool common_hal_audiopwmio_pwmaudioout_get_playing(audiopwmio_pwmaudioout_obj_t*
307
299
*/
308
300
void common_hal_audiopwmio_pwmaudioout_pause (audiopwmio_pwmaudioout_obj_t * self ) {
309
301
self -> paused = true;
302
+ self -> pwm -> SHORTS = NRF_PWM_SHORT_SEQEND1_STOP_MASK ;
303
+ while (!self -> pwm -> EVENTS_STOPPED ) { /* NOTHING */ }
310
304
}
311
305
312
306
void common_hal_audiopwmio_pwmaudioout_resume (audiopwmio_pwmaudioout_obj_t * self ) {
313
307
self -> paused = false;
308
+ self -> pwm -> SHORTS = NRF_PWM_SHORT_LOOPSDONE_SEQSTART0_MASK ;
309
+ self -> pwm -> EVENTS_STOPPED = 0 ;
310
+ self -> pwm -> TASKS_SEQSTART [0 ] = 1 ;
314
311
}
315
312
316
313
bool common_hal_audiopwmio_pwmaudioout_get_paused (audiopwmio_pwmaudioout_obj_t * self ) {
0 commit comments