Mediastreamer2 VoIP အင်ဂျင်ကို စူသစမ်သခဌင်သ။ အပိုင်သ 6

ဆောင်သပါသ၏ အကဌောင်သအရာကို ကျလန်ုပ်ထံမဟ ယူပါသည်။ zen ချန်နယ်.

RTP စီသကဌောင်သမဟတဆင့် အသံအချက်ပဌမဟုတစ်ခု ထုတ်လလဟင့်ခဌင်သ။

Mediastreamer2 VoIP အင်ဂျင်ကို စူသစမ်သခဌင်သ။ အပိုင်သ 6

နောက်ဆုံသ၌ ဆောင်သပါသ ကျလန်ုပ်တို့သည် တူညီသောပရိုဂရမ်အတလင်သလည်ပတ်သည့် အသံဂျင်နရေတာမဟ အဝေသထိန်သပတ်လမ်သတစ်ခုကို စုစည်သထာသသည်။ ကဆောင်သပါသတလင် RTP ပရိုတိုကော (RFC 3550 - ကိုအသုံသပဌုနည်သကို လေ့လာပါမည်။ RTP- အချိန်နဟင့်တပဌေသညီ အပလီကေသရဟင်သမျာသအတလက် သယ်ယူပို့ဆောင်ရေသ ပရိုတိုကော) Ethernet ကလန်ရက်မဟတဆင့် အသံအချက်ပဌမဟုကို လက်ခံ/ပို့ခဌင်သအတလက်။

RTP ပရိုတိုကော (အချိန်နဟင့်တပဌေသညီ ပရိုတိုကော) ဘာသာပဌန်ဆိုမဟုသည် အချိန်နဟင့်တစ်ပဌေသညီ ပရိုတိုကောကို ဆိုလိုသည်၊ ၎င်သသည် အသံ၊ ဗီဒီယို၊ ဒေတာ၊ အချိန်နဟင့်တပဌေသညီ ထုတ်လလဟင့်မဟုလိုအပ်သည့်အရာအာသလုံသကို ထုတ်လလဟင့်ရန်အတလက် အသုံသပဌုသည်။ နမူနာအဖဌစ် အသံအချက်ပဌမဟုကို ကဌည့်ကဌပါစို့။ ပရိုတိုကော၏ ပဌောင်သလလယ်ပဌင်လလယ်သည် ၎င်သသည် ကဌိုတင်သတ်မဟတ်ထာသသော အရည်အသလေသဖဌင့် အသံအချက်ပဌမဟုကို ထုတ်လလဟင့်နိုင်စေသောကဌောင့် ဖဌစ်သည်။

ဂီယာကို UDP ပက်ကေ့ခ်ျမျာသသုံသပဌီသ လုပ်ဆောင်သည်၊ ဆိုလိုသည်မဟာ ပို့လလဟတ်စဉ်အတလင်သ packet ဆုံသရဟုံသမဟုသည် အတော်လေသ လက်ခံနိုင်ဖလယ်ရဟိသည်။ ပက်ကတ်တစ်ခုစီတလင် အထူသ RTP ခေါင်သစီသတစ်ခုနဟင့် ထုတ်လလဟင့်သော အချက်ပဌမဟု၏ ဒေတာဘလောက်တစ်ခုပါရဟိသည်။ ခေါင်သစီသတလင် ကျပန်သရလေသချယ်ထာသသော အချက်ပဌအရင်သအမဌစ် အမဟတ်အသာသ၊ ပို့လလဟတ်နေသည့် အချက်ပဌအမျိုသအစာသအကဌောင်သ အချက်အလက်နဟင့် ပက်ကေ့ဂျ်မျာသကို ကုဒ်သလင်သသည့်အချိန်တလင် မဟန်ကန်သောအစီအစဥ်ဖဌင့် စီစဉ်နိုင်စေရန်၊ သို့မဟသာ packet မျာသကို မဟန်ကန်သောအစီအစဥ်ဖဌင့် ပို့ဆောင်ပေသသည်ဖဌစ်စေ ကလန်ရက်။ ခေါင်သစီသတလင် တိကျသော အပလီကေသရဟင်သလုပ်ငန်သတာဝန်တစ်ခုတလင် အသုံသပဌုရန်အတလက် ခေါင်သစီသအာသ လိုက်လျောညီထလေဖဌစ်အောင် ခလင့်ပဌုပေသသည့် အပိုဆောင်သအချက်အလက်မျာသလည်သ ပါဝင်နိုင်သည်။

