Mediastreamer2 VoIP-mootori uurimine. 2. osa

Artikli materjal on võetud minu zen kanal.

Mediastreamer2 VoIP-mootori uurimine. 2. osa

Toonigeneraatori loomine

Eelmises siit Paigaldasime meediumivooteegi, arendustööriistad ja testisime nende funktsionaalsust proovirakenduse loomisega.

Täna loome rakenduse, mis suudab helikaardile toonsignaali genereerida. Selle probleemi lahendamiseks peame ühendama filtrid allpool näidatud heligeneraatori vooluringiga:

Mediastreamer2 VoIP-mootori uurimine. 2. osa

Loeme diagrammi vasakult paremale, see on suund, kuhu meie andmevoog liigub. Sellele viitavad ka nooled. Ristkülikud tähistavad filtreid, mis töötlevad andmeplokke ja väljastavad tulemuse. Ristküliku sees on näidatud selle roll ja filtri tüüp on näidatud suurtähtedega vahetult allpool. Ristkülikuid ühendavad nooled on andmejärjekorrad, mille kaudu edastatakse andmeplokke filtrist filtrisse. Üldiselt võib filtril olla palju sisendeid ja väljundeid.

Kõik saab alguse kella allikast, mis määrab tempo, millega filtrites andmeid arvutatakse. Vastavalt oma kella tsüklile töötleb iga filter kõiki andmeplokke, mis on tema sisendis. Ja paneb plokid koos tulemusega järjekorda. Kõigepealt teeb arvutusi kella allikale lähim filter, seejärel selle väljunditega ühendatud filtrid (väljundeid võib olla palju) jne. Pärast seda, kui ahela viimane filter on töötlemise lõpetanud, peatub täitmine kuni uue kella saabumiseni. Vaikimisi järgivad löögid 10 millisekundilist intervalli.

Pöördume tagasi meie diagrammi juurde. Kellatsüklid jõuavad vaikuse allika sisendisse; see on filter, mis genereerib iga kellatsükli jaoks nulli sisaldava andmeploki. Kui käsitleme seda plokki helinäidiste plokina, siis pole see midagi muud kui vaikus. Andmeplokkide genereerimine vaikusega tundub esmapilgul veider - seda ju pole kuulda, aga need plokid on helisignaali generaatori tööks vajalikud. Generaator kasutab neid plokke nagu tühja paberilehte, salvestades neisse helinäidiseid. Normaalses olekus on generaator välja lülitatud ja lihtsalt edastab sisendplokid väljundisse. Seega läbivad vaikuse plokid muutumatul kujul kogu vooluringi vasakult paremale, jõudes helikaardile. Mis võtab vaikselt plokke oma sisendiga ühendatud järjekorrast.

Aga kõik muutub, kui generaatorile antakse käsk heli esitada, ta hakkab genereerima helinäidiseid ja asendab need sisendplokkides sämplitega ning paneb muudetud plokid väljundisse. Helikaart hakkab heli esitama. Allpool on programm, mis rakendab ülalkirjeldatud tööskeemi:

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

Pärast meediumistriimi lähtestamist luuakse kolm filtrit: voidsource, dtmfgen, snd_card_write. Luuakse kella allikas.

Seejärel peate ühendama filtrid vastavalt meie vooluringile ja kella allikas tuleb ühendada viimasena, kuna pärast seda hakkab ahel kohe tööle. Kui ühendate kella allika pooleli jäänud vooluringiga, võib juhtuda, et meedia striimer jookseb kokku, kui tuvastab ahelas vähemalt ühe filtri, mille kõik sisendid või kõik väljundid "rippuvad õhus" (pole ühendatud).

Filtrite ühendamine toimub funktsiooni abil

ms_filter_link(src, src_out, dst, dst_in)

kus esimene argument on osuti lähtefiltrile, siis teine ​​argument on allika väljundi number (pange tähele, et sisendid ja väljundid on nummerdatud nullist alates). Kolmas argument on vastuvõtja filtri osuti, neljas vastuvõtja sisendnumber.

Kõik filtrid on ühendatud ja kella allikas on ühendatud viimasena (edaspidi nimetame seda lihtsalt tickeriks). Pärast seda hakkab meie heliahel tööle, kuid arvuti kõlaritest pole veel midagi kuulda - heligeneraator on välja lülitatud ja lihtsalt vaikides läbib sisendandmeplokke. Tooni genereerimise alustamiseks peate käivitama generaatori filtrimeetodi.

Loome kahetoonilise (DTMF) signaali, mis vastab telefoni nupu "1" vajutamisele. Selleks kasutame funktsiooni ms_filter_call_method() Me kutsume meetodit MS_DTMF_GEN_PLAY, edastades selle argumendina viitena koodile, millele taasesitussignaal peaks vastama.

Jääb vaid programm koostada:

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

Ja jookse:

$ ./mstest2

Pärast programmi käivitamist kuulete arvuti kõlarist lühikest kahest toonist koosnevat helisignaali.

Ehitasime ja käivitasime oma esimese heliahela. Nägime, kuidas luua filtrieksemplare, kuidas neid ühendada ja kuidas nende meetodeid kutsuda. Kuigi oleme oma esialgse eduga rahul, peame siiski tähelepanu pöörama asjaolule, et meie programm ei vabasta enne väljumist eraldatud mälu. Järgmises siit õpime enda järelt koristama.

Allikas: www.habr.com

Lisa kommentaar