Verken die Mediastreamer2 VoIP-enjin. Deel 2

Die materiaal van die artikel is geneem uit my zen-kanaal.

Verken die Mediastreamer2 VoIP-enjin. Deel 2

Die skep van 'n toongenerator

In die vorige Artikel Ons het die mediastreamer-biblioteek, ontwikkelingsinstrumente geïnstalleer en hul funksionaliteit getoets deur 'n proeftoepassing te bou.

Vandag sal ons 'n toepassing skep wat 'n toonsein op 'n klankkaart kan genereer. Om hierdie probleem op te los, moet ons die filters koppel aan die klankopwekkerkring wat hieronder getoon word:

Verken die Mediastreamer2 VoIP-enjin. Deel 2

Ons lees die diagram van links na regs, dit is die rigting waarin ons datavloei beweeg. Die pyle dui ook hierop. Reghoeke dui filters aan wat blokke data verwerk en die resultaat uitvoer. Binne die reghoek word sy rol aangedui en die filtertipe word net onder in hoofletters aangedui. Die pyle wat die reghoeke verbind, is datarye waardeur blokke data van filter na filter afgelewer word. Oor die algemeen kan 'n filter baie insette en uitsette hê.

Dit begin alles met die klokbron, wat die tempo bepaal waarteen data in die filters bereken word. Volgens sy kloksiklus verwerk elke filter alle datablokke wat by sy invoer is. En sit blokke met die resultaat uit in die ry. Eerstens voer die filter naaste aan die klokbron berekeninge uit, dan die filters wat aan sy uitsette gekoppel is (daar kan baie uitsette wees), ensovoorts. Nadat die laaste filter in die ketting verwerk is, stop die uitvoering totdat 'n nuwe horlosie opdaag. Maatslae volg by verstek 'n interval van 10 millisekondes.

Kom ons keer terug na ons diagram. Die kloksiklusse kom by die inset van die stiltebron aan; dit is 'n filter wat besig is om 'n blok data te genereer wat nulle bevat by sy uitset vir elke kloksiklus. As ons hierdie blok as 'n blok klankmonsters beskou, dan is dit niks meer as stilte nie. Met die eerste oogopslag lyk dit vreemd om datablokke met stilte te genereer - dit kan immers nie gehoor word nie, maar hierdie blokke is nodig vir die werking van die klankseingenerator. Die kragopwekker gebruik hierdie blokke soos 'n leë vel papier en neem klankmonsters daarin op. In sy normale toestand is die kragopwekker afgeskakel en stuur eenvoudig insetblokke aan na die uitset. Blokke van stilte gaan dus onveranderd deur die hele stroombaan van links na regs en beland in die klankkaart. Wat stilweg blokke neem van die tou wat aan sy insette gekoppel is.

Maar alles verander as die kragopwekker 'n opdrag gegee word om klank te speel, dit begin om klankmonsters te genereer en vervang dit met monsters in die insetblokke en plaas die veranderde blokke by die uitset. Die klankkaart begin klank speel. Hieronder is 'n program wat die werkskema wat hierbo beskryf word, implementeer:

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

Nadat die mediastreamer geïnisialiseer is, word drie filters geskep: voidsource, dtmfgen, snd_card_write. 'n Klokbron word geskep.

Dan moet u die filters in ooreenstemming met ons stroombaan koppel, en die klokbron moet laaste gekoppel word, aangesien die stroombaan onmiddellik sal begin werk. As jy 'n klokbron aan 'n onvoltooide stroombaan koppel, kan dit gebeur dat die mediastreamer ineenstort as dit ten minste een filter in die ketting bespeur met alle insette of alle uitsette "hangend in die lug" (nie gekoppel nie).

Die koppeling van filters word gedoen met behulp van die funksie

ms_filter_link(src, src_out, dst, dst_in)

waar die eerste argument 'n wyser na die bronfilter is, is die tweede argument die bronuitsetnommer (let daarop dat insette en uitsette genommer is vanaf nul). Die derde argument is 'n wyser na die ontvanger filter, die vierde is die ontvanger invoer nommer.

Alle filters is gekoppel en die klokbron word laaste gekoppel (hierna sal ons dit bloot 'n tikker noem). Daarna begin ons klankkring werk, maar niks kan nog in die rekenaarluidsprekers gehoor word nie – die klankopwekker word afgeskakel en gaan eenvoudig met stilte deur die insetdatablokke. Om 'n toon te begin genereer, moet jy die kragopwekkerfiltermetode gebruik.

Ons sal 'n twee-toon (DTMF) sein genereer wat ooreenstem met die druk van die "1" knoppie op die telefoon. Om dit te doen, gebruik ons ​​die funksie ms_filter_call_method() Ons noem die MS_DTMF_GEN_PLAY-metode en gee dit as 'n argument 'n wyser na die kode waarmee die terugspeelsein moet ooreenstem.

Al wat oorbly is om die program saam te stel:

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

En hardloop:

$ ./mstest2

Nadat u die program begin het, sal u 'n kort klanksein wat uit twee tone bestaan, in die rekenaarluidspreker hoor.

Ons het ons eerste klankbaan gebou en bekendgestel. Ons het gesien hoe om filtergevalle te skep, hoe om hulle te koppel en hoe om hul metodes te noem. Alhoewel ons tevrede is met ons aanvanklike sukses, moet ons steeds aandag gee aan die feit dat ons program nie die toegewese geheue vrymaak voordat ons dit verlaat nie. In die volgende Artikel ons sal leer om agter onsself op te ruim.

Bron: will.com

Voeg 'n opmerking