Convolution ACM
La convolution ACM exécute sur le CPU la réverbération partitionnée de FMOD. Les lots à entrée partagée transforment un seul signal sec, appliquent des partitions d'impulsion en flottant ou en demi-flottant, et additionnent par recouvrement le résultat mouillé.
Notes du dépôt jusqu’au 10 octobre 2026
Le bug qu'elle a clos
Subnautica: Below Zero pouvait démarrer par un grésillement, tomber dans le silence, puis revenir des minutes plus tard. Le PCM qui atteignait le périphérique hôte contenait des flottants non finis. Une trace en mémoire des rappels DSP de FMOD montrait de l'audio fini à l'entrée de la réverbération par convolution et des déchets à la sortie. Les fonctions HLE sceAcm_ConvReverb_SharedInput, la soumission de lot et sceAcmBatchWait renvoyaient le succès sans écrire de sortie.
FMOD mélangeait ensuite dans le graphe ce tampon mouillé non écrit. Les NaN se répandaient dans les effets suivants. Le traitement d'AudioOut les remplaçait par du silence et ne pouvait pas réparer l'historique de filtre empoisonné. Une seconde erreur faisait réussir l'attente sur l'identifiant de lot initial -1. FMOD traite une attente initiale échouée comme « il n'y a pas encore de tampon mouillé précédent » et ne mélange qu'après un vrai travail achevé.
Convolution partitionnée
La disposition du descripteur correspond à celle observée dans le backend ACM de FMOD. Les partitions de réponse impulsionnelle sont des bins complexes entrelacés. Un bloc de B bins appartient à une transformée de longueur 2B. Les tampons d'entrée, de sortie et de recouvrement sont distincts et planaires. Seules les dispositions de spectre float32 et float16 à décalage nul qui ont été observées sont acceptées.
Un lot s'exécute sur le CPU. L'historique d'entrée est conservé d'un grain à l'autre et à travers le rebouclage de l'anneau, et le recouvrement est reporté dans le grain de sortie suivant. Plusieurs sorties peuvent partager une transformée d'entrée et une seule avance d'historique. Une entrée mono peut alimenter plus d'un canal. La transformée inverse est normalisée. Une inverse indépendante d'une partition d'impulsion réelle plaçait son énergie dans la première moitié du bloc complété par des zéros, ce qui confirme le signe du spectre. L'impulsion empaquetée qu'utilise le jeu omet le bin de Nyquist.
Attentes, limites et nouvel essai
Les constructeurs capturent les tableaux de pointeurs et les gains dans un enregistrement de commande borné. Le PCM lui-même est lu au démarrage du lot. Une attente ne réussit que pour un lot que ce contexte a réellement achevé. Détruire le contexte relâche l'historique. Les bornes invalides, les encodages de commande inconnus et les dispositions non prises en charge renvoient des erreurs.
Les opérations ACM autonomes de FFT, d'IFFT et de panoramique ne sont pas implémentées. Les canaux sont plafonnés à 8, les sorties à 32 et le bloc à 1024. Le stockage de l'historique est borné. Sur le runner signé, 90 instantanés PCM à raison d'un par seconde ne contenaient aucun échantillon non fini, avec un pic de 0.1255 et le premier audio au-dessus de 0.001 à 11.03 secondes. Le mainteneur a confirmé le son. Ces échantillons sont une sonde, pas chaque échantillon émis par le jeu.
Ce qui est en place
- Convolution FFT partitionnée pour les lots de réverbération à entrée partagée et à IR partagée de FMOD.
- Spectres complexes float32 et float16, addition par recouvrement, et historique d'un grain à l'autre.
- Des attentes qui ne réussissent que pour un lot achevé de ce contexte. L'identifiant initial -1 échoue.
- Du PCM fini au nouvel essai de Subnautica, le grésillement et le silence ultérieur ayant disparu.
Ce qui manque encore
- Les appels ACM autonomes de FFT, d'IFFT et de panoramique ne sont pas implémentés.
- Les décalages de spectre non nuls et les dispositions de routage non mesurées sont rejetés.
- La convolution s'exécute sur le CPU. Il n'y a pas de chemin FFT sur le GPU.
Mécanismes liés
Ce que ces pages décrivent