Explorando o motor de VoIP Mediastreamer2. Parte 2

O material do artigo está tirado do meu canle zen.

Explorando o motor de VoIP Mediastreamer2. Parte 2

Creación dun xerador de tons

No anterior Artigo Instalamos a biblioteca multimedia, as ferramentas de desenvolvemento e probamos a súa funcionalidade creando unha aplicación de proba.

Hoxe imos crear unha aplicación que pode xerar un sinal de ton nunha tarxeta de son. Para resolver este problema, necesitamos conectar os filtros ao circuíto xerador de son que se mostra a continuación:

Explorando o motor de VoIP Mediastreamer2. Parte 2

Lemos o diagrama de esquerda a dereita, esta é a dirección na que se move o noso fluxo de datos. As frechas tamén insinúan isto. Os rectángulos indican filtros que procesan bloques de datos e emiten o resultado. Dentro do rectángulo, indícase o seu papel e o tipo de filtro indícase en maiúsculas xusto debaixo. As frechas que conectan os rectángulos son filas de datos a través das cales se envían bloques de datos de filtro en filtro. En xeral, un filtro pode ter moitas entradas e saídas.

Todo comeza coa fonte do reloxo, que establece o tempo ao que se calculan os datos nos filtros. Segundo o seu ciclo de reloxo, cada filtro procesa todos os bloques de datos que están na súa entrada. E pon bloques co resultado na cola. En primeiro lugar, o filtro máis próximo á fonte do reloxo realiza cálculos, despois os filtros conectados ás súas saídas (pode haber moitas saídas), etc. Despois de que o último filtro da cadea remate de procesar, a execución detense ata que chega un novo reloxo. Os beats, por defecto, seguen un intervalo de 10 milisegundos.

Volvamos ao noso diagrama. Os ciclos de reloxo chegan á entrada da fonte de silencio; este é un filtro, que está ocupado xerando un bloque de datos que contén ceros na súa saída para cada ciclo de reloxo. Se consideramos este bloque como un bloque de mostras de son, isto non é máis que silencio. A primeira vista, parece estraño xerar bloques de datos con silencio; despois de todo, non se pode escoitar, pero estes bloques son necesarios para o funcionamento do xerador de sinais de son. O xerador usa estes bloques como unha folla de papel en branco, gravando neles mostras de son. No seu estado normal, o xerador está apagado e simplemente envía os bloques de entrada á saída. Así, bloques de silencio pasan sen cambios por todo o circuíto de esquerda a dereita, rematando na tarxeta de son. Que toma silenciosamente bloques da cola conectada á súa entrada.

Pero todo cambia se o xerador recibe un comando para reproducir son, comeza a xerar mostras de son e substitúeas por mostras nos bloques de entrada e pon os bloques modificados na saída. A tarxeta de son comeza a reproducir son. A continuación móstrase un programa que implementa o esquema de traballo descrito anteriormente:

/* Файл 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);   
}

Despois de inicializar o transmisor multimedia, créanse tres filtros: voidsource, dtmfgen, snd_card_write. Créase unha fonte de reloxo.

A continuación, cómpre conectar os filtros de acordo co noso circuíto e a fonte do reloxo debe conectarse en último lugar, xa que despois disto o circuíto comezará a funcionar inmediatamente. Se conectas unha fonte de reloxo a un circuíto inacabado, pode ocorrer que o transmisor multimedia falle se detecta polo menos un filtro na cadea con todas as entradas ou todas as saídas "colgadas no aire" (non conectadas).

A conexión dos filtros realízase mediante a función

ms_filter_link(src, src_out, dst, dst_in)

onde o primeiro argumento é un punteiro ao filtro de orixe, o segundo argumento é o número de saída de orixe (nótase que as entradas e saídas están numeradas a partir de cero). O terceiro argumento é un punteiro para o filtro do receptor, o cuarto é o número de entrada do receptor.

Todos os filtros están conectados e a fonte do reloxo está conectada en último lugar (en diante simplemente chamarémoslle un ticker). Despois diso, o noso circuíto de son comeza a funcionar, pero aínda non se pode escoitar nada nos altofalantes do ordenador: o xerador de son apágase e simplemente pasa a través dos bloques de datos de entrada en silencio. Para comezar a xerar un ton, cómpre executar o método de filtro xerador.

Xeraremos un sinal de dous tons (DTMF) correspondente a premer o botón "1" do teléfono. Para iso, empregamos a función ms_filter_call_method() Chamamos ao método MS_DTMF_GEN_PLAY, pasándoo como argumento como un punteiro ao código ao que debe corresponder o sinal de reprodución.

Só queda compilar o programa:

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

E corre:

$ ./mstest2

Despois de iniciar o programa, escoitará un breve sinal sonoro composto por dous tons no altofalante do ordenador.

Construímos e lanzamos o noso primeiro circuíto de son. Vimos como crear instancias de filtro, como conectalas e como chamar aos seus métodos. Aínda que estamos satisfeitos co noso éxito inicial, aínda temos que prestar atención ao feito de que o noso programa non libera a memoria asignada antes de saír. No seguinte Artigo aprenderemos a limpar despois de nós mesmos.

Fonte: www.habr.com

Engadir un comentario