@@ -295,6 +295,87 @@ static inline uint32_t mult16signed(uint32_t val, int32_t mul) {
295
295
#endif
296
296
}
297
297
298
+ static void mix_one_voice (audiomixer_mixer_obj_t * self ,
299
+ audiomixer_mixervoice_obj_t * voice , bool voices_active ,
300
+ uint32_t * word_buffer , uint32_t length ) {
301
+ uint32_t j = 0 ;
302
+ bool voice_done = voice -> sample == NULL ;
303
+ for (uint32_t i = 0 ; i < length ; i ++ ) {
304
+ if (!voice_done && j >= voice -> buffer_length ) {
305
+ if (!voice -> more_data ) {
306
+ if (voice -> loop ) {
307
+ audiosample_reset_buffer (voice -> sample , false, 0 );
308
+ } else {
309
+ voice -> sample = NULL ;
310
+ voice_done = true;
311
+ }
312
+ }
313
+ if (!voice_done ) {
314
+ // Load another buffer
315
+ audioio_get_buffer_result_t result = audiosample_get_buffer (voice -> sample , false, 0 , (uint8_t * * ) & voice -> remaining_buffer , & voice -> buffer_length );
316
+ // Track length in terms of words.
317
+ voice -> buffer_length /= sizeof (uint32_t );
318
+ voice -> more_data = result == GET_BUFFER_MORE_DATA ;
319
+ j = 0 ;
320
+ }
321
+ }
322
+ // First active voice gets copied over verbatim.
323
+ uint32_t sample_value ;
324
+ if (voice_done ) {
325
+ // Exit early if another voice already set all samples once.
326
+ if (voices_active ) {
327
+ continue ;
328
+ }
329
+ sample_value = 0 ;
330
+ if (!self -> samples_signed ) {
331
+ if (self -> bits_per_sample == 8 ) {
332
+ sample_value = 0x7f7f7f7f ;
333
+ } else {
334
+ sample_value = 0x7fff7fff ;
335
+ }
336
+ }
337
+ } else {
338
+ sample_value = voice -> remaining_buffer [j ];
339
+ }
340
+
341
+ // apply the mixer level
342
+ if (!self -> samples_signed ) {
343
+ if (self -> bits_per_sample == 8 ) {
344
+ sample_value = mult8unsigned (sample_value , voice -> level );
345
+ } else {
346
+ sample_value = mult16unsigned (sample_value , voice -> level );
347
+ }
348
+ } else {
349
+ if (self -> bits_per_sample == 8 ) {
350
+ sample_value = mult8signed (sample_value , voice -> level );
351
+ } else {
352
+ sample_value = mult16signed (sample_value , voice -> level );
353
+ }
354
+ }
355
+
356
+ if (!voices_active ) {
357
+ word_buffer [i ] = sample_value ;
358
+ } else {
359
+ if (self -> bits_per_sample == 8 ) {
360
+ if (self -> samples_signed ) {
361
+ word_buffer [i ] = add8signed (word_buffer [i ], sample_value );
362
+ } else {
363
+ word_buffer [i ] = add8unsigned (word_buffer [i ], sample_value );
364
+ }
365
+ } else {
366
+ if (self -> samples_signed ) {
367
+ word_buffer [i ] = add16signed (word_buffer [i ], sample_value );
368
+ } else {
369
+ word_buffer [i ] = add16unsigned (word_buffer [i ], sample_value );
370
+ }
371
+ }
372
+ }
373
+ j ++ ;
374
+ }
375
+ voice -> buffer_length -= j ;
376
+ voice -> remaining_buffer += j ;
377
+ }
378
+
298
379
audioio_get_buffer_result_t audiomixer_mixer_get_buffer (audiomixer_mixer_obj_t * self ,
299
380
bool single_channel ,
300
381
uint8_t channel ,
@@ -325,83 +406,7 @@ audioio_get_buffer_result_t audiomixer_mixer_get_buffer(audiomixer_mixer_obj_t*
325
406
for (int32_t v = 0 ; v < self -> voice_count ; v ++ ) {
326
407
audiomixer_mixervoice_obj_t * voice = MP_OBJ_TO_PTR (self -> voice [v ]);
327
408
328
- uint32_t j = 0 ;
329
- bool voice_done = voice -> sample == NULL ;
330
- for (uint32_t i = 0 ; i < self -> len / sizeof (uint32_t ); i ++ ) {
331
- if (!voice_done && j >= voice -> buffer_length ) {
332
- if (!voice -> more_data ) {
333
- if (voice -> loop ) {
334
- audiosample_reset_buffer (voice -> sample , false, 0 );
335
- } else {
336
- voice -> sample = NULL ;
337
- voice_done = true;
338
- }
339
- }
340
- if (!voice_done ) {
341
- // Load another buffer
342
- audioio_get_buffer_result_t result = audiosample_get_buffer (voice -> sample , false, 0 , (uint8_t * * ) & voice -> remaining_buffer , & voice -> buffer_length );
343
- // Track length in terms of words.
344
- voice -> buffer_length /= sizeof (uint32_t );
345
- voice -> more_data = result == GET_BUFFER_MORE_DATA ;
346
- j = 0 ;
347
- }
348
- }
349
- // First active voice gets copied over verbatim.
350
- uint32_t sample_value ;
351
- if (voice_done ) {
352
- // Exit early if another voice already set all samples once.
353
- if (voices_active ) {
354
- continue ;
355
- }
356
- sample_value = 0 ;
357
- if (!self -> samples_signed ) {
358
- if (self -> bits_per_sample == 8 ) {
359
- sample_value = 0x7f7f7f7f ;
360
- } else {
361
- sample_value = 0x7fff7fff ;
362
- }
363
- }
364
- } else {
365
- sample_value = voice -> remaining_buffer [j ];
366
- }
367
-
368
- // apply the mixer level
369
- if (!self -> samples_signed ) {
370
- if (self -> bits_per_sample == 8 ) {
371
- sample_value = mult8unsigned (sample_value , voice -> level );
372
- } else {
373
- sample_value = mult16unsigned (sample_value , voice -> level );
374
- }
375
- } else {
376
- if (self -> bits_per_sample == 8 ) {
377
- sample_value = mult8signed (sample_value , voice -> level );
378
- } else {
379
- sample_value = mult16signed (sample_value , voice -> level );
380
- }
381
- }
382
-
383
- if (!voices_active ) {
384
- word_buffer [i ] = sample_value ;
385
- } else {
386
- if (self -> bits_per_sample == 8 ) {
387
- if (self -> samples_signed ) {
388
- word_buffer [i ] = add8signed (word_buffer [i ], sample_value );
389
- } else {
390
- word_buffer [i ] = add8unsigned (word_buffer [i ], sample_value );
391
- }
392
- } else {
393
- if (self -> samples_signed ) {
394
- word_buffer [i ] = add16signed (word_buffer [i ], sample_value );
395
- } else {
396
- word_buffer [i ] = add16unsigned (word_buffer [i ], sample_value );
397
- }
398
- }
399
- }
400
- j ++ ;
401
- }
402
- voice -> buffer_length -= j ;
403
- voice -> remaining_buffer += j ;
404
-
409
+ mix_one_voice (self , voice , voices_active , word_buffer , self -> len / sizeof (uint32_t ));
405
410
voices_active = true;
406
411
}
407
412
0 commit comments