Mediastreamer2 VoIP dvigatelini o'rganish. 2-qism

Maqolaning materiali mendan olingan zen kanali.

Mediastreamer2 VoIP dvigatelini o'rganish. 2-qism

Ohang generatorini yaratish

Avvalgisida maqola Biz media-strimer kutubxonasini, ishlab chiqish vositalarini o'rnatdik va sinov ilovasini yaratish orqali ularning funksionalligini sinab ko'rdik.

Bugun biz ovoz kartasida ohangli signal ishlab chiqaradigan dastur yaratamiz. Ushbu muammoni hal qilish uchun filtrlarni quyida ko'rsatilgan ovoz generatorining sxemasiga ulashimiz kerak:

Mediastreamer2 VoIP dvigatelini o'rganish. 2-qism

Biz diagrammani chapdan o'ngga o'qiymiz, bu bizning ma'lumotlar oqimimiz harakatlanadigan yo'nalishdir. O'qlar ham bunga ishora qiladi. To'rtburchaklar ma'lumotlar bloklarini qayta ishlaydigan va natijani chiqaradigan filtrlarni bildiradi. To'rtburchak ichida uning roli ko'rsatilgan va filtr turi pastda katta harflar bilan ko'rsatilgan. To'rtburchaklarni bog'laydigan o'qlar ma'lumotlar navbatlari bo'lib, ular orqali ma'lumotlar bloklari filtrdan filtrga uzatiladi. Umuman olganda, filtr juda ko'p kirish va chiqishlarga ega bo'lishi mumkin.

Hammasi soat manbasidan boshlanadi, u filtrlarda ma'lumotlarni hisoblash tezligini belgilaydi. O'zining soat aylanishiga ko'ra, har bir filtr o'z kirishidagi barcha ma'lumotlar bloklarini qayta ishlaydi. Va natijaga ega bo'lgan bloklarni navbatga qo'yadi. Birinchidan, soat manbasiga eng yaqin filtr hisob-kitoblarni amalga oshiradi, keyin uning chiqishlariga ulangan filtrlar (ko'p chiqishlar bo'lishi mumkin) va hokazo. Zanjirdagi oxirgi filtr ishlov berishni tugatgandan so'ng, yangi soat kelguncha bajarish to'xtaydi. Beats, sukut bo'yicha, 10 millisekundlik intervalni kuzatib boradi.

Keling, diagramamizga qaytaylik. Soat sikllari jimlik manbasining kirishiga keladi; bu har bir soat sikli uchun chiqishida nollarni o'z ichiga olgan ma'lumotlar blokini yaratish bilan band bo'lgan filtr. Agar biz ushbu blokni tovush namunalari bloki deb hisoblasak, bu sukunatdan boshqa narsa emas. Bir qarashda, ma'lumotlar bloklarini jimlik bilan yaratish g'alati tuyuladi - axir, uni eshitib bo'lmaydi, ammo bu bloklar ovozli signal generatorining ishlashi uchun zarurdir. Jeneratör bu bloklardan bo'sh qog'oz varag'i kabi foydalanadi va ularga ovoz namunalarini yozib oladi. Oddiy holatda, generator o'chiriladi va kirish bloklarini chiqishga yo'naltiradi. Shunday qilib, sukunat bloklari butun sxema bo'ylab chapdan o'ngga o'zgarmagan holda o'tib, ovoz kartasida tugaydi. Uning kirishiga ulangan navbatdagi bloklarni jimgina oladi.

Ammo generatorga ovozni ijro etish buyrug'i berilsa, hamma narsa o'zgaradi, u tovush namunalarini ishlab chiqarishni boshlaydi va ularni kirish bloklaridagi namunalar bilan almashtiradi va o'zgartirilgan bloklarni chiqishga qo'yadi. Ovoz kartasi ovoz chiqara boshlaydi. Quyida yuqorida tavsiflangan ish sxemasini amalga oshiradigan dastur mavjud:

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

Media strimeri ishga tushirilgandan so'ng uchta filtr yaratiladi: voidsource, dtmfgen, snd_card_write. Soat manbai yaratiladi.

Keyin filtrlarni sxemamizga muvofiq ulashingiz kerak va soat manbai oxirgi marta ulangan bo'lishi kerak, chunki shundan so'ng sxema darhol ishlay boshlaydi. Agar siz soat manbasini tugallanmagan kontaktlarning zanglashiga olib qo'ysangiz, barcha kirishlari yoki barcha chiqishlari "havoda osilgan" (ulanmagan) zanjirda kamida bitta filtrni aniqlasa, media strimer ishdan chiqishi mumkin.

Filtrlarni ulash funksiya yordamida amalga oshiriladi

ms_filter_link(src, src_out, dst, dst_in)

bu erda birinchi argument manba filtriga ko'rsatgich bo'lsa, ikkinchi argument manba chiqish raqami (kirish va chiqishlar noldan boshlab raqamlanganligini unutmang). Uchinchi argument - qabul qiluvchi filtriga ko'rsatgich, to'rtinchisi - qabul qiluvchining kirish raqami.

Barcha filtrlar ulanadi va soat manbai oxirgi marta ulanadi (bundan keyin biz uni shunchaki ticker deb ataymiz). Shundan so'ng bizning ovoz sxemamiz ishlay boshlaydi, lekin kompyuter karnaylarida hali hech narsa eshitilmaydi - ovoz generatori o'chiriladi va kirish ma'lumotlar bloklari orqali jimgina o'tadi. Ohang ishlab chiqarishni boshlash uchun siz generator filtri usulini ishga tushirishingiz kerak.

Telefondagi "1" tugmasini bosishga mos keladigan ikki tonnali (DTMF) signal hosil qilamiz. Buning uchun funksiyadan foydalanamiz ms_filter_call_method() Biz MS_DTMF_GEN_PLAY usulini chaqiramiz, uni argument sifatida ijro etish signali mos kelishi kerak bo'lgan kodga ko'rsatgich sifatida uzatamiz.

Qolgan narsa dasturni kompilyatsiya qilishdir:

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

Va yugur:

$ ./mstest2

Dasturni ishga tushirgandan so'ng, siz kompyuter karnayida ikki tonnadan iborat qisqa ovozli signalni eshitasiz.

Biz birinchi ovoz sxemamizni qurdik va ishga tushirdik. Filtr misollarini qanday yaratishni, ularni qanday ulashni va ularning usullarini qanday chaqirishni ko'rdik. Dastlabki muvaffaqiyatimizdan xursand bo'lsak-da, dasturimiz chiqishdan oldin ajratilgan xotirani bo'shatmasligiga e'tibor qaratishimiz kerak. Keyingisida maqola biz o'zimizni tozalashni o'rganamiz.

Manba: www.habr.com

a Izoh qo'shish