2 Encodage
2.1 Code fourni
Pour cette partie vous pouvez vous appuyer sur le code fourni dans l'archive
http://www.plil.net/~rex/Enseignement/Reseau/Tutorat.Reseau.GIS3/physicalEncodingStudents.tgz.
Une bibliothèque très basique de gestion de carte son est incluse. Il ne vous reste plus qu'à compléter
les sources encode.c et decode.c. La génération des exécutables se fait par une simple
exécution de la commande make dans le répertoire principal du projet.
2.2 Généralités sur les cartes son
Une carte son de PC permet de générer des sons et de faire l'acquisition de
sons. La génération de son se fait en envoyant un tableau d'échantillons
à la carte. Les valeurs des échantillons correspondent à des positions de la
membrane du haut-parleur connecté à la carte. Dans le cadre de ce TP, les
échantillons sont des octets et la position de repos de la membrane correspond
à la valeur 127. Si un échantillon est plus grand que le précédent, la
membrane est déplacée vers l'avant et provoque une surpression. Si un
échantillon est plus petit que le précédent, la membrane déplacée vers l'arrière
provoque une dépression. Envoyer une série d'échantillons identiques revient donc
à n'émettre aucun son. Une autre caractéristique de ce système est que faire
vibrer la membrane autour d'une position ou d'une autre génère le même son.
Un microphone opère de façon similaire, une surpression va conduire à un
échantillon de valeur supérieure à l'échantillon précédent, une dépression
va conduire à un échantillon de valeur inférieure à l'échantillon précédent.
Dans le cadre du TP les cartes sons sont directement reliées (sortie casque
sur entrée microphone) pour éviter les pertes de signal et les interférences
mais le principe reste le même. Enfin, toujours dans le cadre du TP, la fréquence
d'échantillonnage est de 48000 octets par seconde.
2.3 Bibliothèque pour les cartes son
Cette bibliothèque comprend quatre fonctions de gestion des cartes son dont
les prototypes sont définis dans le fichier d'entêtes libsndcard.h.
snd_pcm_t *openSoundCard(char *device,char mode,unsigned char blocking);
unsigned char play(snd_pcm_t * handle,unsigned char *buffer,int size);
unsigned char record(snd_pcm_t * handle,unsigned char *buffer,int *size);
void closeSoundCard(snd_pcm_t * handle);
La première fonction initialise la carte son. Pour une utilisation de type
capture de son, utilisez le mode 'r' et pour une utilisation de type
génération de son, utilisez le mode 'w'. Dans ce projet le paramètre
blocking n'est pas important, utilisez la valeur 1. La fonction
play permet de jouer les size échantillons du tableau d'octets
buffer. La fonction record permet d'enregister un maximum de
size échantillons acquis par la carte dans le tableau pré-alloué buffer.
Enfin la fonction closeSoundCard permet de relacher le contrôle sur la
carte son.
2.4 Encodage de données
Vous devez, ici, trouver une méthode pour envoyer un tableau d'octets, c'est
à dire une suite de bits, à l'aide d'une carte son. Il vous est suggéré de
générer des bruits de durées différentes selon l'information à transmettre.
Les différentes informations pourraient être le début de transmission,
un bit à zéro, un bit à un et la fin de transmission. Implantez votre
solution dans le fichier encode.c. Utilisez l'entrée standard pour
lire les octets sous la forme de nombre hexadécimaux sur deux chiffres
et séparés par des espaces.
2.5 Calibrage de la carte son
Pour faire les tests définitifs vous devrez régler votre carte son. Pour cela
compilez l'utilitaire showlevel en utilisant la commande make tune.
Reliez la sortie casque de votre carte son à l'entrée micro. Lancez l'utilitaire
showlevel puis votre exécutable d'encodage. Jouez avec les contrôles du
mixeur alsamixer jusqu'à ce que l'utilitaire showlevel montre un
étalement des échantillons sur une large plage de valeur dans l'intervalle
0 à 255, et ce sans saturation. Une fois les bons réglages obtenus vous pouvez
sauver votre configuration avec la commande
/usr/sbin/alsactl -f ~/sound.cfg store
La configuration peut ensuite être installée à nouveau avec la commande
/usr/sbin/alsactl -f ~/sound.cfg restore
2.6 Décodage de données
Bien entendu vous devez aussi trouver une méthode pour décoder les sons
émis par votre programme d'encodage et afficher le tableau d'octets reçu.
Le fichier source correspondant est decode.c. D'un point de vue
technique, votre exécutable doit écrire les octets reçus sur sa sortie
standard en hexadécimal avec des espaces comme séparateurs. Si vous
avez procédé comme suggéré pour l'encodage, le décodage se fait en
calculant la durée des bruits. La durée se calcule en comptant le nombre
d'échantillons de bruits précédant un silence suffisament long.
Il ne vous reste plus qu'à reconstituer le tableau d'octets en fonction
des durées détectées.
2.7 Tests
Dans un premier temps vous pouvez vous contenter de tester vos exécutables
sur une seule machine en connectant la sortie casque avec l'entrée microphone.
Dans un second temps, lorsque votre programme semble suffisament solide, faites
un test entre deux PC en connectant les deux cartes son entre elles.
Cherchez à optimiser la vitesse de transfert obtenue.