Skip to content

feat(audio): DSD natif via DoP (DSD over PCM) en WASAPI Exclusive #495

Description

@InstaZDLL

Contexte

WaveFlow décode aujourd'hui les fichiers DSD (.dsf / .dff) uniquement en DSD → PCM : le flux 1-bit est converti en PCM via un FIR Blackman-Harris (taps réglables 256 / 1024 / 2048, profile_setting['audio.dsd_precision']), puis envoyé à la sortie comme n'importe quel flux PCM.

Pour le public audiophile (celui qui active déjà WASAPI Exclusive + la précision DSD), il manque le vrai DSD bit-perfect : envoyer le flux 1-bit tel quel à un DAC compatible, qui le décode nativement, au lieu de le convertir en PCM côté hôte.

Objectif — DSD natif via DoP (DSD over PCM)

Ajouter un chemin DoP : encapsuler le flux DSD 1-bit dans des trames PCM (marqueurs 0x05 / 0xFA en poids fort, échantillons 24-bit @ dsd_rate / 16) et l'envoyer au DAC en WASAPI Exclusive uniquement. Le DAC détecte le motif DoP, reconstruit le flux 1-bit d'origine et affiche « DSD » — sortie réellement bit-perfect. Cibles : DSD64 / DSD128 / DSD256.

Périmètre v1 (Windows-only)

  • Probing des capacités réelles du DAC en mode exclusive (fréquences / formats / canaux acceptés au-delà de la table générique de l'OS) — prérequis : savoir si le device accepte le débit DoP avant de basculer.
  • Encodeur DoP : DSD 1-bit → trames PCM 24-bit marquées, au rate dsd_rate / 16 (DSD64 → 176.4 kHz, DSD128 → 352.8 kHz, DSD256 → 705.6 kHz).
  • Négociation au stream-open : si (a) sortie = WASAPI Exclusive, (b) le DAC accepte le format DoP requis, (c) l'utilisateur a activé l'option → chemin DoP ; sinon fallback automatique vers le DSD → PCM existant (déjà en place, ne rien casser).
  • Moteur DoP persistant gapless : ne verrouiller le DAC qu'une seule fois pour enchaîner les pistes DSD sans clic ni re-lock.
  • UI : toggle « DSD natif (DoP) » dans Réglages → Playback + popup des sorties, badge dans l'AudioPipelinePopover / AudioQualityFooter (« DSD natif » vs « DSD → PCM »).
  • i18n : nouvelles clés propagées sur les 17 locales (fr source de vérité).
  • Docs : docs/features/playback.md + note cross-cutting DSD dans CLAUDE.md.

Contraintes techniques

  • WASAPI Exclusive obligatoire : le DoP ne passe pas par le mixeur partagé Windows (il resample → détruit le motif). Uniquement sur le chemin wasapi_exclusive.rs.
  • Hot path audio : l'encapsulation DoP se fait côté décodeur (avant le ring SPSC), jamais dans le callback. Respecter la règle « le callback n'alloue/lock/log pas ».
  • Volume géré par le DAC/ampli en DoP (bit-perfect oblige — pas de gain côté hôte). Griser / neutraliser le volume logiciel quand le chemin DoP est actif, comme pour le bit-perfect existant.
  • Fallback silencieux si le DAC refuse : retomber sur DSD → PCM sans erreur visible, juste le badge qui change.

Hors périmètre v1

  • macOS / Linux (l'équivalent CoreAudio / ALSA DoP est un chantier séparé).
  • DSD512+ (à ajouter si un DAC de test le supporte).

Notes

  • Le chemin DSD → PCM existant reste le comportement par défaut et le fallback ; DoP est une couche opt-in par-dessus, sans régression pour les DAC non compatibles.

Metadata

Metadata

Assignees

Labels

enhancementNew feature or requeststatus: stalledInactive and awaiting renewed prioritizationtype: featNew feature

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions