Mediastreamer2 VoIP кыймылдаткычын изилдөө. 2-бөлүк

Макаланын материалы менин zen каналы.

Mediastreamer2 VoIP кыймылдаткычын изилдөө. 2-бөлүк

Тон генераторун түзүү

Мурунку макала Биз медиа стримерлер китепканасын, иштеп чыгуу куралдарын орноттук жана сыноо тиркемесин түзүү менен алардын иштешин сынап көрдүк.

Бүгүн биз үн картасында үн сигналын түзө турган тиркемени түзөбүз. Бул көйгөйдү чечүү үчүн биз төмөндө көрсөтүлгөн үн генераторунун схемасына чыпкаларды туташтырышыбыз керек:

Mediastreamer2 VoIP кыймылдаткычын изилдөө. 2-бөлүк

Диаграмманы солдон оңго карай окуйбуз, бул биздин маалымат агымы кыймылдаган багыт. Жебелер да муну көрсөтүп турат. Төрт бурчтуктар маалымат блокторун иштетип, натыйжаны чыгарган чыпкаларды көрсөтөт. Төрт бурчтуктун ичинде анын ролу көрсөтүлүп, чыпка түрү төмөндө баш тамгалар менен көрсөтүлгөн. Төрт бурчтуктарды бириктирген жебелер маалымат кезеги болуп саналат, алар аркылуу маалымат блоктору чыпкадан чыпкага жеткирилет. Жалпысынан алганда, чыпка көптөгөн киргизүү жана чыгаруу болушу мүмкүн.

Мунун баары чыпкаларда маалыматтар эсептелген темпти белгилеген сааттын булагынан башталат. Сааттын циклине ылайык, ар бир чыпка анын киришинде турган бардык маалымат блокторун иштетет. Жана натыйжасы бар блокторду кезекке коёт. Биринчиден, сааттын булагына эң жакын чыпка эсептөөлөрдү жүргүзөт, андан кийин анын чыгууларына туташтырылган чыпкалар (көп чыгуулар болушу мүмкүн) ж.б.у.с. Чынжырдагы акыркы чыпка иштетүүнү аяктагандан кийин жаңы саат келгенге чейин аткаруу токтойт. Согуштар демейки боюнча 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

Программаны баштагандан кийин, сиз компьютердин динамикинен эки тондон турган кыска үн сигналын угасыз.

Биз биринчи үн схемабызды куруп, ишке киргиздик. Биз фильтр инстанцияларын кантип түзүүнү, аларды кантип бириктирүүнү жана алардын ыкмаларын кантип чакырууну көрдүк. Алгачкы ийгилигибизге ыраазы болсок да, программабыздан чыгуудан мурун бөлүнгөн эстутумду бошотпой турганына көңүл бурушубуз керек. Кийинкисинде макала биз өзүбүздү тазалаганды үйрөнөбүз.

Source: www.habr.com

Комментарий кошуу