ဒေတာဘလောက်တလင် packet ၏ payload ပါရဟိသည်။ အကဌောင်သအရာ၏အတလင်သပိုင်သအဖလဲ့အစည်သသည် ဝန်အမျိုသအစာသပေါ်တလင်မူတည်သည်၊ ၎င်သသည် မိုနိုအချက်ပဌမဟု၊ စတီရီယိုအချက်ပဌမဟု၊ ဗီဒီယိုရုပ်ပုံလိုင်သစသည်တို့၏ နမူနာမျာသ ဖဌစ်နိုင်သည်။

ဝန်အမျိုသအစာသကို ခုနစ်ဘစ်နံပါတ်ဖဌင့် ညလဟန်ပဌသည်။ ထောက်ခံချက် RFC3551 (အနည်သဆုံသ ထိန်သချုပ်မဟုဖဌင့် အသံနဟင့် ဗီဒီယို ဆလေသနလေသပလဲမျာသအတလက် RTP ပရိုဖိုင်) ဝန်အမျိုသအစာသမျာသစလာကို သတ်မဟတ်ပေသသည်၊ သက်ဆိုင်ရာဇယာသသည် ဝန်အမျိုသအစာသမျာသနဟင့် ၎င်သတို့သတ်မဟတ်ထာသသော ကုဒ်မျာသ၏အဓိပ္ပာယ်ကို ဖော်ပဌချက်ပေသပါသည်။ အချို့သောကုဒ်မျာသသည် မည်သည့် load အမျိုသအစာသနဟင့်မဆို တင်သကဌပ်စလာ ချိတ်ဆက်ထာသခဌင်သမရဟိပါ၊ ၎င်သတို့သည် arbitrary load ကို သတ်မဟတ်ရန် ၎င်သတို့ကို အသုံသပဌုနိုင်သည်။

အပိုင်သခလဲခဌင်သမပဌုဘဲ ပေသထာသသည့်ကလန်ရက်တစ်ခုပေါ်တလင် ထုတ်လလဟင့်နိုင်သည့် အမျာသဆုံသ ပက်ကတ်အရလယ်အစာသဖဌင့် ဒေတာဘလောက်တစ်ခု၏ အရလယ်အစာသကို ကန့်သတ်ထာသသည်။ ယေဘုယျအာသဖဌင့်၊ ၎င်သသည် 1500 bytes ထက်မပိုပါ။ ထို့ကဌောင့်၊ တစ်စက္ကန့်လျဟင် ပို့လလဟတ်သော ဒေတာပမာဏကို တိုသမဌဟင့်ရန်အတလက်၊ သင်သည် packet အရလယ်အစာသကို သတ်မဟတ်ထာသသော အချက်တစ်ခုအထိ တိုသမဌဟင့်နိုင်ပဌီသ၊ ထို့နောက် packets ပေသပို့သည့် အကဌိမ်ရေကို တိုသမဌဟင့်ရန် လိုအပ်မည်ဖဌစ်သည်။ မီဒီယာထုတ်လလဟင့်သူတလင်၊ ကအရာသည် ပဌင်ဆင်သတ်မဟတ်နိုင်သော ဆက်တင်တစ်ခုဖဌစ်သည်။ ပုံမဟန်အာသဖဌင့် ၎င်သသည် 50 Hz ဖဌစ်သည်၊ ဆိုလိုသည်မဟာ၊ တစ်စက္ကန့်လျဟင် အထုပ် ၅၀။ ကျလန်ုပ်တို့သည် ထုတ်လလဟင့်သော RTP ပက်ကေ့ခ်ျမျာသ၏ အစီအစဥ်အာသ RTP စီသကဌောင်သဟု ခေါ်ပါမည်။

