@@ -97,27 +97,28 @@ STATIC void fill_buffers(audiopwmio_pwmaudioout_obj_t *self, int buf) {
9797 common_hal_audiopwmio_pwmaudioout_stop (self );
9898 return ;
9999 }
100- uint32_t num_samples = buffer_length / self -> bytes_per_sample / self -> spacing ;
100+ uint32_t num_samples = buffer_length / self -> bytes_per_sample / self -> sample_channel_count ;
101+ uint16_t * end_dev_buffer = dev_buffer + 2 * num_samples ;
101102
102103 if (self -> bytes_per_sample == 1 ) {
103104 uint8_t offset = self -> signed_to_unsigned ? 0x80 : 0 ;
104105 uint16_t scale = self -> scale ;
105- for ( uint32_t i = 0 ; i < buffer_length / self -> spacing ; i ++ ) {
106+ while ( dev_buffer < end_dev_buffer ) {
106107 uint8_t rawval = (* buffer ++ + offset );
107108 uint16_t val = (uint16_t )(((uint32_t )rawval * (uint32_t )scale ) >> 8 );
108109 * dev_buffer ++ = val ;
109- if (self -> spacing == 1 )
110+ if (self -> sample_channel_count == 1 )
110111 * dev_buffer ++ = val ;
111112 }
112113 } else {
113114 uint16_t offset = self -> signed_to_unsigned ? 0x8000 : 0 ;
114115 uint16_t scale = self -> scale ;
115116 uint16_t * buffer16 = (uint16_t * )buffer ;
116- for ( uint32_t i = 0 ; i < buffer_length / 2 / self -> spacing ; i ++ ) {
117+ while ( dev_buffer < end_dev_buffer ) {
117118 uint16_t rawval = (* buffer16 ++ + offset );
118119 uint16_t val = (uint16_t )((rawval * (uint32_t )scale ) >> 16 );
119120 * dev_buffer ++ = val ;
120- if (self -> spacing == 1 )
121+ if (self -> sample_channel_count == 1 )
121122 * dev_buffer ++ = val ;
122123 }
123124 }
@@ -231,9 +232,12 @@ void common_hal_audiopwmio_pwmaudioout_play(audiopwmio_pwmaudioout_obj_t* self,
231232 self -> bytes_per_sample = audiosample_bits_per_sample (sample ) / 8 ;
232233
233234 uint32_t max_buffer_length ;
235+ uint8_t spacing ;
234236 audiosample_get_buffer_structure (sample , /* single channel */ false,
235237 & self -> single_buffer , & self -> signed_to_unsigned , & max_buffer_length ,
236- & self -> spacing );
238+ & spacing );
239+ self -> sample_channel_count = audiosample_channel_count (sample );
240+
237241 if (max_buffer_length > UINT16_MAX ) {
238242 mp_raise_ValueError_varg (translate ("Buffer length %d too big. It must be less than %d" ), max_buffer_length , UINT16_MAX );
239243 }
0 commit comments