Je fais une spin-off d'un autre sujet et sur proposition de mambojet :
Pour un système vert en dématérialisation...Le but serait ici de discuter d'un point de vue technique sur l'USB et plus particulièrement sur son utilisation dans le cadre de l'audio.
Le cas d'utilisation standard étant utiliser un PC (ou assimilé) pour alimenter un DAC USB.
J'essaye de rester simple et de ne parler que de l'utile en audio.
Pour ceux qui s'y connaissent, ils ne découvriront rien de nouveau.
Je suis loin de maîtrisé USB mais j'ai déjà fait quelques trucs:
- modification de driver
Re: Chacun son bricolage- utilisation de sonde USB pour analyse de traffic
- création de paquets USB "a la main"
Il y a surement des erreurs, si vous en voyer dites le , on vas faire avancer le schmilblick ensemble.
Partie physiqueUSB pour Universal Serial Bus.
Un bus série est quelque chose de simple. Le connecteur et le câble en lui même est très simple.
Il y a 4 fils (je ne parle pas de l'USB3 ici qui est différent) :
- un pour la masse
- un pour conduire du 5V
- deux autres (appeler D+ et D- ) pour transmettre l'information . Elle est a peu prés protégé par un système proche des câbles symétrique XLR
Il y a deux types de connecteur (A => plat et B => carré) pour bien faire en sorte que les deux appareils reliés ne sont pas égaux. Il a l'hôte et le périphérique (presque faux ce que je dis car il y a l'USB On-The-Go , mais je simplifie ici) .
Il y a aussi le cas des périphérique qui sont des bridges. Et donc un hôte peut "voir" plusieurs périphériques sur un connecteur.
C'est l'hôte qui commande sur le bus et c'est lui qui dit quand les périphérique peuvent causer.
Une petite aparté : sur ce point c'est donc le contraire de l'ethernet , où là chacun peut causer quand il veut. Il y a ensuite un mécanisme de détecter de collision (quand deux personnes ont parlé en même temps ) puis de renvois du paquet ethernet (en espérant que ce coup ci cela passe).
Donc pas grand chose a dire. On voit bien que c'est prévue pour être pas cher a produire et très généraliste.
Protocole USBLes appareils USB sont censés respecté un protocole de communication définit par l'USB Implementers Forum, Inc. (
http://www.usb.org).
Même ceux qui utilisent des drivers spécifiques doivent implémenter certaines fonctions.
Un périphérique peut aussi implémenter des fonctions non obligatoire mais qui sont pratique. Ce sont les USB Device Class.
Dont celui qui vas nous intéresser ici : USB Audio Class. Mais il y en a plein d'autre par exemple pour la vidéo, pour les chargeur de batterie USB , les cartes à puces etc etc
Deux gros avantages pour le constructeur de choisir cette solution:
- Souvent des solutions toutes faites a prendre sur étagère (Par exemple le XMOS)
- Pas besoin d'installer un driver sur l'hôte, donc moins de problème de SAV utilisateur
1 désavantages: Pas extensible et donc si on a des besoins particulier, il faut faire autre choses.
Je fais une section vraiment informatique ici, le lecteur peut passer toute cette section s'il le souhaite.
Rendez-vous à buffer circulaire.
Quand un appareil nouveau se connecte , l'hôte demande au périphérique de se présenter (GET DESCRIPTOR).
Le périphérique répond alors en donnant sa description.
Vous avez un exemple de description ici
http://pastebin.com/sk2HVYgS cela correspond a une RME Fireface UCX.
Cela fait 485 lignes, je le met pas ici. Néanmoins, je vais essayer de rendre la lecture de ce descripteur compréhensible.
Dans le
descripteur on trouve quelques information général (nom du constructeur, nom du produit , numéro de série, classe et sous-classe USB ) ainsi q'un certains nombre de
configuration.
L'hôte analyse les différentes configurations et choisit celle qui lui convient.
Un exemple serait une carte son supportant USB Audio Class 1 et 2
Sous OS X qui supporte nativement UAC2 (UAC2 pour USB Audio Class 2) , il choisira la deuxième configuration.
Alors que sous Windows basique (sans driver ASIO ou autre), il ne connait que l'UAC1 il choisira UAC1.
Chaque
configuration comporte un ensemble d'
interface qui décrivent des
endpoints .
Ouai,je sais ça fait bizarrement compliqué ce système, prenons un exemple (issue du lien plus haut).
l'entête d'un descripteur
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 239 Miscellaneous Device
bDeviceSubClass 2 ?
bDeviceProtocol 1 Interface Association
bMaxPacketSize0 64
idVendor 0x0424 Standard Microsystems Corp.
idProduct 0x3fd9
bcdDevice 0.01
iManufacturer 1 RME
iProduct 2 Fireface UCX (23455936)
iSerial 3 A0A762B3C75E8C8
bNumConfigurations 1
bNumConfigurations est à 1 donc 1 seul configuration sur cette appareil
Une description d'un interface:
Interface Descriptor:
bInterfaceNumber 1
bAlternateSetting 1
bNumEndpoints 2
bInterfaceClass 1 Audio
bInterfaceSubClass 2 Streaming
bInterfaceProtocol 32
Là, on voit que c'est une interface dédié à l'Audio Streaming. Moins évident le protocole d'interface est 32 soit 0x20 en hexadécimal et cela veut dire UAC2. On voit aussi que cette interface a deux
endpoints.
Les deux endpoints (simplifié)
Endpoint Descriptor:
bEndpointAddress 0x01 EP 1 OUT
Transfer Type Isochronous
Synch Type Asynchronous
Usage Type Data
wMaxPacketSize 0x0400 1x 1024 bytes
Endpoint Descriptor:
bEndpointAddress 0x81 EP 1 IN
Transfer Type Isochronous
Synch Type None
Usage Type Feedback
wMaxPacketSize 0x0004 1x 4 bytes
A tiens! on voit apparaître des informations qui plaisent aux audiophile : Asynchronous.
On y reviendras plus tard. Il faut juste savoir qu'un hôte envois un paquet à un
endpoint donné d'un périphérique donné.
J'ai omis volontairement une information: il existe 4 types de transfert:
- transfert de commande : paquet de petite taille, la réception assuré, exemple demander la configuration d'un périphérique
- transfert d’interruption : petit paquet et rapide . Exemple : un clavier, une souris
- transfert bulk : grosse donnée avec garantie acheminement . Exemple : disque dur USB
- transfert isochrone : grosse donnée avec garantie de bande passante mais pas d'acheminent (juste détection d'erreur, pas de correction) . Exemple : DAC
On s’intéressera qu'au cas isochrone.
Les buffer circulairesUne notion a maîtriser est la notion de buffer circulaire. rien de compliqué mais si l'on ne l'a jamais vu cela peut paraître obscure.
bon, encore une fois wikipedia est super:
Un buffer circulaire est une zone mémoire qui comporte n cases de taille fixe.
On écrit dans 1 case puis dans la suivante etc etc . Il y a un
pointeur sur la case a écrire qui avance au fur a mesure.
Idem il y a un deuxième pointeur, celui de la lecture qui point sur la case a lire et qui avance a chaque fois.
Voila c'est tout .
Si on applique cela au transfert de donnée.
On a deux entités . Une source et un destinataire et au milieu un buffer circulaire.
La source vas écrire dans le buffer circulaire et le destinataire lire dedans .
On voit que le problème peut être quand le lecteur vas plus vite que l’écrivain : on lit potentiellement n'importe quoi .
Inversement si l’écrivain vas trop vite, il vas faire un tour complet et écraser des données non encore lu par le lecteur.
USB AsynchroneÇa y est on a tout pour discuter du cas l'USB isochrone asynchrone.
Dans un DAC on a la partie purement DAC
A chaque tick donnée par une clock, la puce lit un buffer et transforme ce buffer en son analogique.
Ce buffer lu est une case d'un buffer circulaire.
Le rôle de la partie du DAC qui s'occupe de la réception USB et de garder ce buffer circulaire propre , que l’écrivain aille pas trop vite ou pas trop lentement pour que la lecture a vitesse constante soit toujours parfaite.
Pour cela il vas utiliser les deux
endpoints vu plus haut .
En USB Asynchrone, le periphérique reçoit des données audio par un canal mais il envoit aussi un feedback par un autre canal.
Grace a ce canal, le périphérique peut dire à l'hôte d'accélérer ou de ralentir . Donc même si le PC a une horloge pas fiable du tout, le DAC lui donnera les informations nécessaire pour que le buffer circulaire soit toujours correctement rempli.
On remarquera que plus un buffer circulaire est grand , moins on a de risque de problème mais qu'inversement on vas rajouter de la latence.
Cette latence est pas importante pour nous audiophile mais peut l'être si on est dans un studio d’enregistrement.
USB SynchroneRegardons le cas de l'USB audio isochrone synchrone.
Ici aucun feedback et l'horloge qui sert a faire avancer la lecture est déduite de l'arrivé de paquet USB.
Chaque milliseconde (ou 125µs dans le cas du High speed) il y a un Start of Frame (SoF) et les données qui suivent.
Donc la qualité de l'horloge du PC (enfin de la clock du contrôleur USB) se retrouve impliqué dans la conversion numerique/analogique.
Même si des système de recalage style PLL peuvent être utilisé pour corriger le problème en grande partie.
ConclusionsOn voit que grâce à l'USB asynchrone on peut s'affranchir des problèmes de qualité d'horloge du PC.
Les données PCM tel que présent dans le fichier wave arrivent presque tel quel dans le DAC.
Ensuite on a une "garantie" que l'information arrive de façon parfaite dans le récepteur USB du DAC.
Faut-il encore que le constructeur ne fasse pas n'importe quoi entre ce récepteur et la puce de décodage.
Mais ce genre de problème est par exemple identique a ce que l'on trouve dans un lecteur CD. Il y a la partie laser qui lit une donnée et la stock dans un buffer et la partie DAC qui lit se buffer et le convertie en analogique. Donc pas de différence spécifique ici. Si on sait le faire sur un lecteur CD , on sait le faire sur un DAC USB asynchrone.
Alors vous me direz que j'ai occulté le fait que le mode isochrone ne garantie pas les données.
C'est exact mais il y a une détection des erreurs et des problème des buffer plein ou vide (ce sont des xruns).
Quand des erreurs arrivent, on peut en être informé . Dans la pratique, je n'en vois jamais.
J'ai été beaucoup trop long et pourtant j'ai omis de parler de plein de chose.
Il faut voir cela comme une introduction pour la discussion.
Quelques liens USB basique:
http://fr.wikipedia.org/wiki/Universal_Serial_BusPour aller plus loin:
http://www.beyondlogic.org/usbnutshell/usb1.shtmlBuffer circulaire:
http://fr.wikipedia.org/wiki/Buffer_circulairehttp://www.silabs.com/Support%20Documen ... -Paper.pdf