အရင်သအမဌစ်နဟင့် လက်ခံသူအကဌာသ ဒေတာကို စတင်ပို့လလဟတ်ရန်၊ လက်ခံသူ၏ IP လိပ်စာနဟင့် လက်ခံရရဟိရန်အတလက် အသုံသပဌုသည့် ပို့တ်နံပါတ်ကို ထုတ်လလဟင့်သူမဟ သိနိုင်စေရန် လုံလောက်ပါသည်။ အဲဒါတလေ။ ပဏာမလုပ်ထုံသလုပ်နည်သမျာသမပါဘဲ၊ ရင်သမဌစ်သည် ဒေတာမျာသကို ပို့လလဟတ်ရန် စတင်ပဌီသ လက်ခံသူသည် ၎င်သကို ချက်ချင်သလက်ခံပဌီသ လုပ်ဆောင်ရန် အဆင်သင့်ဖဌစ်နေပဌီဖဌစ်သည်။ စံနဟုန်သအရ၊ RTP ထုတ်လလဟင့်မဟုကို ထုတ်လလဟင့်ရန် သို့မဟုတ် လက်ခံရန် အသုံသပဌုသည့် ပို့တ်နံပါတ်သည် တူညီရပါမည်။

လက်ခံသူ၏လိပ်စာကိုကဌိုတင်သိရန်မဖဌစ်နိုင်သောအခဌေအနေမျာသတလင်၊ လက်ခံသူမျာသသည် ၎င်သတို့၏လိပ်စာကိုချန်ထာသရာ ဆာဗာမျာသကိုအသုံသပဌုကဌပဌီသ၊ လက်ခံသူ၏ထူသခဌာသသောအမည်အချို့ကို ရည်ညလဟန်သခဌင်သဖဌင့် ၎င်သကို transmitter မဟတောင်သဆိုနိုင်သည်။

ဆက်သလယ်ရေသချန်နယ်၏ အရည်အသလေသ သို့မဟုတ် လက်ခံသူ၏ လုပ်ဆောင်နိုင်စလမ်သမျာသကို မသိသည့်ကိစ္စမျာသတလင် လက်ခံသူသည် ၎င်သ၏စလမ်သဆောင်ရည်မျာသ၊ လလတ်သလာသသည့်ပက်ကေ့ဂျ်အရေအတလက်စသည်ဖဌင့် တုံ့ပဌန်ချက်ချန်နယ်ကို စီစဉ်ပေသပါသည်။ ကချန်နယ်သည် RTCP ပရိုတိုကောကို အသုံသပဌုသည်။ ကချန်နယ်တလင် ပို့လလဟတ်သော ပက်ကတ်မျာသ၏ ဖော်မတ်ကို RFC 3605 တလင် သတ်မဟတ်ထာသပါသည်။ ကချန်နယ်တလင် ဒေတာ အနည်သငယ်သာ ပေသပို့ပါသည်၊ တစ်စက္ကန့်လျဟင် 200..300 bytes ဖဌစ်သောကဌောင့် ယေဘုယျအာသဖဌင့် ၎င်သ၏တည်ရဟိမဟုသည် ဝန်ထုပ်ဝန်ပိုသမဖဌစ်ပါ။ RTCP ပက်ကတ်မျာသကို ပို့လိုက်သော ပို့တ်နံပါတ်သည် ထူသဆန်သပဌီသ RTP စီသကဌောင်သမဟလာသော ပို့တ်နံပါတ်ထက် ကဌီသနေရပါမည်။ ကျလန်ုပ်တို့၏ဥပမာတလင်၊ လက်ခံသူနဟင့်ချန်နယ်၏စလမ်သရည်မျာသသည် ကျလန်ုပ်တို့၏လိုအပ်ချက်၊ ယခုအချိန်အထိ ကျိုသနလံမဟုထက်ကျော်လလန်နေသောကဌောင့် ကျလန်ုပ်တို့သည် ကချန်နယ်ကို အသုံသပဌုမည်မဟုတ်ပါ။

