@@ -295,6 +295,87 @@ static inline uint32_t mult16signed(uint32_t val, int32_t mul) {
295295 #endif
296296}
297297
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+
298379audioio_get_buffer_result_t audiomixer_mixer_get_buffer (audiomixer_mixer_obj_t * self ,
299380 bool single_channel ,
300381 uint8_t channel ,
@@ -325,83 +406,7 @@ audioio_get_buffer_result_t audiomixer_mixer_get_buffer(audiomixer_mixer_obj_t*
325406 for (int32_t v = 0 ; v < self -> voice_count ; v ++ ) {
326407 audiomixer_mixervoice_obj_t * voice = MP_OBJ_TO_PTR (self -> voice [v ]);
327408
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 ));
405410 voices_active = true;
406411 }
407412
0 commit comments