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)

мұндағы бірінші аргумент бастапқы сүзгіге көрсеткіш болса, екінші аргумент бастапқы шығыс нөмірі болып табылады (кірістер мен шығыстар нөлден бастап нөмірленетінін ескеріңіз). Үшінші аргумент – қабылдағыш сүзгісіне көрсеткіш, төртіншісі – қабылдағыштың кіріс нөмірі.

Барлық сүзгілер қосылған және сағат көзі соңғы рет қосылған (бұдан әрі біз оны жай белгі деп атаймыз). Осыдан кейін біздің дыбыс тізбегі жұмыс істей бастайды, бірақ компьютер динамиктерінен ештеңе естілмейді - дыбыс генераторы өшіріліп, кіріс деректер блоктары арқылы тыныштықпен өтеді. Тонды шығаруды бастау үшін генератор сүзгі әдісін іске қосу керек.

Біз телефондағы «1» түймесін басуға сәйкес келетін екі тондық (DTMF) сигналын жасаймыз. Ол үшін функцияны қолданамыз ms_filter_call_method() Біз MS_DTMF_GEN_PLAY әдісін шақырамыз, оны аргумент ретінде ойнату сигналы сәйкес келетін кодқа көрсеткіш ретінде жібереміз.

Бағдарламаны құрастыру ғана қалады:

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

Және жүгіріңіз:

$ ./mstest2

Бағдарламаны іске қосқаннан кейін компьютер динамигінде екі тоннан тұратын қысқа дыбыстық сигнал естисіз.

Біз алғашқы дыбыс схемасын жасап, іске қостық. Сүзгі даналарын қалай жасау керектігін, оларды қалай қосу керектігін және олардың әдістерін қалай шақыру керектігін көрдік. Бастапқы табысымызға риза болсақ та, бағдарламадан шығу алдында бөлінген жадты босатпайтынына әлі де назар аударуымыз керек. Келесіде мақала біз өзімізді тазалауды үйренеміз.

Ақпарат көзі: www.habr.com

пікір қалдыру