# DiscId

Le DiscId est un identifiant calculable pour tout CD Audio. Cet identifiant est un nombre dont la valeur dépend du nombre de pistes sur le CD, et de la position de chaque piste.
Lors de l'extraction des pistes audio-numériques d'un CD audio, il est souhaitable que le nommage des fichiers obtenus soit fait à partir du nom de l'album, des titres des chansons, ou d'autres informations. Afin d'automatiser ce renommage il faut :
* une base de données contenant les informations : nom et genre de l'album, titres des pistes, année de parution, entre autres.
* un identifiant propre à chaque album, servant de clé pour accéder à la base données.
Le DiscId est l'identifiant utilisé pour accéder aux bases de données CDDB et FreeDB, accessibles sur Internet. Il est utilisé par de nombreux logiciels pour nommer les fichiers audio-numériques. Les informations obtenues peuvent également être écrites dans les fichiers musicaux, sous forme de tags.
le DiscId est un nombre entier, codé sur 32 bits, représenté en hexadécimal sur 8 caractères (au besoin, il faut ajouter des caractères « 0 » en tête).
Il ne faut pas confondre le DiscId et l'ISRC. Ce dernier est attribué par un organisme officiel, il y a un code ISRC par piste alors que le DiscId identifie l'ensemble du CD, et l'ISRC est strictement unique contrairement au DiscId. De même le DiscId n'a aucun rapport avec le code-barres du CD.

## Comment est-il calculé ?

Pour calculer le DiscId il faut disposer des informations suivantes :
* la durée totale du disque ;
* le nombre de plages du disque ;
* la position de chaque plage, depuis le début du disque.
La durée de chaque plage doit être exprimée au format MSF (Minute/Second/Frame). La TOC du CD doit donc être lue dans ce format.
La durée totale du disque est la différence entre l'offset (la position) du lead-out (ensemble des blocs non utilisés du CD) et l'offset de la première plage (usuellement 2 secondes).
Le calcul du DiscId ne tient compte que des minutes et des secondes : le nombre de frames est inutilisé.
L'algorithme est expliqué dans un howto téléchargeable sur le site de freedb.
Écrire un logiciel qui calcule le DiscId suppose de pouvoir lire la TOC du CD. Cette structure ne se présente pas sous la forme d'un fichier qu'on pourrait accéder par exemple depuis l'explorateur Windows. Il faut pouvoir accéder au CD à un plus bas niveau.

## Exemple de calcul

La position de chaque plage doit être convertie en secondes, puis il faut faire la somme des chiffres de la durée obtenue.
Ci-dessous un exemple pour l'album The Seeds Of Love de Tears for Fears, dans une édition comportant 4 plages supplémentaires (bonus).
| plage | position (minutes : secondes) | position en secondes | position : somme des chiffres |
| 1 | 00:02 | 2 | 2 |
| 2 | 06:33 | 393 | 15 |
| 3 | 15:05 | 905 | 14 |
| 4 | 21:25 | 1285 | 16 |
| 5 | 26:16 | 1576 | 19 |
| 6 | 31:49 | 1909 | 19 |
| 7 | 38:02 | 2282 | 14 |
| 8 | 45:10 | 2710 | 10 |
| 9 | 49:37 | 2977 | 25 |
| 10 | 52:54 | 3174 | 15 |
| 11 | 57:32 | 3452 | 14 |
| 12 | 61:05 | 3665 | 20 |
| 13 = lead-out | 65:22 | 3922 | |
* Il faut en premier calculer la somme de la dernière colonne (uniquement les plages, pas le lead-out) : $S=183$.
* Puis il faut calculer la durée totale du disque : $T={\text{position du lead-out}}-{\text{position de la première plage}}=3920$.
* On a également besoin du nombre de plages : $N=12$.
* Le DiscId se calcule alors avec la formule suivante : $DiscId=S{\bmod {2}}55\times 16777216+T\times 256+N$.
Avec notre exemple on obtient 3 071 234 060, soit B70F500C en hexadécimal : c'est le DiscId de l'album.
Ce calcul n'est pas trivial. La première plage n'est pas forcément à l'offset 00:02, une piste de données peut décaler le lead-out par exemple. Le site freedb.org met à disposition une image de test utilisable pour valider une application calculant le DiscId. Il faut graver cette image sur un CD vierge puis comparer le DiscId calculé avec celui indiqué dans le fichier texte fourni.

## Unicité

Du fait de l'algorithme utilisé, deux disques différents peuvent avoir le même DiscID. L'algorithme pouvant être apparenté à une fonction de hachage, c'est un problème classique de collision.
Inversement, deux éditions différentes d'un même disque peuvent avoir des DiscId différents.
Le MCI de Windows contient un bug se produisant lors de l'extraction d'un CD Extra (c'est-à-dire avec une ou plusieurs pistes de données) : les plages de données sont ignorées. Les logiciels utilisant cette interface peuvent donc calculer un DiscId incorrect pour de tels CD. Cela provoque l'apparition de plusieurs DiscId pour le même CD dans les bases de données FreeDB et CDDB.

## Métadonnées

Dans la version 2.30 des métadonnées ID3, il n'existe pas de tag pour enregistrer le DiscId dans un fichier MP3. Par contre il est possible de stocker toute la TOC du CD (804 octets) à l'aide du tag MCDI. La documentation officielle de l'ID3 indique clairement que le lien avec les bases CDDB/FreeDB doit être fait via le tag MCDI.
À noter qu'il existe un tag pour l'ISRC, nommé « TSRC ».