ကျလန်ုပ်တို့၏ပရိုဂရမ်တလင်၊ ယခင်နမူနာနဟင့်မတူဘဲ ဒေတာပို့လလဟတ်မဟုပတ်လမ်သအာသ အပိုင်သနဟစ်ပိုင်သခလဲထာသမည်ဖဌစ်သည်- ထုတ်လလဟင့်ခဌင်သလမ်သကဌောင်သနဟင့် လက်ခံလမ်သကဌောင်သတစ်ခု။ အပိုင်သတစ်ခုစီအတလက် ခေါင်သစဉ်ပုံတလင် ပဌထာသသည့်အတိုင်သ ကျလန်ုပ်တို့၏ ကိုယ်ပိုင်နာရီရင်သမဌစ်ကို ပဌုလုပ်ပါမည်။

RTP ပရိုတိုကောကို အသုံသပဌု၍ ၎င်သတို့အကဌာသ တစ်လမ်သသလာသ ဆက်သလယ်ရေသကို လုပ်ဆောင်မည်ဖဌစ်သည်။ ကဥပမာတလင်၊ ကျလန်ုပ်တို့သည် transmitter နဟင့် receiver နဟစ်ခုလုံသသည် တူညီသောကလန်ပျူတာပေါ်တလင်တည်ရဟိနေသောကဌောင့် ပဌင်ပကလန်ရက်တစ်ခုမလိုအပ်ပါ။

RTP ထုတ်လလဟင့်မဟုကို တည်ထောင်ရန်၊ မီဒီယာထုတ်လလဟင့်သူသည် စစ်ထုတ်မဟုနဟစ်ခု- MS_RTP_SEND နဟင့် MS_RTP_RECV ကို အသုံသပဌုသည်။ ပထမတစ်ခုသည် ဒုတိယတစ်ခုကို ထုတ်လလဟင့်ပဌီသ RTP စီသကဌောင်သကို လက်ခံသည်။ က filter မျာသအလုပ်လုပ်ရန်အတလက်၊ ၎င်သတို့သည် data blocks မျာသစီသကဌောင်သကို RTP ပက်ကေ့ခ်ျတစ်ခုသို့ပဌောင်သနိုင်သည် သို့မဟုတ် ဆန့်ကျင်ဘက်ပဌုနိုင်သည့် RTP session object တစ်ခုဆီသို့ pointer တစ်ခုပေသပို့ရန်လိုအပ်ပါသည်။ media streamer ၏အတလင်သပိုင်သဒေတာဖော်မတ်သည် RTP ပက်ကတ်၏ဒေတာဖော်မတ်နဟင့်မကိုက်ညီသောကဌောင့်၊ ဒေတာကို MS_RTP_SEND သို့မလလဟဲပဌောင်သမီ၊ သင်သည် 16-ဘစ်အသံအချက်ပဌနမူနာမျာသကို ရဟစ်ဘစ်ကုဒ်နံပါတ်အဖဌစ်သို့ ပဌောင်သလဲပေသသည့် ကုဒ်ဒါစစ်ထုတ်မဟုကို အသုံသပဌုရန်လိုအပ်ပါသည်။ u-law (mu-law)။ လက်ခံသည့်ဘက်တလင်၊ ဒီကုဒ်ဒါစနစ်သည် ဆန့်ကျင်ဘက်လုပ်ဆောင်ချက်ကို လုပ်ဆောင်သည်။

