Nesploraw il-magna VoIP Mediastreamer2. Parti 2

Il-materjal tal-artiklu huwa meħud minn tiegħi kanal zen.

Nesploraw il-magna VoIP Mediastreamer2. Parti 2

Ħolqien ta 'ġeneratur tat-ton

Fil-preċedenti artikolu Installajna l-librerija tal-midja streamer, għodod ta 'żvilupp u ttestjajna l-funzjonalità tagħhom billi nibnu applikazzjoni ta' prova.

Illum se noħolqu applikazzjoni li tista' tiġġenera sinjal tat-ton fuq sound card. Biex insolvu din il-problema għandna bżonn nikkonnettjaw il-filtri fiċ-ċirkwit tal-ġeneratur tal-ħoss muri hawn taħt:

Nesploraw il-magna VoIP Mediastreamer2. Parti 2

Naqraw id-dijagramma mix-xellug għal-lemin, din hija d-direzzjoni li fiha jimxi l-fluss tad-dejta tagħna. Il-vleġeġ jagħtu wkoll ħjiel għal dan. Rettangoli jindikaw filtri li jipproċessaw blokki ta 'dejta u joħorġu r-riżultat. Ġewwa r-rettangolu, ir-rwol tiegħu huwa indikat u t-tip ta 'filtru huwa indikat b'ittri kbar eżatt taħt. Il-vleġeġ li jgħaqqdu r-rettangoli huma kjuwijiet tad-dejta li permezz tagħhom jitwasslu blokki ta’ dejta minn filtru għal filtru. B'mod ġenerali, filtru jista' jkollu ħafna inputs u outputs.

Kollox jibda bis-sors tal-arloġġ, li jistabbilixxi t-tempo li fih id-dejta tiġi kkalkulata fil-filtri. Skont iċ-ċiklu tal-arloġġ tiegħu, kull filtru jipproċessa l-blokki tad-dejta kollha li huma fid-dħul tiegħu. U tpoġġi blokki bir-riżultat barra fil-kju. L-ewwel, il-filtru l-eqreb tas-sors tal-arloġġ iwettaq kalkoli, imbagħad il-filtri konnessi mal-outputs tiegħu (jista 'jkun hemm ħafna outputs), eċċ. Wara li l-aħħar filtru fil-katina jispiċċa l-ipproċessar, l-eżekuzzjoni tieqaf sakemm jasal arloġġ ġdid. Taħbita, awtomatikament, isegwu intervall ta '10 millisekondi.

Ejja nerġgħu lura għad-dijagramma tagħna. Iċ-ċikli tal-arloġġ jaslu fid-dħul tas-sors tas-silenzju; dan huwa filtru, li huwa okkupat jiġġenera blokka ta 'dejta li fiha żerijiet fl-output tiegħu għal kull ċiklu tal-arloġġ. Jekk inqisu din il-blokka bħala blokka ta 'kampjuni tal-ħoss, allura dan mhu xejn aktar minn silenzju. L-ewwel daqqa t'għajn, tidher stramba li tiġġenera blokki tad-dejta bis-silenzju - wara kollox, ma tistax tinstema ', iżda dawn il-blokki huma meħtieġa għat-tħaddim tal-ġeneratur tas-sinjal tal-ħoss. Il-ġeneratur juża dawn il-blokki bħal folja vojta tal-karta, u jirreġistra fihom kampjuni tal-ħoss. Fl-istat normali tiegħu, il-ġeneratur huwa mitfi u sempliċement jgħaddi blokki ta 'input għall-output. Għalhekk, blokki ta 'silenzju jgħaddu mhux mibdula miċ-ċirkwit kollu mix-xellug għal-lemin, u jispiċċaw fil-karta tal-ħoss. Li skiet jieħu blokki mill-kju konness mal-input tiegħu.

Imma kollox jinbidel jekk il-ġeneratur jingħata kmand biex jilgħab il-ħoss, jibda jiġġenera kampjuni tal-ħoss u jibdilhom b'kampjuni fil-blokki tad-dħul u jpoġġi l-blokki mibdula fl-output. Il-karta tal-ħoss tibda tilgħab il-ħoss. Hawn taħt hawn programm li jimplimenta l-iskema tax-xogħol deskritta hawn fuq:

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

Wara l-inizjalizzazzjoni tal-media streamer, jinħolqu tliet filtri: voidsource, dtmfgen, snd_card_write. Jinħoloq sors tal-arloġġ.

Imbagħad għandek bżonn tgħaqqad il-filtri skont iċ-ċirkwit tagħna, u s-sors tal-arloġġ għandu jkun imqabbad l-aħħar, peress li wara dan iċ-ċirkwit jibda jopera immedjatament. Jekk tikkonnettja sors ta 'arloġġ ma' ċirkwit mhux lest, jista 'jiġri li l-media streamer jiġġarraf jekk jiskopri mill-inqas filtru wieħed fil-katina bl-inputs kollha jew l-outputs kollha "mdendlin fl-arja" (mhux konnessi).

Il-konnessjoni tal-filtri ssir bl-użu tal-funzjoni

ms_filter_link(src, src_out, dst, dst_in)

fejn l-ewwel argument huwa pointer għall-filtru tas-sors, it-tieni argument huwa n-numru tal-output tas-sors (innota li l-inputs u l-ħruġ huma nnumerati li jibdew minn żero). It-tielet argument huwa pointer għall-filtru tar-riċevitur, ir-raba 'huwa n-numru tad-dħul tar-riċevitur.

Il-filtri kollha huma konnessi u s-sors ta 'l-arloġġ huwa konness l-aħħar (minn hawn 'il quddiem sempliċement insejħulu ticker). Wara li ċ-ċirkwit tal-ħoss tagħna jibda jaħdem, iżda xejn ma jista 'jinstema' fil-kelliema tal-kompjuter s'issa - il-ġeneratur tal-ħoss jintefa u sempliċement jgħaddi mill-blokki tad-dejta tal-input bis-silenzju. Biex tibda tiġġenera ton, għandek bżonn tħaddem il-metodu tal-filtru tal-ġeneratur.

Se niġġeneraw sinjal b'żewġ kuluri (DTMF) li jikkorrispondi għall-għafas tal-buttuna "1" fuq it-telefon. Biex tagħmel dan, nużaw il-funzjoni ms_filter_call_method() Insejħu l-metodu MS_DTMF_GEN_PLAY, billi ngħadduh bħala argument pointer għall-kodiċi li s-sinjal tal-plejbek għandu jikkorrispondi miegħu.

Li jibqa 'huwa li tiġbor il-programm:

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

U mexxi:

$ ./mstest2

Wara li tibda l-programm, tisma 'sinjal tal-ħoss qasir li jikkonsisti f'żewġ tones fil-kelliem tal-kompjuter.

Bnejna u nedejna l-ewwel ċirkwit tal-ħoss tagħna. Rajna kif noħolqu każijiet ta 'filtri, kif tikkonnettjahom u kif insejħu l-metodi tagħhom. Filwaqt li aħna kuntenti bis-suċċess inizjali tagħna, xorta rridu nagħtu attenzjoni għall-fatt li l-programm tagħna ma jeħlesx il-memorja allokata qabel ma noħorġu. Fil-li jmiss artikolu se nitgħallmu naddfu wara nfusna.

Sors: www.habr.com

Żid kumment