Explorons le moteur VoIP Mediastreamer2. Partie 2

Le contenu de cet article est tiré de ma chaîne Zen.

Explorons le moteur VoIP Mediastreamer2. Partie 2

Créons un générateur tonal

Dans l'article précédent article Nous avons installé la bibliothèque de streaming multimédia, des outils de développement et vérifié leur fonctionnement en assemblant une application de test.

Aujourd'hui, nous allons créer une application capable de générer un signal tonal sur la carte sonore. Pour réaliser cette tâche, nous devons connecter les filtres selon le schéma suivant du générateur sonore :

Explorons le moteur VoIP Mediastreamer2. Partie 2

Lire le schéma de gauche à droite, c'est dans cette direction que notre flux de données se déplace. Les flèches le suggèrent également. Les rectangles représentent les filtres qui traitent les blocs de données et fournissent le résultat en sortie. À l'intérieur du rectangle, son rôle est indiqué, avec un peu plus bas en lettres majuscules le type de filtre. Les flèches reliant les rectangles sont des files d'attente de données, par lesquelles les blocs de données sont transmis d'un filtre à l'autre. En général, un filtre peut avoir de nombreuses entrées et sorties.

Tout commence par une source d'horloge, qui définit le tempo auquel les données sont traitées dans les filtres. À chaque impulsion de cette horloge, chaque filtre traite tous les blocs de données présents à son entrée. Il fournit des blocs de résultats en sortie — dans une file d'attente. Tout d'abord, le filtre le plus proche de la source d'horloge effectue le traitement, puis les filtres connectés à ses sorties (il peut y avoir plusieurs sorties) et ainsi de suite. Une fois que le dernier filtre de la chaîne a terminé son traitement, l'exécution se met en pause jusqu'à ce qu'une nouvelle impulsion arrive. Par défaut, les impulsions suivent à intervalles de 10 millisecondes.

Revenons à notre schéma. Les impulsions arrivent à l'entrée de la source de silence, c'est un filtre qui s'occupe de générer à chaque impulsion un bloc de données contenant des zéros à sa sortie. Si l'on considère ce bloc comme un bloc d'échantillons sonores, il ne représente rien d'autre que du silence. À première vue, il semble étrange de générer des blocs de données avec du silence — après tout, on ne peut pas l'entendre, mais ces blocs sont nécessaires au fonctionnement du générateur de signal audio. Le générateur utilise ces blocs comme une feuille de papier vierge, y enregistrant les échantillons sonores. Dans son état normal, le générateur est éteint et simplement transmet les blocs d'entrée à la sortie. Ainsi, les blocs de silence passent sans modifications à travers tout le schéma de gauche à droite, atteignant la carte audio. Celle-ci récupère silencieusement les blocs depuis la queue connectée à son entrée.

Mais tout change lorsque le générateur reçoit l'ordre de reproduire du son, il commence à générer des échantillons sonores et les remplace dans les blocs d'entrée, puis envoie les blocs modifiés à la sortie. La carte audio commence à reproduire le son. Voici le programme qui implémente le schéma de fonctionnement décrit ci-dessus :

/* Файл mstest2.c */
#include <mediastreamer2/msfilter.h>
#include <mediastreamer2/msticker.h>
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/mssndcard.h>
int main()
{
    ms_init();

    /* Создаем экземпляры фильтров. */
    MSFilter  *voidsource = ms_filter_new(MS_VOID_SOURCE_ID);
    MSFilter  *dtmfgen = ms_filter_new(MS_DTMF_GEN_ID);
    MSSndCard *card_playback = ms_snd_card_manager_get_default_card(ms_snd_card_manager_get());
    MSFilter  *snd_card_write = ms_snd_card_create_writer(card_playback);

    /* Создаем тикер. */
    MSTicker *ticker = ms_ticker_new();

    /* Соединяем фильтры в цепочку. */
    ms_filter_link(voidsource, 0, dtmfgen, 0);
    ms_filter_link(dtmfgen, 0, snd_card_write, 0);

   /* Подключаем источник тактов. */
   ms_ticker_attach(ticker, voidsource);

   /* Включаем звуковой генератор. */
   char key='1';
   ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY, (void*)&key);

   /* Даем, время, чтобы все блоки данных были получены звуковой картой.*/
   ms_sleep(2);   
}

Après l'initialisation du flux multimédia, trois filtres sont créés : voidsource, dtmfgen, snd_card_write. Une source du signal d'horloge est créée.

Ensuite, il faut établir les connexions entre les filtres conformément à notre schéma, en veillant à connecter la source d'horloge en dernier, car après cela le fonctionnement du schéma commencera immédiatement. Si l'on connecte la source d'horloge à un schéma incomplet, il se peut que le flux multimédia se termine de façon inattendue, s'il découvre dans la chaîne au moins un filtre dont toutes les entrées ou toutes les sorties sont "dans le vide" (non connectées).

La connexion des filtres se fait par la fonction

ms_filter_link(src, src_out, dst, dst_in)

où le premier argument est un pointeur vers le filtre source, le deuxième argument — le numéro de la sortie du source (notez que les entrées et sorties sont numérotées à partir de zéro). Le troisième argument est un pointeur vers le filtre récepteur, le quatrième — le numéro de l'entrée du récepteur.

Tous les filtres sont connectés, et la dernière connexion est la source d'horloge (que nous appelerons simplement le ticker). Ensuite, notre schéma sonore commence à fonctionner, mais il n'y a pour l'instant aucun son dans les haut-parleurs de l'ordinateur — le générateur sonore est éteint et passe simplement les blocs de données d'entrée qui contiennent du silence. Pour commencer la génération d'un signal tonal, il faut exécuter la méthode de filtrage du générateur.

Nous allons générer un signal biphonique (DTMF) correspondant à l'appui sur le bouton "1" d'un téléphone. Pour cela, nous utiliserons la fonction ms_filter_call_method() pour appeler la méthode MS_DTMF_GEN_PLAY, en lui passant un pointeur sur le code correspondant au signal à reproduire comme argument.

Il reste à compiler le programme :

$ gcc mstest2.c -o mstest2 `pkg-config mediastreamer --libs --cflags`

Et à le lancer :

$ ./mstest2

Après avoir lancé le programme, vous entendrez un court signal sonore provenant des haut-parleurs de l'ordinateur, composé de deux tonalités.

Nous avons construit et mis en service notre premier schéma sonore. Nous avons vu comment créer des instances de filtres, comment les connecter et comment appeler leurs méthodes. Ravie de notre premier succès, nous devons cependant prêter attention au fait que notre programme ne libère pas la mémoire allouée avant de se terminer. Dans la prochaine article nous apprendrons à nettoyer après nous.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster