@@ -97,27 +97,28 @@ STATIC void fill_buffers(audiopwmio_pwmaudioout_obj_t *self, int buf) {
97
97
common_hal_audiopwmio_pwmaudioout_stop (self );
98
98
return ;
99
99
}
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 ;
101
102
102
103
if (self -> bytes_per_sample == 1 ) {
103
104
uint8_t offset = self -> signed_to_unsigned ? 0x80 : 0 ;
104
105
uint16_t scale = self -> scale ;
105
- for ( uint32_t i = 0 ; i < buffer_length / self -> spacing ; i ++ ) {
106
+ while ( dev_buffer < end_dev_buffer ) {
106
107
uint8_t rawval = (* buffer ++ + offset );
107
108
uint16_t val = (uint16_t )(((uint32_t )rawval * (uint32_t )scale ) >> 8 );
108
109
* dev_buffer ++ = val ;
109
- if (self -> spacing == 1 )
110
+ if (self -> sample_channel_count == 1 )
110
111
* dev_buffer ++ = val ;
111
112
}
112
113
} else {
113
114
uint16_t offset = self -> signed_to_unsigned ? 0x8000 : 0 ;
114
115
uint16_t scale = self -> scale ;
115
116
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 ) {
117
118
uint16_t rawval = (* buffer16 ++ + offset );
118
119
uint16_t val = (uint16_t )((rawval * (uint32_t )scale ) >> 16 );
119
120
* dev_buffer ++ = val ;
120
- if (self -> spacing == 1 )
121
+ if (self -> sample_channel_count == 1 )
121
122
* dev_buffer ++ = val ;
122
123
}
123
124
}
@@ -231,9 +232,12 @@ void common_hal_audiopwmio_pwmaudioout_play(audiopwmio_pwmaudioout_obj_t* self,
231
232
self -> bytes_per_sample = audiosample_bits_per_sample (sample ) / 8 ;
232
233
233
234
uint32_t max_buffer_length ;
235
+ uint8_t spacing ;
234
236
audiosample_get_buffer_structure (sample , /* single channel */ false,
235
237
& 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
+
237
241
if (max_buffer_length > UINT16_MAX ) {
238
242
mp_raise_ValueError_varg (translate ("Buffer length %d too big. It must be less than %d" ), max_buffer_length , UINT16_MAX );
239
243
}
0 commit comments