Projet portant sur le traitement numérique du son en réseau.
Le but est de déléguer à un ordinateur la tâche d'effectuer un filtrage d'un fichier son échantillonné. 3 grandes parties :
- La transmission du son en réseau (les fichiers WAV et la transmission UDP)
- Le filtrage du son échantillonné (le filtrage Passe Bas)
- La production sonore sur la carte son (lecture du fichier son)
Ce dossier s'attarde sur l'analyse du système C++ (avec la classe C_wav et le côté serveur) et comprend l'intégralité du programme en C++ en annexe.
[...] En effet l'intérêt est de procéder en streaming c'est-à-dire de filtrer notre son en flux tendu afin d'obtenir un résultat audible immédiatement et ainsi éviter les pénibles temps de téléchargement. Pour cela, nous allons découper notre fichier son en bloc facilement transportable en réseau afin qu'il puisse être traité rapidement sur le serveur renvoyé immédiatement et finalement audible sur l'ordinateur client. Dés réception d'un bloc filtré, un bloc original est immédiatement envoyé au serveur et ainsi de suite jusqu'à traitement total de tous les blocs du fichier. [...]
[...] Cette fonction consistue le moteur de notre système puisque c'est lui qui envoie et récupère les blocs à traiter, il lance également recup_bloc() qui récupère le nouveau bloc à traiter. Envoi et réception des blocs void C_wav::envoi_recep_block(char* IP) { WSADATA wsa; WSAStartup(MAKEWORD(2,0),&wsa); SOCKET sock; Création de la socket SOCKADDR_IN sin; sin.sin_family=AF_INET; sin.sin_addr.s_addr=inet_addr(IP); paramétrage de la socket sin.sin_port=htons(40); sock=socket(AF_INET,SOCK_DGRAM,0);// Définition Protocole UDP bind(sock,(SOCKADDR*)&sin,sizeof(sin)); int sinsize = sizeof(sin); char buffer[4096]; int fin = printf(" Traitement serveur en cours - Filtrage inactif - while( fin 0 ) Tant qu'on est pas au dernier bloc, on continue { fin = recup_bloc(); On passe au bloc suivant par lecture du fichier sendto(sock,bloc,sizeof(bloc),0,(SOCKADDR*)&sin,sizeof(sin));// Envoi bloc printf("."); recvfrom(sock,buffer,sizeof(buffer),0,(SOCKADDR*)&sin,&sinsize);//Réception bloc record_wav(buffer); écrit le nouveau bloc dans le nouveau fichier Out->envoi_buffer_carte_son(buffer,4096*HEADER->BlockAlign); On joue le nouveau bloc } printf(".OK\nNouveau Fichier : result.wav\n"); Out->arret_carte_son(); } Dès l'arrivée du bloc filtré, on l'enregistre dans le fichier result et on le joue par la carte son. [...]
[...] sin.sin_port=htons(40); sock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); bind(sock,(SOCKADDR*)&sin,sizeof(sin)); int sinsize=sizeof(sin); char buffer[4096]; On capte le bloc de 4096 octets char *buf; FLOAT *test; test = (FLOAT*)calloc(4096, sizeof(FLOAT)); while(1) boucle de traitements des packets { recvfrom(sock,buffer,sizeof(buffer),0,(SOCKADDR*)&sin,&sinsize); Réception FILTRAGE A FINIR strcpy(buf,buffer); conversion char Float { UWORD for(i=0 ; iSampleRate; pwfx_out.nAvgBytesPerSec=entete->avgBytesPerSec; pwfx_out.nBlockAlign=entete->BlockAlign; pwfx_out.wBitsPerSample=entete->BitsPerSample; pwfx_out.cbSize=0; //ouverture de la carte son en sortie result=waveOutOpen(&phwo &pwfx_out switch (result) { case MMSYSERR_NOERROR: printf("Port de sortie ouvert . break; case MMSYSERR_ALLOCATED: printf("Recording device reports that it is already in use."); exit(0); break; case MMSYSERR_BADDEVICEID: printf("BAD DEVICE exit(0); break; case MMSYSERR_NODRIVER: printf("No Driver Installed"); exit(0); break; case MMSYSERR_NOMEM: printf("Error Allocating Memory"); exit(0); break; case WAVERR_BADFORMAT: printf("The selected recording device does not support the selected recording format. [...]
[...] Nous ne rentrerons pas dans le détail mathématique de ce type de filtre mais nous retiendrons juste le résultat qui annihile les sons aigues et rend le son beaucoup plus grave. Le filtrage est produit par bloc de 4096 octets correspondant au bloc arrivant par le réseau La lecture du fichier son Une fois que le bloc filtré est enfin revenu sur la machine cliente nous allons procéder dans la foulée à sa lecture par la carte son. Pour se faire, nous initialisons la carte son avec les paramètres d'échantillonnage issu de l'entête du wav. [...]
[...] Par soucis de simplification, notre programme se basera sur des fichiers monophoniques qui nous simplifiera grandement leurs traitements mais qui restent similaires à ceux réservés à la stéréophonie. Au fur et à mesure que le traitement avance le nouveau fichier créé reçoit ses nouveaux blocs les uns à la suite des autres avec préalablement l'entête originel recopiée en début de fichier La transmission UDP Le protocole de transmission UDP est un mode non connecté qui permet l'échange de datagrammes sans acquittements. [...]
Source aux normes APA
Pour votre bibliographieLecture en ligne
avec notre liseuse dédiée !Contenu vérifié
par notre comité de lecture