Notes techniques
Caractéristiques, fonctionnement de la conversion et de la sortie, appareils testés et autres détails. Cette page fait suite à la page Fonctionnalités.
Caractéristiques principales
| Android | 4.0 et versions ultérieures |
|---|---|
| Processeur | ARM (armeabi-v7a, arm64-v8a). Des builds Intel (x86, x86_64) sont aussi inclus (pas encore testés sur un téléphone Intel) |
| Autorisations | Accès au stockage, entre autres. L’accès à Internet n’est utilisé que lorsque « Network features » est activé |
| Formats lus par le moteur de reTONE | WAV, AIFF/AIFC, DSF, DFF (non compressé), FLAC, ALAC, Opus (Opus uniquement sur les téléphones ARM) |
| Morceaux traités par le moteur de reTONE | Android 4.x : tous les FLAC et WAV. Android 5 et versions ultérieures : sur les chemins qui passent par le mixeur d’Android, les FLAC, WAV et ALAC dont la fréquence diffère de celle de la sortie, ou dont la profondeur dépasse 16 bits (désactivable avec le réglage « Conversion by reTONE ») |
|---|---|
| Conversion de fréquence d’échantillonnage | Filtre FIR à fenêtre de Kaiser (polyphase). À ±0.001 dB près jusqu’à 20 kHz (valeur de conception ; pour les conversions entre fréquences de 44.1 kHz ou plus) |
| Format transmis par le moteur à Android | Flottant 32 bits sous Android 5 et versions ultérieures, 16 bits sous 4.x (dither uniquement pour les valeurs que 16 bits ne peuvent pas représenter exactement). La profondeur de bits en sortie du téléphone dépend du téléphone |
| DAC USB | USB Audio Class 2. La Class 1 est aussi prise en charge (avec des essais limités en conditions réelles). Les morceaux dont la fréquence est prise en charge par le DAC et acheminable par le téléphone sont envoyés sans rééchantillonnage. Conteneurs 32 bits privilégiés (24 ou 16 bits à défaut). DSD natif sous certaines conditions |
| Signature | Toutes les versions distribuées sont signées avec la même clé |
Formats pris en charge
Les formats que l’Android du téléphone sait lire sont lus avec le décodeur et le traitement audio du téléphone. Le DSD, l’AIFF, ainsi que les FLAC et WAV haute résolution qu’Android ne sait pas lire, sont lus par le moteur de reTONE.
| Lus par Android | FLAC, AAC, MP3, Ogg Vorbis, WAV, Opus, etc. |
|---|---|
| Lus par le moteur de reTONE | DSD (DSF, DFF), AIFF, WAV 32 bits, ALAC (lorsque le téléphone ne peut pas le lire). Sous Android 4.x, tous les FLAC et WAV, ainsi que l’Opus (sur les téléphones ARM). De plus, lorsque Android ne parvient pas à lire un FLAC, WAV, AIFF, ALAC ou Opus, le moteur de reTONE tente de le lire (pour l’ALAC et l’Opus, également lorsque la lecture se bloque sans erreur) |
| Non pris en charge | DFF compressé en DST, APE, WMA Lossless |
Détails techniques
Avec des morceaux sans perte ou non compressés, tout décodeur correctement écrit restitue les mêmes données. Abstraction faite des effets sonores du téléphone, le son change principalement à trois endroits : la conversion de fréquence d’échantillonnage, la troncature de la profondeur de bits, et le calcul du volume et le mixeur. reTONE s’occupe de ces trois points.
Contexte : ce qui influe sur la qualité sonore
Les morceaux sans perte comme le FLAC et les morceaux non compressés comme le WAV sont restitués exactement à l’identique par tout décodeur correctement écrit, quelle que soit l’application qui les lit. Ce qui peut modifier le son, ce sont les traitements après le décodage (les trois étapes ci-dessous, plus les effets sonores du téléphone).
De nombreux téléphones Android fixent leur sortie à une fréquence comme 48 kHz. Les morceaux à une autre fréquence, comme l’audio CD ou la haute résolution, sont rééchantillonnés à chaque lecture. La qualité de cette conversion varie d’un téléphone à l’autre.
Sur les anciennes versions d’Android, les morceaux en 24 bits sont tronqués à 16 bits.
Le calcul du volume et le mixage avec le son des autres applications ont également lieu juste avant la sortie.
reTONE intervient sur cette partie. Là où une conversion est nécessaire, reTONE la réalise lui-même, et là où elle peut être évitée, il ne convertit pas. Avec les DAC USB, le son va au DAC sans passer par le traitement audio d’Android. Lorsque les conditions sont réunies avec un DAC USB (voir « Volume du DAC USB » ci-dessous), l’écran du chemin du signal, ouvert depuis le lecteur, affiche BIT-PERFECT. Avec le haut-parleur intégré ou la prise casque, rien ne permet de vérifier comment le téléphone traite le son après Android ; nous ne pouvons donc pas garantir une sortie bit-perfect.
La conversion de fréquence d’échantillonnage diffère d’un téléphone à l’autre
Android ramène tout le son à la fréquence de sortie du téléphone avant de le lire. Cette fréquence diffère selon les téléphones : beaucoup fonctionnent à 48 kHz, mais certains à 44.1 kHz. Un même morceau peut donc être converti sur un téléphone et laissé tel quel sur un autre.
| Fréquence d’échantillonnage du morceau | Téléphone en sortie 44.1 kHz | Téléphone en sortie 48 kHz |
|---|---|---|
| 44.1 kHz (CD, etc.) | Aucune conversion | Converti en 48 kHz |
| 48 kHz | Converti en 44.1 kHz | Aucune conversion |
| 88.2, 96, 192 kHz | Converti en 44.1 kHz | Converti en 48 kHz |
Exemples que nous avons vérifiés : sortie 44.1 kHz sur les Sony Xperia P et Xperia go ; sortie 48 kHz sur les SHARP AQUOS CRYSTAL 305SH, KYOCERA URBANO L03 (KYY23), Raku-Raku Smartphone F-06F et Samsung Galaxy S8. Certains téléphones prennent en charge les deux fréquences, mais celle qu’ils utilisent réellement dépend de la conception du téléphone.
La qualité de la conversion propre à Android dépend aussi des réglages du téléphone. Parmi les téléphones vérifiés, les KYY23 et 305SH sous Android 4.4 étaient réglés sur la qualité la plus élevée, tandis que le Galaxy S8 sous Android 9 n’avait aucun réglage et utilisait la qualité moyenne standard (qui baisse encore en cas de forte charge). Pour les morceaux lus par le moteur de reTONE, lorsque la conversion ne peut pas être évitée, reTONE ne la laisse pas à Android : il convertit une seule fois, lui-même, et transmet le son exactement à la fréquence de sortie du téléphone.
La conversion d’Android est évitée lorsque le morceau correspond déjà à la fréquence de sortie du téléphone, sur les téléphones sous Android 10 et versions ultérieures qui prennent en charge la sortie directe, et avec un DAC USB. Certains appareils, dont certains DAP, sont aussi conçus pour ne rien convertir du tout au niveau du firmware.
Une application ne peut pas savoir si la puce audio du téléphone convertit à nouveau le son en interne après la sortie d’Android. La fréquence de sortie affichée par reTONE est la valeur indiquée par Android. Vous pouvez vérifier la fréquence de sortie d’un téléphone, et s’il y a conversion, en bas de l’écran de lecture et dans « Device & audio ».
Le chemin audio
Lorsque la fréquence de sortie du téléphone est fixée à 48 kHz ou à une valeur similaire, elle ne peut pas être modifiée sans root : les morceaux à une autre fréquence (audio CD en 44.1 kHz, ou haute résolution en 88.2, 96 ou 192 kHz) ne peuvent donc pas être lus sans conversion. Sous Android 4.x, et sur les chemins qui passent par le mixeur sous Android 5 et versions ultérieures, reTONE rééchantillonne avec une haute qualité les morceaux lus par son moteur avant de les confier à Android, de sorte que la conversion d’Android n’intervient pas (pour la qualité de la conversion, voir « Filtre de rééchantillonnage » ci-dessous). Avec les DAC USB, aucune conversion n’est effectuée aux fréquences prises en charge par le DAC et acheminables par le téléphone ; lorsque la sortie directe est utilisée, Android n’effectue aucune conversion (pour ce qui se passe ensuite, voir « Ce que la sortie directe contourne » ci-dessous).
Pris en charge par reTONEPris en charge par Android
Les morceaux dont la fréquence d’échantillonnage correspond à la sortie du téléphone n’ont pas besoin de conversion : il n’y en a donc aucune, même avec la lecture standard d’Android. Les formats qui ne passent pas par le moteur de reTONE, comme le MP3 et l’AAC, utilisent la lecture standard d’Android, et Android les rééchantillonne si leur fréquence diffère de celle de la sortie du téléphone (lors de la lecture via un DAC USB, c’est reTONE qui les envoie aussi). Le DSD et l’AIFF sont lus par le moteur de reTONE même sous Android 10 et versions ultérieures.
En détail
reTONE adapte l’étendue de son intervention au format du morceau, à la version d’Android et à la sortie. Pour les morceaux PCM, la conversion de fréquence d’échantillonnage a lieu au plus une fois sur les chemins gérés par reTONE (en interne, une conversion peut utiliser plusieurs étages de filtre) (pour le DSD, au plus une fois après l’étape de conversion DSD vers PCM). Avec le Bluetooth, le téléphone et le codec Bluetooth traitent ensuite encore le son. La lecture repose sur MediaPlayer et AudioTrack d’Android, et le moteur de reTONE (écrit en C) se charge du décodage et de la conversion en amont.
Android 4.x : de nombreux téléphones Android 4.x ouvrent le fil de sortie musicale à une fréquence fixe, par exemple 48 kHz, et les morceaux à une autre fréquence, comme 44.1 kHz ou 96 kHz, sont rééchantillonnés dans le mixeur d’Android avant la lecture. Les applications n’ont aucun moyen d’empêcher cette conversion. Le décodeur standard de la 4.x peut aussi ramener le FLAC 24 bits à 16 bits, ou ne pas ouvrir un FLAC 192 kHz. C’est pourquoi, sous 4.x, le moteur de reTONE lit tous les FLAC et WAV, ainsi que les DSF, DFF et AIFF, les convertit une seule fois à la fréquence de sortie du téléphone (la valeur d’AudioTrack.getNativeOutputSampleRate) et les transmet en 16 bits. Le mixeur d’Android accepte tel quel l’audio 16 bits à la même fréquence ; aucune conversion de fréquence d’échantillonnage n’a donc lieu côté Android. Lors de la réduction à 16 bits, les valeurs que 16 bits peuvent représenter exactement (comme l’audio CD transmis sans conversion) sont transmises inchangées ; sinon, reTONE applique un dither TPDF et, lorsque la sortie est à 44.1 kHz ou 48 kHz, un façonnage du bruit par rétroaction d’erreur (filtre à 5 coefficients pondéré E de Lipshitz, Vanderkooy et Wannamaker) pour déplacer le bruit de quantification vers des fréquences moins audibles. En cas d’écrêtage, l’erreur réinjectée est limitée à ±4 LSB pour éviter les oscillations. Les coefficients ont été conçus pour 44.1 kHz et sont aussi utilisés à 48 kHz. La quantité totale de bruit augmente, mais elle est déplacée vers les hautes fréquences, où l’oreille est moins sensible. Cependant, si vous réglez le volume d’Android en dessous du maximum, le mixeur d’Android arrondit de nouveau à 16 bits après avoir appliqué le volume, ce qui réduit l’intérêt du façonnage du bruit. Cela ne concerne pas les téléphones qui règlent le volume au niveau matériel. Dans tous les cas, aucune conversion de fréquence d’échantillonnage n’a lieu. Les formats MP3, AAC et similaires sont lus par le chemin standard d’Android, y compris sous 4.x.
Android 5 et versions ultérieures (chemins passant par le mixeur) : sous Android 10 et versions ultérieures, les chemins qui n’utilisent pas la sortie directe relèvent aussi de ce cas. Le mixeur d’Android de cette génération accepte le flottant ; le moteur de reTONE transmet donc à AudioTrack un son en flottant, sans dither. Sur les téléphones à sortie 16 bits, Android l’arrondit ensuite à 16 bits (Android n’applique pas de dither à ce stade). Les morceaux FLAC, WAV et ALAC dont la fréquence d’échantillonnage diffère de celle de la sortie du téléphone seraient rééchantillonnés par le mixeur d’Android s’ils lui étaient transmis tels quels, et les morceaux de plus de 16 bits seraient tronqués à 16 bits. Le rééchantillonneur par défaut d’AOSP utilise une qualité dynamique moyenne (DYN_MED) lorsque le réglage de qualité (af.resampler.quality) n’est pas défini, et passe à une qualité encore plus basse lorsque la charge estimée des rééchantillonneurs utilisés simultanément dépasse une limite. Sur le téléphone que nous avons vérifié, ce réglage n’était pas défini. Le moteur de reTONE ne rééchantillonne que les morceaux qui remplissent ces conditions, et vous pouvez le désactiver avec le réglage « Conversion by reTONE ». Les morceaux 16 bits à la fréquence de sortie du téléphone (comme l’audio CD sur un téléphone à 44.1 kHz) n’ont besoin d’aucune conversion et sont donc lus par le chemin standard d’Android.
Sortie directe (Android 10 et versions ultérieures ; disponibilité selon le téléphone) : la disponibilité de la « sortie directe », qui envoie le son à la fréquence du morceau sans passer par le mixeur, et de l’« offload », qui décode l’audio compressé sur la puce, dépend du téléphone et de la sortie. Sous Android 10 et versions ultérieures, une application peut demander au téléphone, avec AudioTrack.isDirectPlaybackSupported, si un format, une fréquence et une profondeur de bits donnés peuvent être envoyés directement vers la sortie actuelle. reTONE n’emprunte ce chemin que lorsque le téléphone répond oui et que la politique audio du téléphone achemine effectivement le PCM vers la sortie directe ; sinon, il lit par le chemin standard d’Android. La réponse varie selon la sortie ; reTONE pose donc la question à nouveau chaque fois qu’un casque ou un appareil USB est branché ou débranché. Sur les téléphones dont la politique audio achemine le PCM vers la sortie directe, les principaux formats qui ne pouvaient pas être envoyés directement étaient le PCM 16 bits à 44.1, 48 et 88.2 kHz (l’audio CD appartient à ce groupe). Le 24 bits et le flottant pouvaient être envoyés directement à la fréquence du morceau, et les MP3 et AAC (morceaux de 60 secondes ou plus) passaient en offload. reTONE décode donc l’audio sans perte 16 bits (FLAC, ALAC, WAV) en PCM (l’ALAC avec le décodeur propre à reTONE si le téléphone n’en a pas) et le transmet à MediaPlayer via MediaDataSource sous forme de WAV 24 bits dont les 8 bits de poids faible sont remplis de zéros. Les 16 bits de poids fort restent inchangés. Avant de basculer, il décode réellement le premier bloc pour confirmer qu’un véritable PCM 16 bits en sort, et revient au chemin standard s’il ne peut pas le confirmer. L’audio sans perte 24 bits ou à haute fréquence, ainsi que les MP3 et AAC, passent déjà par la sortie directe ou l’offload ; ils sont donc transmis tels quels. Les applications n’ont aucun moyen de lire quelle sortie le téléphone a réellement utilisée ; « DIRECT » sur l’écran du lecteur est donc une attente. reTONE se fiait auparavant à la seule réponse du téléphone, mais Android d’origine peut encore envoyer le PCM au mixeur même lorsqu’il répond oui, et certains téléphones affichaient DIRECT alors que l’audio n’était pas réellement direct. Depuis la 0.92.48, reTONE vérifie aussi la politique audio du téléphone. Depuis la 0.90.1, « DIRECT » n’est affiché que pour les morceaux sans perte, et jamais en Bluetooth. Avec l’offload, nous ne pouvons pas non plus vérifier si la fréquence d’échantillonnage change à l’intérieur de la puce. Sur ce chemin, les effets sonores côté Android ne sont pas appliqués (sur certains téléphones, les effets s’exécutent dans la puce), tandis que les réglages matériels du DAC (comme les filtres) restent actifs. Il peut être activé ou désactivé dans les réglages.
Sortie directe vers les DAC USB : lorsque vous branchez un DAC USB sur un téléphone prenant en charge l’hôte USB (OTG), reTONE envoie les données directement au DAC sans passer par le chemin audio d’Android. Sur le téléphone que nous avons vérifié, le chemin standard d’Android convertissait le son en 16 bits/48 kHz pour le DAC USB (une sortie en 32 bits/192 kHz était aussi ouverte, mais n’était pas utilisée pour la musique). La sortie directe de reTONE fonctionne comme suit.
- Grâce à l’API hôte USB du téléphone, reTONE trouve le DAC, obtient votre autorisation et lit les descripteurs USB (pour l’USB Audio Class 2.0 : l’ID d’horloge, les réglages alternatifs de l’interface de lecture, le point de terminaison de sortie et le point de terminaison de retour ; pour la Class 1.0 : les fréquences d’échantillonnage et la taille de paquet de chaque réglage alternatif).
- Il prend le contrôle du DAC à la place du pilote d’Android (claimInterface) et privilégie un réglage alternatif PCM, 2 canaux, 32 bits (24 ou 16 bits à défaut).
- Il lit les fréquences d’échantillonnage prises en charge avec GET RANGE de la source d’horloge. Si la fréquence du morceau est dans la plage, il la définit avec SET CUR et la confirme avec GET CUR. Seuls les morceaux à des fréquences non prises en charge, ou à des fréquences que l’USB du téléphone refuse d’acheminer (depuis la 0.92.68), sont rééchantillonnés, une seule fois, par reTONE vers une fréquence acceptée par le DAC. Les morceaux aux fréquences prises en charge par le DAC ne subissent ni conversion de fréquence d’échantillonnage ni dither. Les morceaux jusqu’à 24 bits sont envoyés avec les données d’origine placées telles quelles dans les bits de poids fort d’un mot de 32 bits (lorsque le volume du DAC est utilisé ou lorsque le volume est réglé sur le DAC lui-même). Les morceaux entiers 32 bits suivent aussi un chemin qui les conserve en entiers (depuis la 0.92.65). Seules les valeurs que la profondeur de bits du DAC ne peut pas représenter exactement sont arrondies, avec un dither TPDF lorsque le DAC est de 24 bits ou moins.
- Les transferts sont gérés côté C par des transferts isochrones usbdevfs. Pour les DAC High Speed qui reçoivent du son toutes les 0.125 ms (la plupart), 1 ms de son (8 microtrames) est regroupée en un transfert, et 64 de ces transferts sont tenus en file d’avance. Pour les DAC à intervalle plus long, chaque transfert contient 32 paquets et moins de transferts sont mis en file, pour conserver environ 64 ms d’avance. Les DAC asynchrones indiquent le nombre de trames par microtrame depuis le point de terminaison de retour, et reTONE ajuste en conséquence la quantité envoyée. Le format de cette valeur varie selon les DAC ; reTONE le détecte donc à partir de ce qui arrive. Lorsque reTONE applique le volume, il le fait juste avant l’envoi, de sorte que les changements prennent effet immédiatement (chaque changement est lissé sur environ 5 ms pour éviter les à-coups).
- Pendant ce temps, les MP3, AAC et formats similaires sont aussi décodés en PCM avec le décodeur du téléphone (MediaCodec) avant l’envoi : reTONE lit donc tous les morceaux. Débrancher le DAC met la lecture en pause. Lorsqu’une autre application commence à lire, reTONE se met en pause et rend le DAC à Android, puis le reprend lorsque vous relancez la lecture dans reTONE. Si le DAC n’est pas rendu à Android, par exemple après un arrêt forcé, reTONE le rend juste après une mise à jour, et lorsque vous ouvrez reTONE avec « USB DAC direct output » désactivé.
De nombreux téléphones de la génération Android 4.1 ne peuvent pas utiliser un DAC USB comme sortie audio, mais la sortie directe de reTONE n’utilise que la fonction hôte USB ; elle peut donc quand même envoyer le son. Avec notre téléphone d’essai de 2012 (Android 4.1) et un DAC sur batterie, du 24 bits/192 kHz a été lu sans conversion. Nous avons testé nous-mêmes des DAC USB Audio Class 2.0. Les DAC Class 1.0 sont aussi pris en charge, mais les essais en conditions réelles proviennent pour l’instant uniquement de retours d’utilisateurs. Les téléphones plus anciens ne peuvent fournir qu’un faible courant via USB ; les DAC alimentés par le bus peuvent donc ne pas être reconnus. Nous avons aussi constaté un cas où des interférences radio du Wi-Fi atteignaient le DAC par le câble USB et provoquaient des bruits intermittents. La lecture n’a pas besoin de connexion ; nous recommandons donc de passer en mode avion pour écouter avec un DAC USB.
Les différences selon la sortie
« Dedicated music player » et « Music app » utilisent le même chemin audio. Les seules différences sont l’ouverture ou non de reTONE avec HOME, la valeur par défaut de « Silent DAP mode » et l’écran de verrouillage de reTONE. La sortie directe (Android 10 et versions ultérieures) et la sortie directe vers DAC USB fonctionnent dans les deux modes.
| Sortie | Mixeur d’Android | Fréquence d’échantillonnage | DIRECT sur l’écran de lecture | Volume |
|---|---|---|---|---|
| Haut-parleur intégré et prise casque | Oui (sauf en sortie directe) | Alignée sur la fréquence de sortie du téléphone (comme dans le schéma ci-dessus) | Morceaux sans perte susceptibles d’utiliser la sortie directe, sous Android 10 et versions ultérieures | Volume d’Android plus le « Fine volume steps » de reTONE |
| DAC USB (sortie directe activée, par défaut) | Non | Inchangée si le DAC la prend en charge | Lorsqu’un morceau sans perte est envoyé sans conversion de fréquence | Sur le DAC, ou avec les touches de volume (réglé par le DAC ou par reTONE) |
| DAC USB (sortie directe désactivée) | Oui | Dépend des réglages USB du téléphone (certains convertissent en 16 bit / 48 kHz) | Non affiché | Volume d’Android |
| Bluetooth | Oui | Le téléphone réencode le son avec le codec Bluetooth | Non affiché | Volume d’Android (lié à l’appareil sur certains téléphones) |
Le DSD est converti en PCM, sauf lorsqu’il est envoyé par la sortie directe vers un DAC prenant en charge le DSD natif. Tant que reTONE utilise le DAC, les sons des autres applications, comme les notifications, sont lus par le haut-parleur intégré. Lorsqu’une autre application commence à lire, reTONE rend le DAC à Android. De nombreux téléphones Android 4.x ne peuvent pas utiliser seuls un DAC USB comme sortie audio ; le DAC ne fonctionne donc que par la sortie directe. Toucher la ligne du bas de l’écran du lecteur ouvre l’écran du chemin du signal. Pour chaque étage (fichier, décodage, fréquence d’échantillonnage, volume, sortie), il indique si le son passe sans modification ou s’il est modifié, d’après le traitement propre à reTONE et ce qu’Android signale. Le traitement à l’intérieur du DSP du téléphone ou du DAC ne peut pas être montré.
Ce que la sortie directe contourne
Lorsque la sortie directe est utilisée, elle contourne le mixage et la conversion de fréquence d’échantillonnage à l’intérieur d’Android. Ce qui arrive ensuite au son dépend du téléphone et de la sortie.
Le son qu’une application transmet traverse Android dans cet ordre.
1. Le centre audio d’Android (AudioFlinger)
Sur une sortie normale, le mixeur combine ici le son de plusieurs applications, le convertit à la fréquence de sortie du téléphone (généralement 48 kHz) et applique le volume. La sortie directe contourne principalement cette étape : ni mixage ni conversion. Le volume est laissé au matériel audio du téléphone s’il dispose d’un réglage de volume ; sinon, il peut être appliqué aux échantillons à cette étape (au volume maximal, les valeurs ne changent pas).
2. Les composants audio du fabricant → le processeur audio (DSP) dans la puce
Sur la plupart des téléphones, le son ne va pas directement au DAC : il passe par un DSP intégré à la puce, qui a ses propres étapes.
- Traitement par flux (conversion de format, volume)
- Traitement par sortie (protection du haut-parleur, effets sonores du fabricant, limiteurs)
- L’étage de sortie final. Chaque sortie a sa propre fréquence, et si celle du morceau diffère, le DSP la convertit
- L’« offload » du MP3 et de l’AAC est décodé par ce DSP
3. Le DAC (intégré à la puce, ou puce DAC séparée)
C’est là que le son devient analogique pour la première fois. Le filtre numérique interne du DAC (suréchantillonnage) est traversé de la même façon avec un DAC USB : il n’est donc pas pris en compte pour savoir si les données ont été modifiées.
Ce que l’on peut dire
- Ce qui est certain lorsque la sortie directe est utilisée : elle contourne le mixage et la conversion de fréquence d’échantillonnage à l’intérieur d’Android
- Si le téléphone aligne la fréquence de sortie du DSP sur celle du morceau, comme sur les chemins casque conçus pour la musique, le DSP se contente de mettre les données en forme et de les transmettre : elles parviennent donc probablement au DAC proches de l’original
- Sur les téléphones dont la fréquence de sortie est fixée à 48 kHz, le DSP convertit le son même si la conversion d’Android est contournée
- Les haut-parleurs reçoivent presque toujours une protection ou une correction. Certains téléphones affichent aussi DIRECT pour le haut-parleur, mais il faut considérer que les données ont été modifiées
- Sur certains téléphones, les effets sonores du fabricant s’exécutent dans le DSP
- Une application ne peut rien vérifier de tout cela. À partir d’Android 9, les applications ordinaires n’ont aucun moyen de lire les réglages du DSP ni le chemin utilisé. L’indication DIRECT de reTONE est une attente fondée sur la réponse d’Android et sur la politique audio du téléphone (elle n’est affichée que pour les morceaux sans perte, et jamais en Bluetooth)
Différence avec un DAC USB
Avec un DAC USB, reTONE contourne le chemin audio d’Android et dialogue directement avec le DAC par USB. reTONE gère les données jusqu’au DAC ; ce qui se passe à l’intérieur du DAC ne peut pas être vérifié. Lorsque le morceau est envoyé à sa propre fréquence d’échantillonnage et que le volume est réglé côté DAC, reTONE ne modifie pas les valeurs.
Filtre de rééchantillonnage
- Plat jusqu’à 20 kHzL’écart jusqu’à 20 kHz est inférieur à 0.001 dB (calculé). Aucun son audible n’est atténué.
- Atténuation en bande coupée d’au moins 120 dB / 100 dBValeurs calculées pour les téléphones à sortie en flottant et à sortie 16 bits (environ −122 dB / environ −102 dB pour 44.1 kHz → 48 kHz). Le repliement mesuré avec un signal d’entrée à 30 kHz (la quantité apparaissant entre 0 et 20 kHz, avant arrondi à 16 bits) était inférieur d’au moins 104.6 dB au signal d’origine.
- −1 dB uniquement lors du rééchantillonnageCela laisse une marge pour les crêtes inter-échantillons au-delà de 0 dBFS (la plus élevée que nous ayons mesurée sur des enregistrements du commerce était de +0.59 dB). Les morceaux rééchantillonnés sont 1 dB moins forts que les morceaux non rééchantillonnés.
En détail
La conversion de fréquence d’échantillonnage recalcule la forme d’onde entre les échantillons d’origine : la qualité du filtre se retrouve donc directement dans le son. Le filtre de reTONE est un filtre FIR obtenu en appliquant une fenêtre de Kaiser à une fonction sinc. Il utilise une structure polyphase, qui répartit les coefficients en groupes selon le rapport de conversion et ne calcule que le nécessaire. La conception repose sur deux critères : ne pas atténuer le son audible, et maintenir le repliement causé par la conversion bien maîtrisé.
- Bande passante : plate jusqu’à 20 kHz (à ±0.001 dB près par conception ; pour les conversions entre fréquences de 44.1 kHz ou plus).
- Bande coupée : commence à « la fréquence la plus basse − 20 kHz ». Entre 44.1 kHz et 48 kHz, cela donne 24.1 kHz. Le repliement qui tombe dans cette plage apparaît au-dessus de 20 kHz et reste hors de la bande audible (jusqu’à 20 kHz).
- Atténuation (objectif de conception) : 120 dB pour les téléphones à sortie en flottant (Android 5 et versions ultérieures), 100 dB pour les téléphones à sortie 16 bits (Android 4.x). La longueur du filtre et la fenêtre sont conçues avec une marge de 2 dB par rapport à l’objectif, de sorte que la valeur calculée dépasse l’objectif pour chaque conversion (pour 44.1 → 48 kHz, les valeurs calculées sont d’environ 122 dB et d’environ 102 dB). Un repliement résiduel à −100 dB se situe bien en dessous du plancher de bruit en 16 bits (environ −93 dBFS en pleine bande, dither compris) : une atténuation de 100 dB n’est donc pas différente à l’oreille de 120 dB.
- Nombre de coefficients : déterminé à partir de l’atténuation et de la bande de transition à l’aide de la formule de la fenêtre de Kaiser (86 coefficients pour 44.1 ↔ 48 kHz à 120 dB).
- Étages 2:1 : les étages qui divisent exactement la fréquence par deux, comme 96 → 48 kHz, utilisent un filtre demi-bande, dont la moitié des coefficients sont nuls et les autres symétriques, ce qui ramène le nombre de multiplications à environ un quart de celui d’un filtre ordinaire. 192 → 48 kHz utilise deux étages demi-bande, et les rapports restants, comme 88.2 → 48 kHz, sont traités par un filtre polyphase.
Lors des mesures, des signaux à 1 kHz, 19 kHz et 19.9 kHz sont ressortis au même niveau à 0.01 dB près. Avec une entrée à 30 kHz, le repliement apparaissant entre 0 et 20 kHz se situait au moins 104.6 dB sous le signal d’origine en sortie 44.1 kHz et 48 kHz, et au moins 116 dB en dessous pour une conversion depuis 192 kHz (mesuré avant l’arrondi à 16 bits). Ce sont des valeurs à une seule fréquence. Par conception, toute la bande atténuée est réduite au moins jusqu’aux objectifs d’atténuation ci-dessus.
Comme la conversion crée de nouveaux points entre les échantillons d’origine, les morceaux forts peuvent présenter des points au-dessus de 0 dBFS. Lorsque nous avons converti en 48 kHz plusieurs enregistrements du commerce que nous avions, les points au-dessus de 0 dBFS représentaient 0.0001 à 0.001 % du total, avec des maxima de +0.38 à +0.59 dB. Ils sont écrêtés à la sortie 16 bits ou dans le mixeur du téléphone ; lorsqu’il rééchantillonne, et seulement dans ce cas, reTONE abaisse donc le niveau de 1 dB, ce qui laisse une marge au-dessus du maximum mesuré. Les morceaux qui ne sont pas rééchantillonnés restent inchangés ; sur un même téléphone, les morceaux rééchantillonnés sont donc 1 dB plus faibles. Lors du passage sans coupure au morceau suivant, l’état du rééchantillonneur est reporté, de sorte que le début et la fin des morceaux ne sont pas rognés par le traitement (depuis la 0.92.57).
Le volume n’est pas appliqué dans le moteur de reTONE, mais dans le mixeur d’Android (le volume d’AudioTrack). L’appliquer dans le moteur retarderait les changements jusqu’à la fin de la lecture des quelque 500 ms d’audio en mémoire tampon dans AudioTrack, et les touches de volume paraîtraient lentes à réagir. Sur les téléphones à sortie 16 bits, baisser le volume conduit Android à arrondir de nouveau à 16 bits (Android n’applique pas de dither à cette étape).
Les calculs sont écrits en C et utilisent les instructions ARM NEON pour traiter ensemble les canaux gauche et droit. La boucle interne du filtre lit les coefficients sous forme de vecteurs et utilise quatre accumulateurs pour masquer la latence. Le dither, y compris les nombres aléatoires, l’arrondi, l’écrêtage et la rétroaction d’erreur, est lui aussi entièrement réalisé en NEON, ce qui évite les transferts entre NEON et les registres généraux, lents sur les cœurs plus anciens (Cortex-A9). Les builds Intel (x86) utilisent un chemin en C simple, sans NEON. Les chiffres de charge ci-dessous proviennent des téléphones ARM que nous avons testés.
La partie d’Android qui convertit les fréquences d’échantillonnage propose plusieurs niveaux de qualité, des calculs simples aux plus lourds, qui demandent davantage de calcul pour une meilleure précision. Le niveau utilisé est déterminé par un réglage du téléphone, et ce réglage est décidé par le fabricant.
Sur les téléphones sous Android 5 ou version ultérieure où le fabricant ne l’a pas défini, c’est le niveau intermédiaire, DYN_MED, qui est utilisé (sous Android 4.4, le niveau le plus simple, LOW). De plus, lorsque la charge estimée des rééchantillonneurs utilisés simultanément dépasse une limite, ceux qui dépassent cette limite passent au niveau inférieur (la charge réelle du CPU n’est pas mesurée). Parmi les téléphones que nous avons vérifiés, deux téléphones Android 4.4 avaient la valeur 4 (VERY_HIGH), et un téléphone Android 9 n’avait aucun réglage et utilisait donc DYN_MED. Un même morceau est ainsi rééchantillonné avec une qualité différente selon le téléphone.
| Valeur du réglage | Niveau | Méthode de conversion (Android standard) | Atténuation de la bande atténuée (conception) |
|---|---|---|---|
| 1 | LOW | Interpolation linéaire entre les deux échantillons voisins ; la méthode la plus légère. Utilisée sous Android 4.4 en l’absence de réglage | Pas de filtre dédié |
| 2 | MED | Interpolation cubique sur plusieurs échantillons voisins | Pas de filtre dédié |
| 3 | HIGH | Utilise un filtre sinc | Non indiqué dans le code source |
| 4 | VERY_HIGH | Utilise un filtre plus long que HIGH. Les coefficients sont chargés depuis un composant du téléphone (libaudio-resampler.so) ; à défaut, identique à HIGH | Non indiqué dans le code source |
| 5 | DYN_LOW | Construit à la volée un filtre adapté au rapport de conversion | 80 dB |
| 6 | DYN_MED | Comme ci-dessus, avec un filtre plus long que DYN_LOW | 84 dB |
| 7 | DYN_HIGH | Comme ci-dessus, avec le filtre le plus long | 98 dB |
| Non défini | — | DYN_MED sous Android 5 et versions ultérieures (LOW sous Android 4.4). Passe au niveau inférieur lorsque plusieurs sont utilisés en même temps | 84 dB |
| reTONE | — | Conçu indépendamment du réglage du téléphone. Plat jusqu’à 20 kHz (l’objectif d’atténuation dépend du format de sortie) | 100 dB (sortie 16 bits) 120 dB (sortie float) |
Le réglage s’appelle af.resampler.quality. Le tableau s’appuie sur le code source d’Android standard pour Android 13 (les lignes Android 4.4 sur le code source d’Android 4.4), et peut ne pas s’appliquer si le fabricant l’a modifié. Tous les chiffres de « Atténuation de la bande atténuée (conception) » sont des objectifs de conception des filtres. reTONE est conçu pour que la valeur calculée dépasse l’objectif pour chaque conversion.
Lorsque reTONE prend en charge la conversion, c’est le rééchantillonnage de reTONE qui est utilisé, quel que soit ce réglage.
Volume du DAC USB
Le volume peut être abaissé à trois endroits. Celui qui est utilisé dépend de la conception du DAC et de ce que vous choisissez lors de sa première connexion.
| Dans reTONENumérique | Volume numérique du DACPiloté via USB | Le DAC lui-mêmeBouton ou touches | |
|---|---|---|---|
| DAC dont le volume se règle via USB | Envoyé au maximum | Suit les touches de volume | — |
| Lorsque « reTONE adjusts » est choisi | Suit les touches de volume | Maximum | — |
| DAC sans cette fonction | Suit les touches de volume | — | — |
| Lorsque « On the DAC » est choisi | Envoyé au maximum | Maximum | Réglé sur le DAC |
En détail
Il y a trois endroits où baisser le volume : ① dans reTONE, appliqué aux données (numérique), ② le volume numérique interne du DAC, piloté via USB, et ③ le bouton ou les touches du DAC lui-même. Celui qui est utilisé dépend de la méthode de réglage choisie lors de la première connexion du DAC, et du fait que le DAC prenne ou non en charge le réglage du volume via USB.
② Volume via USB : l’USB Audio Class prévoit un mécanisme de volume appelé Feature Unit, dont GET RANGE lit le minimum, le maximum et le pas (en unités de 1/256 dB). reTONE convertit son volume (un gain unique combinant les paliers d’Android et le volume fin) en dB. S’il se situe dans cette plage, reTONE l’envoie au DAC et maintient sa propre sortie au maximum. Ce n’est que lorsque le volume descend sous cette plage que le complément est appliqué au PCM par ①. 0 correspond au silence.
① Dans reTONE : pour les DAC sans volume Feature Unit, et pour les DAC réglés sur « reTONE adjusts », reTONE applique le volume aux données avant de les envoyer, en lissant chaque changement sur environ 5 ms. Il est appliqué juste avant l’envoi ; les touches de volume réagissent donc immédiatement.
③ Le DAC lui-même : la présence d’un réglage de volume propre au DAC ne peut pas être lue via USB. C’est pourquoi, la première fois que vous connectez un DAC, reTONE vous demande une fois comment régler son volume, avec trois choix : « On the DAC itself », « Volume keys (DAC adjusts) » et « Volume keys (reTONE adjusts) ». Certains DAC indiquent qu’ils ont accepté une commande de volume sans modifier réellement le volume ; pour ceux-là, choisir « reTONE adjusts » fixe le volume du DAC au maximum et l’abaisse avec ①. Si vous choisissez « On the DAC », ② et ① sont tous deux fixés au maximum, et appuyer sur les touches de volume ne change rien (un message vous l’indique). Avec les DAC dotés d’un réglage de volume analogique, éviter l’atténuation numérique permet de tirer le meilleur parti du DAC. Le choix est mémorisé pour chaque modèle de DAC (ID de fournisseur et ID de produit USB) et peut être modifié avec le réglage « DAC volume ».
Lorsque « On the DAC » est choisi, ou lorsque le volume du DAC est utilisé (dans la plage de volume du DAC), les morceaux aux fréquences prises en charge par le DAC sont envoyés sans modification des données. Ce n’est que si vous réglez le volume sous la plage du DAC que reTONE applique le reste. Dans ce cas, si le morceau est sans perte (DSD natif compris) et que sa profondeur de bits tient dans celle du DAC, l’écran du chemin du signal affiche BIT-PERFECT (pour les morceaux entiers 32 bits, uniquement s’ils suivent le chemin en entiers). Ce qui se passe à l’intérieur du DAC ne peut pas être vérifié.
DSD natif
et son volume peut être réglé via USB
et le volume n’est pas réglé sur « reTONE adjusts »
et « Sending DSD » est réglé sur « Send as DSD »
reTONE ne peut pas modifier le volume du DSD lui-même : le DAC doit donc permettre le réglage du volume. Si les morceaux DSD se coupent, choisissez « Convert to PCM » dans le réglage « Sending DSD ». Le DoP n’est pas pris en charge.
En détail
Les morceaux DSF et DFF sont envoyés en DSD, sans conversion en PCM, uniquement lorsque le DAC prend en charge le DSD natif et que son volume peut être réglé via USB (et que le DAC n’est pas réglé sur « reTONE adjusts »). reTONE ne peut pas modifier le volume du DSD lui-même ; un réglage du volume côté DAC est donc nécessaire. L’écran du lecteur affiche par exemple « DSD64 → USB AUDIO • DSD64 DIRECT ».
Il est envoyé comme suit.
- Le DSD natif fonctionne avec les DAC dont les descripteurs USB comportent un réglage alternatif pour les données brutes (TYPE I RAW DATA).
- Les bits DSD sont regroupés par 4 octets dans un mot de 32 bits par canal, le bit le plus ancien en tête. Le DSF stocke les bits en commençant par le poids faible ; l’ordre des bits de chaque octet est donc inversé avant le regroupement. Les mots sont envoyés en big-endian (même hypothèse que le DSD_U32_BE de Linux). Ce regroupement est réalisé en C, et le tampon circulaire de transfert contient environ 500 ms.
- L’horloge du DAC est réglée sur « fréquence DSD ÷ 32 » (88.2 kHz pour le DSD64, 176.4 kHz pour le DSD128).
- Les silences, les pauses et les fins de morceau sont remplis avec le motif de silence DSD 0x69.
Cet ordre des octets et cet ordre des bits ont été vérifiés par une lecture correcte sur le DAC que nous avons testé. Ils n’ont pas encore été vérifiés avec d’autres DAC, et le DoP (DSD over PCM) n’est pas pris en charge. Les fichiers DFF compressés en DST ne peuvent pas non plus être lus.
Envoi du DSD (réglage) : « Sending DSD » apparaît sous « Sound » dans les réglages uniquement lorsqu’un DAC capable d’utiliser le DSD natif est connecté. Le choix par défaut est « Send as DSD » (le DAC lit directement le DSD), et vous pouvez passer à « Convert to PCM » (reTONE le convertit en PCM). Si les morceaux DSD se coupent, ou si vous préférez la lecture en PCM, choisissez la conversion en PCM. Le choix est mémorisé pour chaque modèle de DAC, et le changement rouvre le morceau en cours à la même position. Nous avons trouvé un DAC qui se coupait brièvement sur des enregistrements DSD dont la modulation dépassait le niveau de référence de 50 %. Le transfert était normal : cela semble donc tenir à la conception du DAC. Dans ce cas aussi, la conversion en PCM évite les coupures.
Conversion DSD → PCM : lorsque le DSD natif n’est pas utilisé (avec les DAC qui ne remplissent pas les conditions, lorsque « Convert to PCM » est choisi, et pour la sortie vers le Bluetooth, les écouteurs ou le haut-parleur), reTONE convertit le DSD en PCM en deux étapes.
- Étape 1 : le flux binaire DSD est décimé d’un facteur 32, 64, etc., en PCM à environ 88.2 kHz ou plus (le DSD64 par 32 vers 88.2 kHz, le DSD128 par 64 vers 88.2 kHz). Le filtre est un filtre FIR à fenêtre de Kaiser. La bande passante s’étend jusqu’à la plus grande valeur entre 20 kHz et le quart de la fréquence de sortie, la bande atténuée commence à « fréquence de sortie − bande passante », et l’atténuation est de 100 dB pour une sortie 16 bits et de 110 dB pour le float et l’USB. Le nombre de coefficients est déterminé par la formule de la fenêtre de Kaiser. Le calcul utilise des tables de correspondance 16 bits, construites une fois par configuration puis réutilisées. Lors des mesures, la réponse à 20 kHz était de 0.000 dB, et le repliement sous 20 kHz de −101 dB (conception à 100 dB) / −110 à −117 dB (conception à 110 dB).
- Étape 2 : si nécessaire, le même rééchantillonneur que celui décrit dans la section sur le filtre effectue une seule conversion vers la fréquence de sortie du téléphone (par exemple 44.1 kHz ou 48 kHz pour la sortie intégrée).
- Niveau : converti de sorte que le 0 dB SACD (modulation de 50 %) corresponde à −6 dBFS (une convention courante ; depuis la version 0.69.0. Les versions antérieures utilisaient −12 dBFS et lisaient 6 dB moins fort).
Lors de l’envoi de PCM à un DAC USB, reTONE envoie tel quel du PCM à « fréquence DSD ÷ 32 » (88.2 kHz pour le DSD64, 176.4 kHz pour le DSD128, 352.8 kHz pour le DSD256), sans la conversion de l’étape 2, si le DAC le prend en charge. Le DSD étant converti en PCM, DIRECT n’est pas affiché dans ce cas.
Charge
Utilisation du CPU par reTONE, rapportée à un cœur, sur notre téléphone de test de 2012 (Android 4.1, 2 cœurs).
« Rafraîchissement de l’écran de lecture » a été mesuré pendant une lecture réelle et n’inclut pas le décodage. Les deux autres valeurs proviennent de l’exécution des mêmes calculs que le moteur de reTONE à fréquence d’horloge maximale, ramenés en pourcentage du temps réel. Pendant une lecture réelle, le téléphone abaisse sa fréquence d’horloge : les valeurs affichées sur le téléphone paraissent donc 2 à 3 fois plus élevées.
En détail
reTONE vise à « ne rien faire à l’arrêt » et à « ne rien dessiner pendant la lecture écran éteint ». Les tâches périodiques ne s’exécutent que pendant la lecture : toutes les secondes écran allumé et toutes les 5 secondes écran éteint, et la barre de progression de l’écran de lecture ne redessine qu’elle-même toutes les 250 ms. L’horloge et la batterie sont mises à jour par des notifications du système, sans interrogation périodique.
Utilisation du CPU par reTONE, rapportée à un cœur, sur notre téléphone de test de 2012 (Android 4.1, Cortex-A9 à 2 cœurs).
- À l’arrêt : 0 %.
- Lecture écran éteint : le dessin s’arrête. Les morceaux lus par la lecture standard d’Android consomment presque 0 %, tandis que ceux lus par le moteur de reTONE (FLAC, WAV et autres sous Android 4.x) ajoutent la charge de décodage et de conversion indiquée ci-dessous.
- Lecture avec l’écran de lecture affiché : environ 2 % (mesuré pendant une lecture réelle ; essentiellement le rafraîchissement de la barre de progression, décodage non compris).
- Moteur de reTONE sortant un CD audio (16 bits/44.1 kHz) tel quel à 44.1 kHz : environ 2 %. Conversion vers 48 kHz pour la sortie : environ 4 %.
- Conversion de 24 bits/96 kHz vers 48 kHz : environ 5 %. Vers 44.1 kHz : environ 7 %.
- Conversion de 24 bits/192 kHz vers 44.1 kHz : environ 10 % (calcul seul) à environ 15 % (estimation approximative de la charge totale de lecture, ramenée à la fréquence d’horloge maximale).
- Envoi de 24 bits/192 kHz à un DAC USB sans conversion : environ 20 % (mesuré pendant une lecture réelle, écran allumé, thread de transfert compris).
Les valeurs du moteur, de « CD audio » à « 24 bits/192 kHz », proviennent de l’exécution des mêmes calculs à pleine vitesse, à fréquence d’horloge maximale, ramenés en pourcentage du temps réel. Pendant une lecture réelle, le téléphone abaisse sa fréquence d’horloge entre 200 MHz et 1 GHz : les valeurs affichées sur le téléphone paraissent donc 2 à 3 fois plus élevées (20 à 29 % pour le 24 bits/192 kHz). La manière d’écrire le code compte aussi beaucoup : l’implémentation actuelle en C et NEON représentait environ un tiers à un cinquième de la charge d’un premier prototype écrit en Java.
Pour la conversion DSD vers PCM, avec ce téléphone de 2012 et un DAC sur batterie, la conversion du DSD64 en PCM 88.2 kHz et son envoi via USB prenaient environ 11.8 % pour la conversion et environ 5.8 % pour le transfert USB (à environ 1 GHz). Lors de la lecture de DSD64 par la sortie intégrée (48 kHz) d’un téléphone Android 4.4, le thread de décodage utilisait 23.8 %, mais le téléphone maintenait sa fréquence d’horloge au minimum de 300 MHz : une simple mise à l’échelle selon le rapport des fréquences donne environ 3 % à fréquence d’horloge maximale.
Sur les téléphones que nous avons testés, la charge écran allumé dépendait davantage de la résolution de l’écran que de la vitesse du CPU (Android 4.x semble redessiner tout l’écran même pour de petites mises à jour). Un téléphone en 1080 × 1920 utilisait environ 4 % sur l’écran de lecture, et un téléphone en 1440 × 3120 sous Android 11 environ 8.5 % (rapporté à l’un de ses 8 cœurs ; environ 1 % de l’ensemble du téléphone). Les anciens téléphones ont de petits écrans et les téléphones haute résolution davantage de puissance de calcul : pour l’instant, la fréquence de rafraîchissement est donc la même sur tous les téléphones.
Appareils testés
| Téléphone | Android | Vérifié |
|---|---|---|
| WalkmanSony série NW-Z1000 | 4.0.4 | Lancement, écrans |
| PRADA phone by LGLG L-02D | 4.0.4 | Lancement, bibliothèque, lecture de FLAC 24 bits/96 kHz |
| MEDIAS XNEC N-07D | 4.0.4 | Lancement |
| MEDIAS ESNEC N-05D | 4.0.4 | Lancement |
| Xperia PSony LT22i | 4.1.2 | Fonctions principales, prise en main |
| Xperia goSony ST27i | 4.1.2 | Fonctions principales (écran 320×480), lecture DSD, DAC USB (DAC sur batterie) |
| AQUOS PHONE ZETASHARP SH-02E | 4.1.2 | Fonctions principales, prise en main |
| Xperia VLSony SOL21 | 4.1.2 | Lancement, bibliothèque, lecture (ALAC, désaccentuation, réglage fin du volume) |
| Acoustic Research AR-M20 | 4.3 | Lancement, lecture de FLAC 24 bits/96 kHz |
| AQUOS CRYSTALSHARP 305SH | 4.4.2 | Fonctions principales, prise en main |
| URBANO L03KYOCERA KYY23 | 4.4.2 | Fonctions principales, prise en main |
| Raku-Raku SmartphoneFUJITSU F-06F | 4.4.2 | Lancement, bibliothèque, lecture de FLAC 24 bits/96 kHz (reTONE ne peut pas être défini comme écran d’accueil) |
| KYOCERA KCP01K | 4.4.4 | Lancement |
| Xperia Z4 TabletSony SOT31 | 5.0.2 | Fonctions principales, prise en main |
| VAIO Phone AVAIO VPA051 | 6.0.1 | Lancement, lecture |
| Nexus 6Motorola Nexus 6 | 7.1.1 | Lancement |
| Xperia XA1 PlusSony G3226 | 8.0 | Lancement, bibliothèque, lecture FLAC 24 bits/192 kHz, Sound settings (ouvre les réglages audio de Sony) |
| Galaxy S7 edgeSamsung SC-02H | 8.0 | Lancement, bibliothèque, lecture |
| Galaxy S8Samsung SC-02J | 9 | Fonctions principales, prise en main |
| Xperia XZ1Sony G8341 | 9 | Fonctions principales, prise en main |
| Android One X5LG X5-LG | 11 | Fonctions principales, prise en main |
| Galaxy A41Samsung SC-41A | 12 | Lancement, bibliothèque, lecture |
| Pixel 3 XLGoogle Pixel 3 XL | 12 | Lancement, bibliothèque, lecture, commandes dans les notifications, télécommande |
| Xperia 5 IVSony A204SO | 14 | Installation depuis Google Play, lecture, affichage de la sortie directe |
| Xiaomi 12S UltraXiaomi 2203121C | 15 | Fonctions principales, prise en main |
| Galaxy Z Fold5 Test terrainSamsung Galaxy Z Fold5 | 16 | Lancement, mise en page pour pliables |
| Pixel 10a Test terrainGoogle Pixel 10a | 17 | Lancement |
| Pixel 11 Pro Fold Test terrainGoogle Pixel 11 Pro Fold | 17 | Lancement, mise en page pour pliables |
Test terrain Résultats de bénévoles ayant testé reTONE sur leur propre téléphone.
Sortie directe vers DAC USB : combinaisons essayées
| Téléphone | DAC USB | Résultat |
|---|---|---|
| Galaxy S8Android 9 | Hidizs S9 Proalimenté par le bus | Fonctionne. PCM (le DAC annonce 44.1 à 768 kHz ; testé avec des morceaux de 44.1 à 192 kHz), DSD natif, volume du DAC |
| Galaxy S8Android 9 | OPPO HA-2sur batterie | Fonctionne |
| AQUOS PHONE ZETA SH-02EAndroid 4.1 | OPPO HA-2sur batterie | Fonctionne. 24 bits/96 kHz lu sans rééchantillonnage |
| AQUOS PHONE ZETA SH-02EAndroid 4.1 | Hidizs S9 Proalimenté par le bus | Fonctionne. Ni dérive de vitesse ni coupures |
| Android One X5Android 11 | Hidizs S9 Proalimenté par le bus | Fonctionne |
| Xperia PAndroid 4.1 | OPPO HA-2sur batterie | Fonctionne. 24 bits/192 kHz et 96 kHz lus sans rééchantillonnage |
| Xperia PAndroid 4.1 | Hidizs S9 Proalimenté par le bus | Non reconnu. Le téléphone ne peut pas fournir assez d’énergie |
| URBANO L03Android 4.4 | OPPO HA-2sur batterie | Ne fonctionne pas. Android annonce la prise en charge de l’hôte USB, mais le téléphone ne joue pas le rôle d’hôte en OTG |
| AQUOS CRYSTAL 305SHAndroid 4.4 | — | Ne fonctionne pas. Pas de prise en charge de l’hôte USB |
| Xperia goAndroid 4.1 | OPPO HA-2sur batterie | Fonctionne |
| Xperia goAndroid 4.1 | Hidizs S9 Proalimenté par le bus | Non reconnu. Le téléphone ne peut pas fournir assez d’énergie |
| Galaxy A41Android 12 | Hidizs S9 Proalimenté par le bus | Fonctionne. Aucune coupure, y compris en passant du 24 bits/192 kHz au 44.1 kHz |
| Xperia XA1 PlusAndroid 8.0 | Hidizs S9 Proalimenté par le bus | Fonctionne |
DAC USB et téléphones : pourquoi les résultats varient
Le comportement de la sortie directe vers DAC USB dépend du téléphone et du DAC. La partie du téléphone qui joue le rôle d’hôte USB (le contrôleur hôte) diffère selon l’époque et le fabricant, et ces différences se manifestent surtout dans les transferts isochrones, où l’audio doit circuler à un débit régulier, sans interruption. Les DAC diffèrent eux aussi : la fréquence à laquelle ils reçoivent l’audio, la manière dont ils indiquent le débit souhaité et la source de leur alimentation. reTONE ne fait pas de distinction selon le modèle de téléphone : il mesure ce qui se passe réellement au branchement, et s’adapte. Dans le tableau ci-dessous, musb, EHCI et xHCI ont été testés sur de vrais téléphones ; les autres s’appuient sur la documentation publiée.
| Famille de contrôleurs | Problèmes fréquents | Ce que fait reTONE |
|---|---|---|
| musbCertains téléphones des années 2010 à 2013 environ (TI, ST-Ericsson, anciens MediaTek) | Les intervalles entre les transferts laissent le DAC légèrement à court de données (craquements, coupures) | Mesure l’intervalle de retour réel et ajoute des données pour compenser le manque |
| EHCIAnciens Qualcomm, Tegra, certains Exynos | Les fins de transfert reviennent par lots ; en cas de retard, une partie des données est sautée | Se fonde sur une moyenne à long terme |
| DWC2Anciens Rockchip, certaines tablettes Kirin et Amlogic | Des données non alignées sur 4 octets peuvent provoquer du bruit | Privilégie les formats 32 bits (4 octets) |
| xHCIPresque tous les téléphones USB-C (à partir de 2015 environ) | Les fins de transfert reviennent par lots ; les retards entraînent des données sautées | Se fonde sur une moyenne à long terme et garde suffisamment de données en file d’attente |
| MediaTek xHCITéléphones MediaTek récents | Une allocation stricte de la bande passante peut refuser les fréquences d’échantillonnage élevées | Les fréquences refusées sont converties par reTONE vers la fréquence inférieure suivante acceptée par le DAC (depuis la 0.92.68 ; nous n’avons pas encore constaté de refus sur un vrai téléphone) |
- Intervalle de service : la plupart des DAC reçoivent l’audio toutes les 0.125 ms ; certains toutes les 0.25 ms ou 1 ms. reTONE dimensionne chaque paquet en conséquence.
- Retour de fréquence : la plupart des DAC indiquent au téléphone à quelle vitesse envoyer (mode asynchrone), et le format de ce signalement varie selon les appareils. reTONE détecte et s’adapte automatiquement à la plupart de ces formats (0.88.0 et versions ultérieures). Certains n’ont pas de retour et suivent la fréquence du téléphone (mode adaptatif). Certains DAC asynchrones qui signalent la fréquence par le flux d’enregistrement (retour implicite) ne sont pas encore pris en charge.
- Alimentation : certains DAC ont leur propre batterie ou alimentation ; les DAC alimentés par le bus fonctionnent uniquement sur l’énergie du téléphone et peuvent ne pas être détectés sur les anciens téléphones incapables d’en fournir assez. Même un DAC sur batterie peut se recharger sur le téléphone et le vider plus vite.
- DSD : la plupart des DAC qui acceptent le DSD natif utilisent la même disposition (32 bits, big-endian), mais il existe des exceptions.
Réglages sonores des fabricants
« Sound » dans le menu du bas ouvre l’écran des réglages sonores du fabricant si le téléphone en possède un, sinon les réglages sonores d’Android. Vous pouvez choisir l’écran ouvert avec le réglage « Sound settings ».
| Téléphone | Écran ouvert |
|---|---|
| SHARP AQUOS CRYSTAL 305SH | Harman Clari-Fi/LiveStage |
| KYOCERA URBANO L03 (KYY23) | Dolby |
| Sony Xperia P | Effets sonores (égaliseur, ClearBass, VPT, xLOUD, etc.) |
| LG Android One X5 | Qualité sonore et effets (Hi-Fi Quad DAC, filtre numérique, DTS:X, etc.) |
| Samsung Galaxy S8 | SoundAlive |
| Sony Xperia XA1 Plus | Réglages sonores de Sony |
L’application des réglages du fabricant à la lecture de reTONE dépend du téléphone.
Ce qu’il ne fait pas
- Il n’y a ni égaliseur, ni fondu enchaîné, ni affichage de la forme d’onde. reTONE privilégie la légèreté et n’applique aucun effet au son. Le ReplayGain (égalisation du volume à partir des valeurs enregistrées dans les tags) est disponible ; il est désactivé par défaut, ne réécrit pas vos fichiers et ne fait que baisser le volume de lecture.
- reTONE ne lit pas lui-même les flux. Son rôle s’arrête à l’ouverture de l’application de streaming : la lecture et sa qualité sonore dépendent de cette application et du téléphone.
- Par défaut, reTONE n’utilise pas du tout le réseau. Il ne se connecte que si vous activez « Network features » dans les réglages, et seulement lorsque vous le lui demandez ou pour les vérifications que vous avez choisies. Tant que le partage est activé, il accepte aussi les connexions des téléphones que vous avez autorisés. Il ne collecte aucune donnée vous concernant.
- Les commandes depuis Android Auto ou Wear OS ne sont pas prises en charge. (Les commandes de lecture dans les notifications, sur l’écran de verrouillage d’Android et depuis les appareils Bluetooth sont prises en charge depuis la version 0.87.0.)
- Le moteur de reTONE ne peut pas lire les fichiers DFF compressés en DST, APE ou WMA Lossless, et leur prise en charge n’est pas prévue. Veuillez les convertir en FLAC ou dans un format similaire.
- Ne fonctionne pas sous Android 3.x ni sur les versions antérieures.
- Sur les téléphones sans prise en charge de l’hôte USB (OTG), la sortie directe vers DAC USB n’est pas disponible. Le réglage « USB DAC direct output » apparaît grisé, avec le message « This device does not support USB devices. »
- Les combinaisons de téléphones et de DAC testées avec la sortie directe vers DAC USB sont limitées. Nous n’avons pas vérifié si d’autres téléphones ou DAC fonctionnent. Certains téléphones annoncent à Android la prise en charge de l’hôte USB, mais ne peuvent pas jouer le rôle d’hôte en OTG. Les combinaisons testées sont listées sous « Sortie directe vers DAC USB : combinaisons essayées ».
- Le DoP n’est pas pris en charge. Le DSD natif nécessite un DAC qui prend en charge le DSD natif et permet le réglage du volume via USB. Avec les autres DAC, le DSD est converti en PCM avant l’envoi.
- Tant que la sortie directe vers DAC USB est utilisée, le son des autres applications ne passe pas par le DAC USB : il est diffusé par le haut-parleur du téléphone.
- Avec le haut-parleur intégré ou la prise casque, nous ne pouvons pas garantir une sortie bit-perfect, car les applications n’ont aucun moyen de vérifier comment le téléphone produit réellement le son. Avec un DAC USB, BIT-PERFECT n’est affiché que lorsque les conditions sont réunies.
- reTONE ne modifie pas le chemin audio vers le DAC intégré du téléphone (par exemple pour contourner la conversion de fréquence d’échantillonnage ou forcer la lecture en offload), car cela nécessite le root ou la signature du fabricant du téléphone.
- Écran éteint, le maintien d’une touche de volume pour un changement continu, ou l’utilisation des touches de volume pour passer d’un morceau à l’autre, ne sont pas pris en charge, car Android ne transmet pas ces touches aux applications.
- La modification des tags ainsi que la suppression ou le déplacement de fichiers ne sont pas pris en charge.
- Sous Android 10 et versions ultérieures, les morceaux FLAC, MP3 et autres d’une clé USB n’apparaissent pas dans la bibliothèque, car Android ne les répertorie pas.
- Certains DAC USB asynchrones qui signalent la fréquence par le flux d’enregistrement (retour implicite) ne sont pas pris en charge. Le son peut se couper toutes les quelques dizaines de secondes à quelques minutes.
- Sous Android 4.0, il y a une courte coupure entre les morceaux dans les formats lus par Android, comme le MP3 et l’AAC (les formats lus par le moteur de reTONE sont sans coupure même sous 4.0).