Ngajalajah mesin Mediastreamer2 VoIP. Bagian 2

Materi artikel dicokot ti abdi saluran zen.

Ngajalajah mesin Mediastreamer2 VoIP. Bagian 2

Nyiptakeun Generator Tone

Dina saméméhna artikel Kami masang perpustakaan streamer média, alat pamekaran sareng nguji fungsionalitasna ku ngawangun aplikasi percobaan.

Dinten ieu kami bakal nyiptakeun aplikasi anu tiasa ngahasilkeun sinyal nada dina kartu sora. Pikeun ngajawab masalah ieu urang kudu nyambungkeun saringan kana sirkuit generator sora ditémbongkeun di handap ieu:

Ngajalajah mesin Mediastreamer2 VoIP. Bagian 2

Urang maca diagram ti kénca ka katuhu, ieu arah nu ngalir data urang. Panah ogé nunjukkeun ieu. Sagi opat nunjukkeun saringan anu ngolah blok data sareng ngahasilkeun hasilna. Di jero sagi opat, peranna dituduhkeun sareng jinis saringan dituduhkeun dina hurup kapital di handap. Panah anu nyambungkeun sagi opat nyaéta antrian data dimana blok data dikirimkeun tina saringan ka saringan. Sacara umum, saringan tiasa gaduh seueur input sareng kaluaran.

Éta sadayana dimimitian ku sumber jam, anu nyetél témpo dimana data diitung dina saringan. Numutkeun daur jamna, unggal saringan ngolah sadaya blok data anu aya dina inputna. Sareng nempatkeun blok kalayan hasilna kaluar kana antrian. Kahiji, filter nu pangdeukeutna ka sumber jam ngalakukeun itungan, lajeng saringan disambungkeun ka outputs na (tiasa loba outputs), jeung saterusna. Saatos saringan terakhir dina ranté réngsé ngolah, palaksanaan eureun dugi ka jam énggal sumping. Ketukan, sacara standar, turutan interval 10 milidetik.

Hayu urang balik deui ka diagram urang. Siklus jam dugi ka input sumber tiiseun; ieu mangrupikeun saringan, anu sibuk ngahasilkeun blok data anu ngandung nol dina kaluaranna pikeun unggal siklus jam. Upami urang nganggap blok ieu salaku blok sampel sora, maka ieu sanés ngan ukur tiiseun. Dina glance kahiji, sigana aneh mun ngahasilkeun blok data kalayan tiiseun - sanggeus kabeh, teu bisa kadéngé, tapi blok ieu diperlukeun pikeun operasi generator sinyal sora. Generatorna ngagunakeun blok-blok ieu sapertos lambaran kertas kosong, ngarékam conto sora kana éta. Dina kaayaan normalna, generator dipareuman sareng ngan saukur neraskeun blok input ka kaluaran. Ku kituna, blok tiiseun ngaliwatan unchanged ngaliwatan sakabéh sirkuit ti kénca ka katuhu, tungtung nepi ka kartu sora. Nu cicingeun nyokot blok ti antrian disambungkeun ka input na.

Tapi sagalana robah lamun generator nu dibéré paréntah maén sora, eta dimimitian pikeun ngahasilkeun sampel sora jeung ngagantikeun aranjeunna kalayan sampel dina blok input sarta nempatkeun blok robah dina kaluaran. Kartu sora mimiti muterkeun sora. Di handap ieu program anu ngalaksanakeun skéma kerja anu dijelaskeun di luhur:

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

Saatos ngamimitian streamer média, tilu saringan didamel: voidsource, dtmfgen, snd_card_write. Hiji sumber jam dijieun.

Teras anjeun kedah nyambungkeun saringan saluyu sareng sirkuit kami, sareng sumber jam kedah dihubungkeun terakhir, sabab saatos ieu sirkuit bakal langsung ngamimitian operasi. Lamun anjeun nyambungkeun sumber jam ka sirkuit tacan beres, eta bisa lumangsung yén media streamer ngadat lamun eta ngadeteksi sahanteuna hiji filter dina ranté kalayan sagala inputs atawa sakabéh outputs "ngagantung dina hawa" (teu disambungkeun).

Nyambungkeun saringan dilakukeun nganggo fungsina

ms_filter_link(src, src_out, dst, dst_in)

dimana argumen kahiji mangrupakeun pointer kana saringan sumber, argumen kadua jumlah kaluaran sumber (perhatikeun yén inputs na outputs nu wilanganana mimitian ti enol). Argumen katilu nyaéta pointer kana filter panarima, kaopat nyaéta nomer input panarima.

Sadaya saringan disambungkeun jeung sumber jam disambungkeun panungtungan (hereinafter urang ngan saukur bakal nelepon ticker a). Saatos éta sirkuit sora urang mimiti jalan, tapi teu aya anu tiasa kadéngé dina spiker komputer - generator sora dipareuman sareng ngan saukur ngaliwat blok data input kalayan tiiseun. Pikeun ngamimitian ngahasilkeun nada, anjeun kedah ngajalankeun metode filter generator.

Kami bakal ngahasilkeun sinyal dua nada (DTMF) anu cocog sareng mencét tombol "1" dina telepon. Jang ngalampahkeun ieu, kami nganggo fungsi ms_filter_call_method() Urang nelepon metoda MS_DTMF_GEN_PLAY, ngalirkeun eta salaku argumen pointer kana kode nu sinyal playback kedah pakait jeung.

Sadaya anu tetep nyaéta pikeun nyusun program:

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

Jeung ngajalankeun:

$ ./mstest2

Saatos ngamimitian program, anjeun bakal ngadangu sinyal sora pondok anu diwangun ku dua nada dina spiker komputer.

Kami ngawangun sareng ngaluncurkeun sirkuit sora anu munggaran. Urang nempo kumaha nyieun instansi filter, kumaha nyambungkeun aranjeunna sarta kumaha carana nelepon métode maranéhanana. Sanaos urang bagja sareng kasuksésan awal urang, urang tetep kedah nengetan kanyataan yén program urang henteu ngabebaskeun mémori anu dialokasikeun sateuacan kaluar. Dina salajengna artikel urang bakal diajar beberesih sanggeus sorangan.

sumber: www.habr.com

Tambahkeun komentar