Mediastreamer2 VoIP එන්ජිම ගවේෂණය කිරීම. 2 කොටස

ලිපියේ ද්‍රව්‍ය මගේ වෙතින් ලබාගෙන ඇත සෙන් නාලිකාව.

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

අදහස් එක් කරන්න