@@ -647,31 +647,29 @@ uint32_t sdio_voice_fill_chunk(sdio_voice_manager_t *manager)
647647 {
648648 sdio_voice_t * voice = & manager -> voices [i ];
649649
650- if (voice -> state == VOICE_INIT && voice -> sectors_filled == RING_SIZE )
650+ if (voice -> state == VOICE_INIT && voice -> sectors_filled >= RING_SIZE / 2 )
651651 {
652652 voice -> state = VOICE_RUNNING ;
653653 }
654654
655- if (voice -> state == VOICE_RUNNING )
655+ if (( voice -> state == VOICE_RUNNING ) && ( voice -> adsr != NULL ) )
656656 {
657- if (voice -> adsr != NULL )
657+ // Generate ADSR envelope into amplitude_buffer (reused as q16_t scratch)
658+ adsr_process_block (voice -> adsr , (q16_t * )manager -> amplitude_buffer ,
659+ manager -> chunk_size );
660+ // Convert q16_t [0..0xFFFF] → Q1_14_t [0..0x3FFF] in-place
661+ for (uint32_t j = 0 ; j < manager -> chunk_size ; j ++ )
658662 {
659- // Generate ADSR envelope into amplitude_buffer (reused as q16_t scratch)
660- adsr_process_block (voice -> adsr , (q16_t * )manager -> amplitude_buffer ,
661- manager -> chunk_size );
662- // Convert q16_t [0..0xFFFF] → Q1_14_t [0..0x3FFF] in-place
663- for (uint32_t j = 0 ; j < manager -> chunk_size ; j ++ )
664- {
665- manager -> amplitude_buffer [j ] =
666- (Q1_14_t )(((uint16_t * )manager -> amplitude_buffer )[j ] >> 2 );
667- }
663+ manager -> amplitude_buffer [j ] =
664+ (Q1_14_t )(((uint16_t * )manager -> amplitude_buffer )[j ] >> 4 );
668665 }
666+
669667 _voice_fill_bloc (voice , manager -> amplitude_buffer ,
670668 manager -> accumulator_buffer , manager -> chunk_size );
671669 nb_active += 1 ;
672670 }
673671
674- if (voice -> state == VOICE_CANCEL && manager -> active_voice_idx != (int )i )
672+ if ((( voice -> state == VOICE_CANCEL ) || ( voice -> state == VOICE_DONE )) && manager -> active_voice_idx != (int )i )
675673 {
676674 voice -> state = VOICE_FREE ;
677675 }
0 commit comments