Njelajah mesin Mediastreamer2 VoIP. Bagean 2

Materi artikel dijupuk saka sandi saluran zen.

Njelajah mesin Mediastreamer2 VoIP. Bagean 2

Nggawe Generator Nada

Ing sadurunge artikel Kita nginstal perpustakaan streamer media, alat pangembangan lan nguji fungsine kanthi mbangun aplikasi nyoba.

Dina iki kita bakal nggawe aplikasi sing bisa ngasilake sinyal nada ing kertu swara. Kanggo ngatasi masalah iki, kita kudu nyambungake saringan menyang sirkuit generator swara sing kapacak ing ngisor iki:

Njelajah mesin Mediastreamer2 VoIP. Bagean 2

Kita maca diagram saka kiwa menyang tengen, iki minangka arah aliran data kita. Panah uga nuduhake iki. Rectangles nuduhake saringan sing ngolah blok data lan ngasilake asil. Ing njero persegi dowo, peran kasebut dituduhake lan jinis panyaring dituduhake nganggo huruf kapital ing ngisor iki. Panah sing nyambungake persegi dowo minangka antrian data ing ngendi pamblokiran data dikirim saka saringan menyang saringan. UmumΓ©, saringan bisa duwe akeh input lan output.

Iku kabeh diwiwiti kanthi sumber jam, sing nyetel tempo ing data sing diwilang ing saringan. Miturut siklus jam, saben filter ngolah kabeh blok data sing ana ing input. Lan sijine pamblokiran karo asil metu menyang antrian. Pisanan, filter sing paling cedhak karo sumber jam nindakake petungan, banjur saringan sing disambungake menyang output (bisa ana akeh output), lan liya-liyane. Sawise panyaring pungkasan ing rantai rampung diproses, eksekusi mandheg nganti jam anyar teka. Ngalahake, kanthi gawan, tindakake interval 10 milidetik.

Ayo bali menyang diagram kita. Siklus jam teka ing input sumber bisu; iki minangka saringan, sing sibuk ngasilake blok data sing ngemot nol ing output kanggo saben siklus jam. Yen kita nganggep blok iki minangka blok sampel swara, mula iki ora liya mung nggawe bisu. Sepisanan, katon aneh kanggo ngasilake blok data kanthi bisu - sawise kabeh, ora bisa dirungokake, nanging blok kasebut perlu kanggo operasi generator sinyal swara. Generator nggunakake blok kasebut kaya lembaran kertas kosong, ngrekam conto swara. Ing kahanan normal, generator dipateni lan mung nerusake blok input menyang output. Mangkono, pamblokiran saka kasepen ora diganti liwat kabeh sirkuit saka kiwa menyang tengen, mungkasi munggah ing kertu swara. Kang meneng njupuk pamblokiran saka antrian disambungake menyang input.

Nanging kabeh owah-owahan yen generator diwenehi printah kanggo muter swara, iku wiwit generate conto swara lan ngganti karo conto ing pamblokiran input lan sijine pamblokiran diganti ing output. Kertu swara wiwit muter swara. Ing ngisor iki ana program sing ngetrapake skema kerja sing kasebut ing ndhuwur:

/* Π€Π°ΠΉΠ» 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);   
}

Sawise miwiti streamer media, telung saringan digawe: voidsource, dtmfgen, snd_card_write. Sumber jam digawe.

Banjur sampeyan kudu nyambungake saringan miturut sirkuit kita, lan sumber jam kudu disambungake pungkasan, wiwit sawise iki sirkuit bakal langsung miwiti operasi. Yen sampeyan nyambungake sumber jam menyang sirkuit durung rampung, bisa uga kelakon sing streamer media tubrukan yen ndeteksi paling siji Filter ing chain karo kabeh input utawa kabeh output "nggantung ing udhara" (ora nyambung).

Nyambungake saringan wis rampung nggunakake fungsi

ms_filter_link(src, src_out, dst, dst_in)

ing ngendi argumentasi pisanan minangka pointer menyang filter sumber, argumen kapindho minangka nomer output sumber (cathetan yen input lan output diwenehi nomer wiwit saka nol). Argumentasi katelu minangka penunjuk menyang filter panrima, nomer papat yaiku nomer input panrima.

Kabeh saringan disambungake lan sumber jam disambungake pungkasan (sawise iki kita mung bakal nelpon ticker). Sawise sirkuit swara kita wiwit digunakake, nanging ora ana sing bisa dirungokake ing speaker komputer - generator swara dipateni lan mung ngliwati blok data input kanthi bisu. Kanggo miwiti ngasilake nada, sampeyan kudu mbukak cara filter generator.

Kita bakal ngasilake sinyal loro-nada (DTMF) sing cocog karo mencet tombol "1" ing telpon. Kanggo nindakake iki, kita nggunakake fungsi ms_filter_call_method() Kita nelpon cara MS_DTMF_GEN_PLAY, maringaken minangka argumen pitunjuk kanggo kode sing sinyal puter maneh kudu cocog.

Kabeh sing isih ana yaiku ngumpulake program:

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

Lan mbukak:

$ ./mstest2

Sawise miwiti program, sampeyan bakal krungu sinyal swara cendhak sing dumadi saka rong nada ing speaker komputer.

Kita mbangun lan ngluncurake sirkuit swara pisanan. Kita weruh carane nggawe conto filter, carane nyambungake lan carane nelpon cara. Nalika kita seneng karo sukses awal, kita isih kudu nggatekake kasunyatan manawa program kita ora mbebasake memori sing diparengake sadurunge metu. Ing sabanjure artikel kita bakal sinau kanggo ngresiki sawise awake dhewe.

Source: www.habr.com

Add a comment