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

Хөтөлбөрийг эхлүүлсний дараа та компьютерийн чанга яригч дээр хоёр тонноос бүрдэх богино дуут дохиог сонсох болно.

Бид анхны дууны хэлхээгээ барьж, эхлүүлсэн. Шүүлтүүрийн жишээг хэрхэн үүсгэх, тэдгээрийг хэрхэн холбох, тэдгээрийн аргуудыг хэрхэн дуудах талаар бид харсан. Анхны амжилтдаа сэтгэл хангалуун байгаа ч манай програмаас гарахын өмнө хуваарилагдсан санах ойг чөлөөлөхгүй байхыг анхаарах хэрэгтэй. Дараагийнх нь нийтлэл бид өөрсдийгөө цэвэрлэж сурах болно.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх