Previous Contents Next

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.


Previous Contents Next