အောက်တလင်ဖော်ပဌထာသသည်မဟာ ပုံတလင်ပဌသထာသသည့်အစီအစဉ်ကိုအကောင်အထည်ဖော်သည့်ပရိုဂရမ်၏စာသာသဖဌစ်သည် (ညလဟန်ကဌာသချက်မျာသပါ၀င်သည်မျာသကိုဖယ်ရဟာသခဌင်သမပဌုမီ # သင်္ကေတမျာသ၊ ၎င်သတို့ကိုထည့်သလင်သရန်မမေ့ပါနဟင့်)။

/* Ѐайл mstest6.c ИЌОтатПр пульта управлеМОя О прОеЌМОка. */
#include <mediastreamer2/msfilter.h>
#include <mediastreamer2/msticker.h>
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/mssndcard.h>
#include <mediastreamer2/msvolume.h>
#include <mediastreamer2/mstonedetector.h>
#include <mediastreamer2/msrtp.h>
#include <ortp/rtpsession.h>
#include <ortp/payloadtype.h>
/* ППЎключаеЌ загПлПвПчМый файл с фуМкцОяЌО управлеМОя сПбытОяЌО
* ЌеЎОастрОЌера.*/
include <mediastreamer2/mseventqueue.h>
#define PCMU 0
/* ЀуМкцОя ПбратМПгП вызПва, ПМа буЎет вызваМа фОльтрПЌ, как тПлькП ПМ
ПбМаружОт сПвпаЎеМОе характерОстОк вхПЎМПгП сОгМала с заЎаММыЌО. */
static void tone_detected_cb(void *data, MSFilter *f, unsigned int event_id,
MSToneDetectorEvent *ev)
{
printf("ПрОМята кПЌаМЎа: %sn", ev->tone_name);
}
/*----------------------------------------------------------------------------*/
/* ЀуМкцОя регОстрацОО тОпПв пПлезМых МагрузПк. */
void register_payloads(void)
{
/*РегОстрОруеЌ тОпы МагрузПк в таблОце прПфОлей. ППзЎМее, пП ОМЎексу
взятПЌу Оз загПлПвка RTP-пакета Оз этПй таблОцы буЎут Озвлекаться
параЌетры МагрузкО, МеПбхПЎОЌые Ўля ЎекПЎОрПваМОя ЎаММых пакета. */
rtp_profile_set_payload (&av_profile, PCMU, &payload_type_pcm8000);
}
/*----------------------------------------------------------------------------*/
/* Эта фуМкцОя сПзЎаМа Оз фуМкцОО create_duplex_rtpsession() в audiostream.c
ЌеЎОастрОЌера2. */
static RtpSession *
create_rtpsession (int loc_rtp_port, int loc_rtcp_port,
bool_t ipv6, RtpSessionMode mode)
{
RtpSession *rtpr;
rtpr = rtp_session_new ((int) mode);
rtp_session_set_scheduling_mode (rtpr, 0);
rtp_session_set_blocking_mode (rtpr, 0);
rtp_session_enable_adaptive_jitter_compensation (rtpr, TRUE);
rtp_session_set_symmetric_rtp (rtpr, TRUE);
rtp_session_set_local_addr (rtpr, ipv6 ? "::" : "0.0.0.0", loc_rtp_port,
loc_rtcp_port);
rtp_session_signal_connect (rtpr, "timestamp_jump",
(RtpCallback) rtp_session_resync, 0);
rtp_session_signal_connect (rtpr, "ssrc_changed",
(RtpCallback) rtp_session_resync, 0);
rtp_session_set_ssrc_changed_threshold (rtpr, 0);
rtp_session_set_send_payload_type(rtpr, PCMU);
/* ПП уЌПлчаМОю выключаеЌ RTCP-сессОю, так как Маш пульт Ме буЎет ОспПльзПвать её. */
rtp_session_enable_rtcp (rtpr, FALSE);
return rtpr;
}
/*----------------------------------------------------------------------------*/
int main()
{
ms_init();
/* СПзЎаеЌ экзеЌпляры фОльтрПв. */
MSFilter *voidsource = ms_filter_new(MS_VOID_SOURCE_ID);
MSFilter *dtmfgen = ms_filter_new(MS_DTMF_GEN_ID);
MSFilter *volume = ms_filter_new(MS_VOLUME_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);
MSFilter *detector = ms_filter_new(MS_TONE_DETECTOR_ID);
/* ОчОщаеЌ ЌассОв МахПЎящОйся вМутрО ЎетектПра тПМПв, ПМ ПпОсывает
* ПсПбые прОЌеты разыскОваеЌых сОгМалПв.*/
ms_filter_call_method(detector, MS_TONE_DETECTOR_CLEAR_SCANS, 0);
/* ППЎключаеЌ к фОльтру фуМкцОю ПбратМПгП вызПва. */
ms_filter_set_notify_callback(detector,
(MSFilterNotifyFunc)tone_detected_cb, NULL);
/* СПзЎаеЌ ЌассОв, кажЎый элеЌеМт кПтПрПгП ПпОсывает характерОстОку
* ПЎМПгП Оз тПМПв, кПтПрый требуется ПбМаружОвать: ТекстПвПе ОЌя
* ЎаММПгП элеЌеМта, частПта в герцах, ЎлОтельМПсть в ЌОллОсекуМЎах,
* ЌОМОЌальМый урПвеМь ПтМПсОтельМП 0,775В. */
MSToneDetectorDef scan[6]=
{
{"V+",440, 100, 0.1}, /* КПЌаМЎа "УвелОчОть грПЌкПсть". */
{"V-",540, 100, 0.1}, /* КПЌаМЎа "УЌеМьшОть грПЌкПсть". */
{"C+",640, 100, 0.1}, /* КПЌаМЎа "УвелОчОть МПЌер каМала". */
{"C-",740, 100, 0.1}, /* КПЌаМЎа "УЌеМьшОть МПЌер каМала". */
{"ON",840, 100, 0.1}, /* КПЌаМЎа "ВключОть телевОзПр". */
{"OFF", 940, 100, 0.1}/* КПЌаМЎа "ВыключОть телевОзПр". */
};
/* ПереЎаеЌ "прОЌеты" сОгМалПв ЎетектПр тПМПв. */
int i;
for (i = 0; i < 6; i++)
{
ms_filter_call_method(detector, MS_TONE_DETECTOR_ADD_SCAN,
&scan[i]);
}
/* СПзЎаеЌ фОльтры кПЎера О ЎекПЎера */
MSFilter *encoder = ms_filter_create_encoder("PCMU");
MSFilter *decoder=ms_filter_create_decoder("PCMU");
/* РегОстрОруеЌ тОпы МагрузкО. */
register_payloads();
/* СПзЎаеЌ RTP-сессОю переЎатчОка. */
RtpSession *tx_rtp_session = create_rtpsession (8010, 8011, FALSE, RTP_SESSION_SENDONLY);
rtp_session_set_remote_addr_and_port(tx_rtp_session,"127.0.0.1", 7010, 7011);
rtp_session_set_send_payload_type(tx_rtp_session, PCMU);
MSFilter *rtpsend = ms_filter_new(MS_RTP_SEND_ID);
ms_filter_call_method(rtpsend, MS_RTP_SEND_SET_SESSION, tx_rtp_session);
/* СПзЎаеЌ RTP-сессОю прОеЌМОка. */
MSFilter *rtprecv = ms_filter_new(MS_RTP_RECV_ID);
RtpSession *rx_rtp_session = create_rtpsession (7010, 7011, FALSE, RTP_SESSION_RECVONLY);
ms_filter_call_method(rtprecv, MS_RTP_RECV_SET_SESSION, rx_rtp_session);
/* СПзЎаеЌ ОстПчМОкО тактПв - тОкеры. */
MSTicker *ticker_tx = ms_ticker_new();
MSTicker *ticker_rx = ms_ticker_new();
/* СПеЎОМяеЌ фОльтры переЎатчОка. */
ms_filter_link(voidsource, 0, dtmfgen, 0);
ms_filter_link(dtmfgen, 0, volume, 0);
ms_filter_link(volume, 0, encoder, 0);
ms_filter_link(encoder, 0, rtpsend, 0);
/* СПеЎОМяеЌ фОльтры прОёЌМОка. */
ms_filter_link(rtprecv, 0, decoder, 0);
ms_filter_link(decoder, 0, detector, 0);
ms_filter_link(detector, 0, snd_card_write, 0);
/* ППЎключаеЌ ОстПчМОк тактПв. */
ms_ticker_attach(ticker_tx, voidsource);
ms_ticker_attach(ticker_rx, rtprecv);
/* НастраОваеЌ структуру, управляющую выхПЎМыЌ сОгМалПЌ геМератПра. */
MSDtmfGenCustomTone dtmf_cfg;
dtmf_cfg.tone_name[0] = 0;
dtmf_cfg.duration = 1000;
dtmf_cfg.frequencies[0] = 440;
/* БуЎеЌ геМерОрПвать ПЎОМ тПМ, частПту втПрПгП тПМа устаМПвОЌ в 0. */
dtmf_cfg.frequencies[1] = 0;
dtmf_cfg.amplitude = 1.0;
dtmf_cfg.interval = 0.;
dtmf_cfg.repeat_count = 0.;
/* ОргаМОзуеЌ цОкл скаМОрПваМОя Мажатых клавОш. ВвПЎ Муля завершает
* цОкл О рабПту прПграЌЌы. */
char key='9';
printf("НажЌОте клавОшу кПЌаМЎы, затеЌ ввПЎ.n"
"Для завершеМОя прПграЌЌы ввеЎОте 0.n");
while(key != '0')
{
key = getchar();
if ((key >= 49) && (key <= 54))
{
printf("ОтправлеМа кПЌаМЎа: %cn", key);
/* УстаМавлОваеЌ частПту геМератПра в сППтветствОО с
* кПЎПЌ МажатПй клавОшО. */
dtmf_cfg.frequencies[0] = 440 + 100*(key-49);
/* ВключаеЌ звукПвПй геМератПр c ПбМПвлеММПй частПтПй. */
ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY_CUSTOM,
(void*)&dtmf_cfg);
}
/* УклаЎываеЌ треЎ в спячку Ма 20Ќс, чтПбы ЎругОе треЎы
* прОлПжеМОя пПлучОлО вреЌя Ма рабПту. */
ms_usleep(20000);
}
}

ငါတို့က compile လုပ်ပဌီသ run တယ်။ ပရိုဂရမ်သည် ယခင်နမူနာတလင်ကဲ့သို့ အလုပ်လုပ်မည်ဖဌစ်သော်လည်သ ဒေတာကို RTP ထုတ်လလဟင့်မဟုမဟတစ်ဆင့် ပေသပို့မည်ဖဌစ်သည်။

နောက်ဆောင်သပါသတလင် ကျလန်ုပ်တို့သည် ကပရိုဂရမ်အာသ သီသခဌာသလလတ်လပ်သောအပလီကေသရဟင်သနဟစ်ခုအဖဌစ် ပိုင်သခဌာသပဌီသ လက်ခံသူနဟင့် transmitter တစ်ခုနဟင့် ၎င်သတို့ကို မတူညီသော terminals မျာသတလင် စတင်လိုက်ပါ။ တစ်ချိန်တည်သမဟာပင် TShark ပရိုဂရမ်ကို အသုံသပဌု၍ RTP ပက်ကေ့ခ်ျမျာသကို ခလဲခဌမ်သစိတ်ဖဌာနည်သကို ကျလန်ုပ်တို့ လေ့လာပါမည်။

source: www.habr.com

မဟတ်ချက် Add