Омӯзиши муҳаррики Mediastreamer2 VoIP. Қисми 2

Материали макола аз ман гирифта шудааст канали zen.

Омӯзиши муҳаррики Mediastreamer2 VoIP. Қисми 2

Эҷоди генератори оҳанг

Дар гузашта мақола Мо китобхонаи стримери медиа, абзорҳои таҳияро насб кардем ва фаъолияти онҳоро тавассути сохтани як барномаи озмоишӣ санҷидем.

Имрӯз мо барномаеро эҷод хоҳем кард, ки метавонад сигнали оҳангиро дар корти садоӣ тавлид кунад. Барои ҳалли ин мушкилот мо бояд филтрҳоро ба схемаи генератори садои дар зер нишон додашуда пайваст кунем:

Омӯзиши муҳаррики Mediastreamer2 VoIP. Қисми 2

Мо диаграммаро аз чап ба рост мехонем, ин самтест, ки ҷараёни маълумоти мо ба он ҳаракат мекунад. Тирҳо низ ба ин ишора мекунанд. Росткунҷаҳо филтрҳоро нишон медиҳанд, ки блокҳои маълумотро коркард мекунанд ва натиҷаро мебароранд. Дар дохили росткунҷа, нақши он нишон дода шудааст ва навъи филтр танҳо дар поён бо ҳарфҳои калон нишон дода шудааст. Тирчаҳое, ки росткунҷаҳоро мепайванданд, навбатҳои додаҳо мебошанд, ки тавассути онҳо блокҳои додаҳо аз филтр ба филтр интиқол дода мешаванд. Умуман, филтр метавонад вуруд ва баромадҳои зиёд дошта бошад.

Ҳамааш аз манбаи соат оғоз мешавад, ки суръате, ки маълумот дар филтрҳо ҳисоб карда мешавад, муқаррар мекунад. Мувофиқи давраи соати худ, ҳар як филтр ҳамаи блокҳои маълумотро, ки дар вуруди он ҳастанд, коркард мекунад. Ва блокҳоро бо натиҷа ба навбат мегузорад. Аввалан, филтри ба манбаи соат наздиктарин ҳисобкуниро анҷом медиҳад, баъд филтрҳое, ки ба баромадҳои он пайваст мешаванд (баромадҳо метавонанд зиёд бошанд) ва ғайра. Пас аз он ки филтри охирин дар занҷир коркардро ба анҷом мерасонад, иҷро то омадани соати нав қатъ мешавад. Beats, ба таври нобаёнӣ, фосилаи 10 миллисонияро пайгирӣ мекунад.

Биёед ба диаграммаи худ баргардем. Сиклҳои соат ба вуруди манбаи хомӯшӣ меоянд; ин филтр аст, ки бо тавлиди блоки маълумоте, ки дар баромади худ барои ҳар як давраи соат банд аст, банд аст. Агар мо ин блокро ҳамчун блоки намунаҳои садо баррасӣ кунем, пас ин танҳо хомӯшӣ нест. Дар назари аввал, эҷод кардани блокҳои додаҳо бо хомӯшӣ аҷиб менамояд - дар ниҳоят, онро шунидан мумкин нест, аммо ин блокҳо барои кори генератори сигнали садоӣ заруранд. Генератор ин блокҳоро ба мисли варақи холӣ истифода бурда, дар онҳо намунаҳои садоро сабт мекунад. Дар ҳолати муқаррарии худ, генератор хомӯш карда мешавад ва танҳо блокҳои вурудро ба баромад интиқол медиҳад. Ҳамин тариқ, блокҳои хомӯшӣ аз тамоми схема аз чап ба рост бетағйир мегузаранд ва дар корти садоӣ хотима меёбанд. Ки хомӯшона блокҳоро аз навбате, ки ба вуруди он пайваст аст, мегирад.

Аммо агар ба генератор фармони навохтани садо дода шавад, ҳама чиз тағир меёбад, он ба тавлиди намунаҳои садо оғоз мекунад ва онҳоро бо намунаҳо дар блокҳои воридотӣ иваз мекунад ва блокҳои тағирёфтаро дар баромад мегузорад. Корти садоӣ ба навозиш садо оғоз мекунад. Дар зер барномае ҳаст, ки нақшаи кори дар боло тавсифшударо амалӣ мекунад:

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

Пас аз оғоз кардани стримери медиа, се филтр сохта мешавад: voidsource, dtmfgen, snd_card_write. Манбаи соат сохта шудааст.

Пас шумо бояд филтрҳоро мувофиқи схемаи мо пайваст кунед ва манбаи соат бояд охирин пайваст карда шавад, зеро пас аз ин схема фавран ба кор шурӯъ мекунад. Агар шумо манбаи соатро ба як схемаи нотамом пайваст кунед, он метавонад рӯй диҳад, ки стримери медиа агар ҳадди аққал як филтрро дар занҷир бо ҳама вурудҳо ё ҳама баромадҳои “дар ҳаво овезон” (пайваст нашуда) ошкор кунад, садама мезанад.

Пайваст кардани филтрҳо бо истифода аз функсия анҷом дода мешавад

ms_filter_link(src, src_out, dst, dst_in)

ки дар он далели аввал нишондиҳандаи филтри манбаъ аст, далели дуюм рақами баромади манбаъ мебошад (дар хотир доред, ки вуруд ва баромадҳо аз сифр сар карда рақамгузорӣ карда мешаванд). Далели сеюм нишондиҳандаи филтри қабулкунанда, чорум рақами вуруди қабулкунанда мебошад.

Ҳама филтрҳо пайвастанд ва манбаи соат охирин пайваст карда мешавад (минбаъд мо онро танҳо тикер меномем). Пас аз он схемаи садои мо ба кор оғоз мекунад, аммо дар баландгӯякҳои компютер чизе шунида намешавад - генератори садо хомӯш карда мешавад ва танҳо аз блокҳои додаҳои воридотӣ бо хомӯшӣ мегузарад. Барои оғози тавлиди оҳанг, шумо бояд усули филтри генераторро иҷро кунед.

Мо сигнали дутонгро (DTMF) тавлид хоҳем кард, ки ба пахш кардани тугмаи "1" дар телефон мувофиқ аст. Барои ин, мо функсияро истифода мебарем ms_filter_call_method() Мо усули MS_DTMF_GEN_PLAY-ро меномем ва онро ҳамчун аргумент ҳамчун нишондиҳанда ба рамзе мегузорем, ки сигнали бози бояд ба он мувофиқат кунад.

Танҳо тартиб додани барнома боқӣ мемонад:

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

Ва давидан:

$ ./mstest2

Пас аз оғози барнома, шумо дар баландгӯяки компютер як сигнали кӯтоҳи садои иборат аз ду оҳангро мешунаед.

Мо аввалин схемаи садои худро сохта, ба кор андохтем. Мо дидем, ки чӣ гуна эҷод кардани мисолҳои филтр, чӣ гуна пайваст кардани онҳо ва чӣ гуна ба усулҳои онҳо занг задан лозим аст. Гарчанде ки мо аз муваффақияти аввалини худ қаноатмандем, мо ҳанӯз ҳам бояд ба он диққат диҳем, ки барномаи мо хотираи ҷудошударо пеш аз баромадан озод намекунад. Дар оянда мақола аз паси худ тоза карданро ёд мегирем.

Манбаъ: will.com

Илова Эзоҳ