Ferkenne de Mediastreamer2 VoIP-motor. Diel 2

It materiaal fan it artikel is nommen út myn zen kanaal.

Ferkenne de Mediastreamer2 VoIP-motor. Diel 2

It meitsjen fan in toangenerator

Yn it foarige artikel Wy ynstalleare de mediastreamerbibleteek, ûntwikkelingsark en testen har funksjonaliteit troch in proefapplikaasje te bouwen.

Hjoed sille wy in applikaasje oanmeitsje dy't in toansignaal kin generearje op in lûdkaart. Om dit probleem op te lossen, moatte wy de filters ferbine mei it hjirûnder werjûn lûdgenerator circuit:

Ferkenne de Mediastreamer2 VoIP-motor. Diel 2

Wy lêze it diagram fan links nei rjochts, dit is de rjochting wêryn ús gegevensstream beweecht. De pylken jouwe hjir ek oan. Rjochthoeken jouwe filters oan dy't blokken fan gegevens ferwurkje en it resultaat útfiere. Binnen it rjochthoeke wurdt syn rol oanjûn en it filtertype wurdt krekt ûnder yn haadletters oanjûn. De pylken dy't de rjochthoeken ferbynt binne gegevenswachtrijen wêrmei blokken gegevens wurde levere fan filter nei filter. Yn 't algemien kin in filter in protte yn- en útgongen hawwe.

It begjint allegear mei de klokboarne, dy't it tempo ynstelt wêrop gegevens yn 'e filters berekkene wurde. Neffens syn kloksyklus ferwurket elk filter alle gegevensblokken dy't by syn ynfier binne. En set blokken mei it resultaat yn de wachtrige. Earst, it filter tichtst by de klok boarne fiert berekkeningen, dan de filters ferbûn oan syn útgongen (d'r kinne in protte útgongen), ensafuorthinne. Nei it lêste filter yn 'e keatling is ferwurke, stopet de útfiering oant in nije klok komt. Beats folgje standert in ynterval fan 10 millisekonden.

Litte wy weromgean nei ús diagram. De kloksyklusen komme by de ynfier fan 'e stilteboarne; dit is in filter, dat dwaande is mei it generearjen fan in blok gegevens mei nullen by syn útfier foar elke kloksyklus. As wy dit blok beskôgje as in blok fan lûdsamples, dan is dit neat mear as stilte. Op it earste each liket it nuver om gegevensblokken mei stilte te generearjen - it kin ommers net heard wurde, mar dizze blokken binne nedich foar de wurking fan 'e lûdsinjaalgenerator. De generator brûkt dizze blokken as in leech blêd papier, en registrearret lûdsmonsters yn har. Yn syn normale steat is de generator útskeakele en stjoert gewoan ynfierblokken nei de útfier. Sa passe blokken fan stilte ûnferoare troch it hiele circuit fan lofts nei rjochts, en einigje yn 'e lûdskaart. Dy't stil blokken nimt út 'e wachtrige ferbûn mei syn ynfier.

Mar alles feroaret as de generator wurdt jûn in kommando te spyljen lûd, it begjint te generearjen lûd samples en ferfangt se mei samples yn de ynfier blokken en set de feroare blokken by de útfier. De lûdskaart begjint lûd te spyljen. Hjirûnder is in programma dat it hjirboppe beskreaune wurkskema ymplementearret:

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

Nei it inisjalisearjen fan de mediastreamer wurde trije filters oanmakke: voidsource, dtmfgen, snd_card_write. In klok boarne wurdt makke.

Dan moatte jo de filters ferbine yn oerienstimming mei ús sirkwy, en de klokboarne moat as lêste ferbûn wurde, om't it sirkwy direkt begjint te wurkjen. As jo ​​ferbine in klok boarne oan in ûnfoltôge sirkwy, it kin barre dat de media streamer crasht as it detektearret op syn minst ien filter yn 'e keatling mei alle yngongen of alle útgongen "hingjende yn' e loft" (net ferbûn).

Ferbining fan filters wurdt dien mei de funksje

ms_filter_link(src, src_out, dst, dst_in)

wêr't it earste argumint in oanwizer is nei it boarnefilter, is it twadde argumint it boarneútfiernûmer (tink dat yn- en útgongen binne nûmere fan nul). It tredde argumint is in oanwizer nei de ûntfanger filter, de fjirde is de ûntfanger ynfier nûmer.

Alle filters binne ferbûn en de klokboarne is as lêste ferbûn (hjirnei sille wy it gewoan in ticker neame). Dêrnei begjint ús lûdscircuit te wurkjen, mar yn 'e kompjûtersprekkers is noch neat te hearren - de lûdgenerator is útskeakele en giet gewoan troch de ynfiergegevensblokken mei stilte. Om te begjinnen mei it generearjen fan in toan, moatte jo de generatorfiltermetoade útfiere.

Wy sille generearje in twa-tone (DTMF) sinjaal oerienkomt mei it drukken op de "1" knop op 'e telefoan. Om dit te dwaan, brûke wy de funksje ms_filter_call_method() Wy neame de MS_DTMF_GEN_PLAY metoade, trochjaan it as argumint in oanwizer nei de koade dat it ôfspieljen sinjaal moat oerienkomme mei.

Alles wat oerbliuwt is it programma te kompilearjen:

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

En rinne:

$ ./mstest2

Nei it starten fan it programma sille jo in koart lûdsinjaal hearre, besteande út twa toanen yn 'e kompjûtersprekker.

Wy bouden en lansearre ús earste lûd circuit. Wy seagen hoe't jo filterynstânsjes kinne oanmeitsje, hoe't se kinne ferbine en hoe't se har metoaden neame. Wylst wy bliid binne mei ús earste súkses, moatte wy noch omtinken jaan oan it feit dat ús programma it tawiisde ûnthâld net befrijt foar it ôfsluten. Yn de folgjende artikel wy sille leare om nei ússels op te romjen.

Boarne: www.habr.com

Add a comment