Demander au décodeur, pas à l'extension
La plupart de mes fichiers ne se lisaient plus. L'app promettait l'Opus sur la foi d'une liste d'extensions que son moteur audio ne savait pas honorer. Le correctif : demander au décodeur lui-même. Et la mesure qui a empêché d'uniformiser trop loin.
La plupart de mes fichiers ne se lisent plus
C'est le constat qui ouvre le chantier de la v0.16.0 d'AquaTube (16 juillet 2026). Pas un problème de chemins, pas une base corrompue : des fichiers sains, indexés, proposés dans les dialogues de l'app, et muets à la lecture. Au premier rang, les .opus.
La cause était une promesse. Quelque part dans le code, une liste d'extensions déclarait l'Opus pris en charge. L'indexeur croyait cette liste. Le moteur audio, Symphonia, n'a aucune prise en charge de l'Opus. Deux vérités parallèles vivaient dans la même app : celle de la déclaration et celle du code qui fait le travail. L'utilisateur, lui, voyait un lecteur qui promettait un format et se taisait.
Une liste d'extensions est une déclaration
Le problème n'est pas propre à l'Opus. Une liste d'extensions, c'est une déclaration de capacité écrite à la main, à distance du code qui doit l'honorer. Chaque fois que le moteur évolue, la liste devrait suivre ; personne ne fait jamais cette synchronisation. ALAC, WMA : mêmes absents, même silence.
Et une liste ne peut que mentir dans les deux sens. Trop large, elle promet ce qu'on ne sait pas décoder. Trop étroite, elle refuse ce qu'on saurait lire. Dans les deux cas, elle répond à la place de quelqu'un qui connaît la vraie réponse.
Demander à celui qui fait le travail
Le correctif de la v0.16.0 tient en une phrase : on demande à Symphonia, et s'il décline, FFmpeg prend le relais. FFmpeg était déjà livré avec l'app pour la vidéo ; il sait décoder l'Opus, l'ALAC, le WMA, sans qu'on ait à les nommer. Aucune liste d'extensions ne décide plus rien, donc aucune ne peut mentir.
Le fichier est sondé pour ce qu'il contient, pas pour ce que son nom raconte. La capacité s'établit en essayant, au moment où elle compte, sur le fichier concerné.
La tentation de l'uniforme
Si FFmpeg sait tout lire, pourquoi garder deux moteurs ? Tout basculer sur FFmpeg aurait simplifié l'architecture : un seul chemin de code, plus de repli à maintenir.
Avant de trancher, une sonde dédiée a décodé les mêmes fichiers deux fois, en entier, avec les deux moteurs, et compté les échantillons rendus. Sur les mp3 réels de la bibliothèque, FFmpeg rend 1152 échantillons de plus que Symphonia : une trame MP3 pleine, 26 ms de padding LAME/Xing que Symphonia coupe et que FFmpeg laissait passer. Inaudible sur une piste isolée. Aux frontières de piste d'un album mixé en continu, c'est un accroc net, à chaque transition. Et ces albums vivent précisément dans la part de la bibliothèque qui marchait encore, les 32 % qu'il ne fallait surtout pas dégrader.
Le mp3 reste donc sur Symphonia. L'uniformité aurait cassé les fichiers qui marchaient pour faire jouer ceux qui ne marchaient pas.
Ce que je retiens
Deux décisions dans ce lot, un seul principe : interroger la réalité plutôt que la déclaration. Pour savoir si un format se décode, on demande au décodeur. Pour choisir entre deux décodeurs capables, on mesure leur sortie, échantillon par échantillon.
La règle transposable : chaque fois qu'une table écrite à la main prétend répondre à la place du code, il existe une version de la question qu'on peut poser directement au code. Elle est toujours plus chère à poser, et toujours moins chère que le mensonge.