Audio bit-perfect sur Android : mythe vs réalité
Ce que la lecture bit-perfect signifie vraiment sur Android, pourquoi c'est plus difficile qu'on ne le pense, et comment vérifier que votre chaîne audio ne rééchantillonne pas secrètement votre musique.
Que signifie bit-perfect ?
La lecture bit-perfect signifie que les données audio atteignant votre DAC sont identiques à celles stockées dans le fichier source. Pas similaires. Pas “assez proches.” Identiques, bit pour bit.
Pour qu’un signal soit véritablement bit-perfect, rien dans la chaîne audio ne peut altérer les données entre la sortie du décodeur et l’entrée du DAC. Cela signifie :
- Pas de rééchantillonnage. Un fichier 44,1 kHz est lu à 44,1 kHz, pas à 48 kHz.
- Pas d’ajustement de volume. La mise à l’échelle numérique du volume modifie les valeurs des échantillons.
- Pas de traitement DSP. EQ, crossfeed, ReplayGain, limitation — tout cela modifie le signal.
- Pas de dithering. Ajouter du bruit pour masquer les artefacts de quantification modifie quand même les données.
Si une seule étape de la chaîne modifie ne serait-ce qu’un seul échantillon, la sortie n’est plus bit-perfect. C’est une propriété binaire — il n’existe pas de “presque bit-perfect.”
Pourquoi est-ce important ? Chaque transformation introduit un certain degré d’erreur. Le rééchantillonnage ajoute des artefacts d’interpolation. La mise à l’échelle du volume réduit la profondeur de bits effective. Même un traitement de haute qualité reste un traitement. Pour les auditeurs qui ont investi dans des fichiers sources haute résolution et des DAC performants, préserver le signal original est le but même.
Pourquoi Android rend le bit-perfect difficile
Chaque application audio sur Android passe par un composant système appelé AudioFlinger. C’est le mixeur et routeur audio — le hub central qui prend l’audio de chaque application de votre téléphone et le combine en un seul flux de sortie pour le matériel.
Le problème est qu’AudioFlinger a sa propre opinion sur le taux d’échantillonnage que votre audio devrait avoir. La plupart des appareils Android configurent AudioFlinger à 48 kHz. Quand votre musique est à un taux différent — 44,1 kHz pour la qualité CD, 96 kHz pour le hi-res — AudioFlinger la rééchantillonne pour correspondre au taux configuré de l’appareil.
Ce rééchantillonnage se fait silencieusement. Votre lecteur de musique peut afficher “Lecture : FLAC 44,1 kHz”, mais le signal réel atteignant le DAC a été converti à 48 kHz par le système d’exploitation. La plupart des lecteurs ne savent même pas que cela se produit, encore moins vous en informent.
Le chemin audio sur Android ressemble à ceci :
App -> API AAudio -> AudioFlinger -> Pilote audio -> Matériel
AudioFlinger se trouve au milieu de chaque chemin audio. Contrairement aux systèmes d’exploitation de bureau où les applications peuvent parfois obtenir un accès exclusif au matériel audio (mode exclusif WASAPI sous Windows, par exemple), Android n’offre pas de moyen de contourner entièrement AudioFlinger. Il est toujours dans la chaîne.
Cela compte même pour des raisons subtiles. Convertir 44,1 kHz en 48 kHz n’est pas un ratio entier propre — cela nécessite une interpolation qui introduit des artefacts. Ces artefacts peuvent être inaudibles sur les haut-parleurs du téléphone, mais sur un setup d’écouteurs résolvant ou un DAC de qualité, ils représentent une dégradation inutile d’un audio pour lequel vous avez peut-être payé un supplément.
La solution USB DAC
Les USB DAC externes changent considérablement l’équation. Quand vous connectez un USB DAC à votre appareil Android, le pilote audio peut potentiellement supporter les taux d’échantillonnage natifs du DAC plutôt qu’être verrouillé sur la configuration interne de 48 kHz du téléphone.
La clé est la négociation du taux d’échantillonnage — le processus d’interrogation des taux réellement supportés par le DAC et de demande du bon :
- L’application ouvre un flux audio temporaire sans spécifier de taux, laissant Android rapporter ce que l’appareil USB supporte nativement.
- L’application demande ensuite un flux au taux optimal pour le morceau en cours.
- Après l’ouverture du flux, l’application lit le taux effectivement accordé — car Android peut avoir accordé un taux différent de celui demandé.
- Si le taux accordé ne correspond pas au fichier source, l’application doit décider si elle rééchantillonne ou signale une erreur.
Beaucoup de USB DAC supportent des taux de 44,1 kHz jusqu’à 384 kHz. Quand le pilote d’Android supporte correctement le DAC connecté, l’application peut demander le taux natif du morceau et l’obtenir sans aucun rééchantillonnage — ni par l’application, ni par l’OS.
Mais “supporte correctement” fait beaucoup de travail dans cette phrase. Le pilote de classe audio USB d’Android gère la communication USB réelle, et son comportement varie selon les appareils et les versions d’Android. Un DAC qui fonctionne parfaitement sur un téléphone peut avoir des particularités de pilote sur un autre. C’est la réalité de l’audio USB sur Android qu’aucune application ne peut entièrement abstraire.
Comment vérifier la lecture bit-perfect
La plupart des lecteurs de musique ne vous disent pas ce qui arrive réellement à votre audio. Vous voyez un indicateur “lecture en cours” et peut-être le format du fichier, mais le chemin du signal réel — si un rééchantillonnage a eu lieu, à quel taux le matériel fonctionne, si l’OS a inséré un traitement — reste invisible.
Nous avons construit les diagnostics du chemin du signal d’Echobox pour résoudre exactement cela. L’écran de diagnostics vous montre l’ensemble de la chaîne audio en temps réel :
- Format source — le codec, le taux d’échantillonnage et la profondeur de bits de votre fichier
- Étape de décodage — ce que le décodeur a produit
- Chaîne DSP — quelles étapes de traitement sont actives et lesquelles sont contournées
- Format de sortie — le taux d’échantillonnage et le format réels envoyés à l’API audio
- Taux de l’appareil — à quel taux le matériel fonctionne
- Indicateur de rééchantillonnage — un avertissement explicite si un rééchantillonnage se produit quelque part dans la chaîne
Si votre FLAC 96 kHz est rééchantillonné à 48 kHz parce que le DAC de votre téléphone ne supporte pas 96 kHz, vous le verrez. Si le mode bit-perfect est actif et que toutes les étapes sont contournées, vous le verrez aussi. Pas de devinettes, pas d’espoir, pas de confiance aveugle que les badges “HD Audio” signifient quoi que ce soit.
Ce niveau de transparence est rare. La plupart des lecteurs traitent le pipeline audio comme une boîte noire et ne vous donnent aucun outil pour vérifier ce qui s’y passe. Pour quiconque est sérieux au sujet de la qualité audio, la vérification compte autant que la capacité.
Comment Echobox atteint la sortie bit-perfect
Nous avons conçu l’architecture d’Echobox en trois couches, chacune choisie pour une raison spécifique :
- Flutter gère l’interface utilisateur — les écrans avec lesquels vous interagissez.
- Rust gère le décodage, les E/S fichiers, la gestion d’état et l’orchestration.
- Zig gère le callback audio temps réel — le code qui s’exécute toutes les ~10 millisecondes quand l’OS demande le prochain bloc d’échantillons audio.
Cette séparation est importante pour la lecture bit-perfect. Le moteur audio Zig lit des échantillons pré-décodés depuis un tampon circulaire sans verrou (rempli par Rust) et applique normalement une chaîne DSP à sept étapes : ReplayGain, préampli, EQ paramétrique, crossfeed, volume, EQ graphique et limiteur.
Quand le mode bit-perfect est activé, toute la chaîne DSP Zig est contournée. Le callback copie les échantillons directement du tampon circulaire vers le tampon de sortie sans aucun traitement. Côté Rust, l’application :
- Demande le taux d’échantillonnage natif exact du morceau à l’API audio — pas le taux par défaut de l’appareil, mais le taux qui correspond au fichier source.
- Vérifie quel taux a été accordé en relisant la configuration réelle du flux.
- Refuse de rééchantillonner silencieusement. Si le DAC ne peut pas fournir le taux demandé, la lecture échoue avec une erreur claire plutôt que de dégrader silencieusement le signal.
La combinaison de la négociation directe du taux d’échantillonnage, du contournement DSP et de la gestion transparente des erreurs vous donne la chose la plus proche d’une vraie sortie bit-perfect qu’Android permette. Ce que nous contrôlons — le traitement au niveau de l’application — est véritablement bit-perfect. Ce qui se passe à l’intérieur d’AudioFlinger et du pilote USB dépend d’Android, mais pour les USB DAC bien supportés avec des taux correspondants, AudioFlinger laisse typiquement passer les échantillons sans modification.
Quand vous pourriez NE PAS vouloir le bit-perfect
Le mode bit-perfect est un outil, pas un objectif universel. Il y a d’excellentes raisons de le laisser désactivé :
Vous utilisez un EQ. Si vous avez un profil EQ paramétrique corrigeant la réponse en fréquence de vos écouteurs, le mode bit-perfect le contournera entièrement. L’EQ ne fonctionne que quand la chaîne DSP est active. Pour beaucoup d’auditeurs, un EQ bien réglé sur de bons écouteurs produit une meilleure expérience d’écoute qu’un signal bit-perfect à travers des écouteurs non corrigés.
Vous utilisez ReplayGain. La normalisation du volume à travers votre bibliothèque nécessite d’appliquer des ajustements de gain à chaque morceau. C’est du traitement DSP, et il est désactivé en mode bit-perfect. Si vous écoutez des albums de différentes époques ou genres, les sauts de volume entre les morceaux sans ReplayGain peuvent être désagréables.
Vous utilisez le crossfeed. Le crossfeed pour écouteurs simule la diaphonie inter-auriculaire que vous entendriez avec des enceintes, réduisant la séparation stéréo exagérée de l’écoute au casque. C’est subtil, mais beaucoup d’auditeurs trouvent que cela réduit la fatigue lors de longues sessions. Le mode bit-perfect le contourne.
Vous utilisez la correction de pièce. Si vous avez mesuré votre environnement d’écoute et créé des filtres de correction, ceux-ci font aussi partie de la chaîne DSP.
Le but du mode bit-perfect n’est pas qu’il sonne toujours mieux. Le but est d’avoir le choix. Vous pouvez vérifier que votre DAC reçoit un signal non modifié quand vous voulez tester du matériel, comparer des DAC, ou simplement savoir que rien n’altère votre musique. Et vous pouvez le désactiver quand le traitement DSP améliore véritablement votre expérience.
La plupart des auditeurs obtiendront en fait un meilleur son avec le bit-perfect DÉSACTIVÉ et un bon profil EQ. Le bit-perfect est pour la vérification et les tests, pas pour l’écoute quotidienne. Nous avons intégré les deux chemins dans Echobox parce que prétendre qu’une seule réponse convient à tout le monde serait malhonnête.
La version courte
- Bit-perfect signifie zéro modification du signal audio entre le fichier et le DAC — pas de rééchantillonnage, pas de changements de volume, pas de DSP.
- L’AudioFlinger d’Android rééchantillonne par défaut, typiquement à 48 kHz, et la plupart des lecteurs de musique ne peuvent ni le contourner ni même le détecter.
- Les USB DAC offrent un chemin vers le bit-perfect en supportant le taux d’échantillonnage natif du fichier source, mais le succès dépend du support du pilote Android pour votre DAC spécifique.
- La vérification compte plus que les affirmations. Les diagnostics du chemin du signal d’Echobox vous montrent exactement ce qui se passe à chaque étape, pour que vous n’ayez jamais à deviner.
- Bit-perfect et DSP sont mutuellement exclusifs. EQ, crossfeed, ReplayGain et limitation nécessitent tous de modifier le signal. Echobox vous laisse choisir ce qui compte le plus pour une session donnée.
- Aucune application ne peut entièrement contourner le système audio d’Android. Nous faisons tout ce qui est en notre contrôle pour délivrer un signal non modifié, mais AudioFlinger reste dans le chemin. Pour les USB DAC supportés avec des taux correspondants, il est typiquement transparent.
Guides connexes : Comprendre le FLAC et l’audio sans perte | Audio hi-res sur Android | Correction de pièce pour l’audio | Ce qui fait un lecteur audiophile