×עך ××Ö·×עך××Ö·× ×€×× ××¢× ×ַך×××§× ××× ××¢× ×××¢× ×€×× ××××
×ך×Ö·× ×¡××××× × ×Ö· ×Ö·××××Öž ס××× ×Ö·× ×××š× RTP ×××Ö·×
××× ×עך ×€×ַך××Ö·× ××¢× ××××
RTP ׀֌ך×Öž××֞ק×Öž× (×€×ַק××ש ׊××× ×€ÖŒ×š×Öž××֞ק×Öž×) ×××עך××¢××¢×Š× ×××× ×€×ַק××ש-׊××× ×€ÖŒ×š×Öž××֞ק×Öž×, עס ××× ××¢× ××Š× ×Š× ×ַך××עך׀××š× ×Ö·××××Öž, ×××××¢×, ××Ö·××, ×Ö·××¥ ×××֞ס ך×ק×××××¢×š× ×ך×Ö·× ×¡××ס××¢ ××× ×€×ַק××ש ׊×××. ××× ×¡ × ×¢××¢× ×Ö·× ×Ö·××××Öž ס××× ×Ö·× ××× ×Ö· ×××ַש׀֌××. ×× ×××××ק××× ×€×× ××¢× ×€ÖŒ×š×Öž××֞ק×Öž× ××× ×Ö·××× ×Ö·× ×¢×¡ ×Ö·××Ö·×× ××ך ×Š× ×ַך××עך׀××š× ×Ö· ×Ö·××××Öž ס××× ×Ö·× ××× ×Ö· ׀֌ך××××עך××× × ×§×××Ö·××××¢×.
×× ×ך×Ö·× ×¡××ס××¢ ××× ××ך××עק×Öž×× ××× UDP ×€ÖŒ×ַק××¥, ×××֞ס ×××× ×Ö·× ×€ÖŒ×ַק×Ö·× ×Öž× ××עך ××× ××Ö·× ×¥ ×€ÖŒ×ַס×ק ×עש×ַס ×ך×Ö·× ×¡××ס××¢. ××¢×עך ×€ÖŒ×ַק×Ö·× ×ÖŒ××× ×Ö· ס׀֌ע׊××¢× RTP ××¢×עך ××× ×Ö· ××Ö·×× ×××֞ק ×€×× ×× ×ך×Ö·× ×¡×××××¢× ×¡××× ×Ö·×. ×עך ××¢×עך ×ÖŒ××× ×Ö· ך×Ö·× ××Ö·××× ×××ס×עק×××× ×¡××× ×Ö·× ×ק×ך ××××¢× ×××€×׊×ך×, ××× ×€Ö¿×֞ך××ַ׊××¢ ×××¢×× ××¢× ×××€ÖŒ ×€×× ×¡××× ×Ö·× ×ך×Ö·× ×¡×××××¢×, ××× ×Ö· ××× ×Š×ק ×€ÖŒ×ַק×Ö·× ×¡×ק×××Ö·× ×¡ × ××עך ×Ö·××× ×Ö·× ×× ×€ÖŒ×ַק××¥ ×§×¢× ×¢× ×××× ×¢×š××× ×××©× ××× ×× ×š××××ק ס×ך ×××¢× ××ק×Öž×××× ×, ך×Ö·××ַך×××ַס ×€×× ×× ×¡×ך ××× ×××֞ס ××× ××¢× ×¢× ×××עך××¢××¢×× ×××š× ×× ××¢×עך. × ×¢×¥. ×עך ××¢×עך ×§×¢× ×××× ×Ö·× ×××Ö·××× × ×Öž× ××× ×€Ö¿×֞ך××ַ׊××¢, ×× ×Ö·××× ×עך××€×¢× ×¢ ×€×ַך××¢× ×עך×× ×, ×××֞ס ×Ö·××Ö·×× ×× ××¢×עך ×Š× ×××× ×Š×××¢×€××¡× ×Š× × ××Š× ××× ×Ö· ס׀֌ע׊××€×ש ×Ö·×€ÖŒ××ַק××ש×Ö·× ×ַך××¢×.
×× ××Ö·×× ×××֞ק ×ÖŒ××× ×× ×€ÖŒ××××Öž×× ×€×× ×× ×€ÖŒ×ַק×Ö·×. ×× ×× ×¢×š××¢× ×֞ך××Ö·× ×××ַ׊××¢ ×€×× ââ××× ××Ö·×× ××¢×€ÖŒ×¢× ×ס ××××£ ××¢× ×××€ÖŒ ×€×× ××ַסע, עס ×§×¢× ×¢× ×××× ×¡×Ö·××€ÖŒ×Ö·×× ×€×× ×Ö· ××Öž× ×Öž ס××× ×Ö·×, ×Ö· ס×עך××Öž× ×¡××× ×Ö·×, ×Ö· ×××××¢× ×××× ×©×ך×, ×¢×ק.
×× ××ַסע ×××€ÖŒ ××× ×× ××ַק××××× ×××š× ×Ö· ××××-×××¡× × ××עך. ךעק×Öž××¢× ××ַ׊××¢ RFC3551 (RTP ׀֌ך×Öž×€×× ×€Ö¿×ַך ×Ö·××××Öž ××× ×××××¢× ×§×Ö·× ×€×š×Ö·× ×¡×Ö·× ××× ××× ×××Ö·× ×§×Öž× ×ך×Öž×) ×ס××Ö·×××ש×× ×¢×××¢××¢ ×××׀֌ס ×€×× ××ַסע; ×× ×§×֞ך×ַס׀֌×Ö·× ××× × ××ש ××× ×Ö· ××ַשך××Ö·××× × ×€×× ×× ×××׀֌ס ×€×× ××ַסע ××× ×× ×××Ö·×ש ×€×× ×× ×§×Öž××× ×××š× ×××֞ס ××× ××¢× ×¢× ××¢×××× ×××××. ×¢×××¢××¢ ק×Öž××× ××¢× ×¢× × ××©× ×©××š×¢× × ×××× ×Š× ×§××× ×××€ÖŒ ×€×× ××ַסע; ××× ×§×¢× ×¢× ×××× ××¢× ××Š× ×Š× ××¢×××× ××× ×Ö· ×ַך×××ך×ַך×ש ××ַסע.
×× ×ך××ס ×€×× ×Ö· ××Ö·×× ×××֞ק ××× ××××××¢× ××××× ×××š× ×× ××ַקס×××× ×€ÖŒ×ַק×Ö·× ×ך××ס ×××֞ס ×§×¢× ×¢× ×××× ×ך×Ö·× ×¡×××××¢× ××××£ ×Ö· ××¢××¢×× × ×¢×¥ ×Öž× ×¡×¢×××Ö·× ×××ש×Ö·× (MTU ×€ÖŒ×ַך×Ö·××¢×עך). ××× ×Ö·×××¢××××, ××֞ס ××× × ×× ×עך ××× 1500 ×××עס. ××××, ××× ×¡×ך ×Š× ×€×ַך××š×¢×¡×¢×š× ×× ×¡×××¢ ×€×× ââ××Ö·×× ×ך×Ö·× ×¡×××××¢× ×€ÖŒ×¢×š סעק×× ××¢, ××ך ×§×¢× ×¢× ×€×ַך××š×¢×¡×¢×š× ×× ×€ÖŒ×ַק×Ö·× ×ך××ס ×ַך×××£ ×Š× ×Ö· ×××עך ×€×× ×, ××× ××¢××Öž×× ××ך ××Ö·×š×€Ö¿× ×Š× ×€×ַך××š×¢×¡×¢×š× ×× ×Öž×€×ק××Ö·× ×€×× ×©××§× ×€ÖŒ×ַק××¥. ××× ×Ö· ×××××Ö· ס×ך××עך, ××֞ס ××× ×Ö· ק×Ö·× ×€×××עך×Ö·××Ö·× ××ַש××¢××ק×. ×××š× ×€×¢××ק××Ö·× ×¢×¡ ××× 50 ××, ×"×. 50 ×€ÖŒ×ַק××¥ ׀֌עך סעק×× ××¢. ××ך ×××¢×× ×š××€× ×× ×¡×ק×××Ö·× ×¡ ×€×× ×ך×Ö·× ×¡×××××¢× ×š××€ÖŒ ×€ÖŒ×ַק××¥ ×Ö· ך××€ÖŒ ×××Ö·×.
×Š× ×Öž× ××××× ×ך×Ö·× ×¡××××× × ××Ö·×× ×Š××××©× ×× ×ק×ך ××× ×× ××€× ×¢×עך, עס ××× ××¢× ×× ×Ö·× ×× ×ך×Ö·× ×¡×××עך ×××××¡× ×× IP ×Ö·×ךעס ×€×× ×× ××€× ×¢×עך ××× ×× ×€ÖŒ×Öž×š× × ××עך ×××֞ס עך × ××Š× ×€Ö¿×ַך ך×ס××××× ×. ××¢× ×¢. ×Öž× ×§××× ×€ÖŒ×š×××××Ö·× ×¢×š× ×€ÖŒ×š×Öž×ס×××שעך×, ×עך ×ק×ך ××××× ×Š× ××עךש××§× ××Ö·××, ××× ×עך ××€× ×¢×עך, ××× ×§×¢×š, ××× ×ך××× ×Š× ××× ××ַק×××¢× ××× ×€ÖŒ×š×֞׊עס עס. ×××× ×עך × ×֞ך××Ö·×, ×× ×€ÖŒ×Öž×š× × ××עך ××¢× ××Š× ×Š× ×ַך××עך׀××š× ×Öž×עך ××ַק×××¢× ×Ö· RTP ×××Ö·× ×××× ×××× ××××Ö·×.
××× ×¡××××Ö·×××Öž× ×¡ ××× ×¢×¡ ××× ×××××¢×××¢× ×Š× ××××¡× ×× ××€× ×¢×עך ס ×Ö·×ךעס ××× ×©×××Ö·××, סעך××עךס ××¢× ×¢× ××¢× ××Š× ××× ×š×ס××××¢×š× ××Öž×× ×××עך ×Ö·×ךעס, ××× ×× ×ך×Ö·× ×¡×××עך ×§×¢× ×¢× ××¢×× ×¢×¡ ×××š× ×š×׀עך×× × ×Š× ×¢×××¢××¢ ××× ×Š×ק × ×Öž××¢× ×€×× ×× ××€× ×¢×עך.
××× ×§×ַסעס ××× ×× ×§×××Ö·××××¢× ×€×× ×× ×§×Öž××× ×ק×ַ׊××¢ ק×Ö·× ×Ö·× ×Öž×עך ×× ×§×××€ÖŒ×Ö·××××Ö·××× ×€×× ×× ××€× ×¢×עך ××¢× ×¢× ×××××ַק×Ö·× ×, ×Ö· ××Ö·×עךק×× ××¢× ×§×Ö·× ×Ö·× ××× ×֞ך××Ö·× ××××š× ×××š× ×××֞ס ×× ××€× ×¢×עך ×§×¢× ×¢× ×××××××× ×× ×ך×Ö·× ×¡×××עך ×××¢×× ×××Ö·× ×§×××€ÖŒ×Ö·××××Ö·×××, ×× × ××עך ×€×× ×€ÖŒ×ַק××¥ עס ××ס×, ×××"× ×. ×עך ק×Ö·× ×Ö·× × ××Š× ×× RTCP ׀֌ך×Öž××֞ק×Öž×. ×עך ×€Ö¿×֞ך××Ö·× ×€×× ×€ÖŒ×ַק××¥ ×ך×Ö·× ×¡×××××¢× ××× ××¢× ×§×Ö·× ×Ö·× ××× ×××€××× × ××× RFC 3605. ××¢×€××¢×š×¢× ×§×××× ××Ö·×× ××¢× ×¢× ×ך×Ö·× ×¡×××××¢× ×××עך ××¢× ×§×Ö·× ×Ö·×, 200..300 ×××עס ׀֌עך סעק×× ××¢, ×Ö·××× ××× ×Ö·×××¢××××, ×××Ö·× ×××Ö·×××Ö·× ××× × ××©× ×עך××Ö·× ×¡×Ö·×. ×× ×€ÖŒ×Öž×š× × ××עך ×Š× ×××֞ס RTCP ×€ÖŒ×ַק××¥ ××¢× ×¢× ×עש××§× ×××× ×××× ××Öž×× ×¢ ××× ×××× ×¢×š ×ךעסעך ××× ×× ×€ÖŒ×Öž×š× × ××עך ×€×× ×××֞ס ×× RTP ×××Ö·× ×§×××. ××× ××× ××עך ×××ַש׀֌××, ××ך ×××¢×× × ××©× × ××Š× ××¢× ×§×Ö·× ×Ö·×, ××××Ö·× ×× ×§×××€ÖŒ×Ö·××××Ö·××× ×€×× ×× ××€× ×¢×עך ××× ×§×Ö·× ×Ö·× ××Öž× ×קס×× ××× ××עך, ×Ö·××× ××××Ö·× ××ַש××××, ××ַךף.
××× ××× ××עך ׀֌ך×Öž×ך×Ö·×, ×× ××Ö·×× ×ך×Ö·× ×¡××ס××¢ קך××Ö·×, × ×× ×¢× ××¢× ××¢× ×€×š×עך×××§× ×××ַש׀֌××, ×××¢× ×××× ×Š×¢××××× ××× ×Š×××× ×××××: ×Ö· ×ך×Ö·× ×¡××××× × ×××¢× ××× ×Ö· ך×ס××××× × ×××¢×. ×€Ö¿×ַך ××¢×עך ×××× ××ך ×××¢×× ××Ö·×× ××× ××עך ×××××¢× ×¢ ××××עך ×ק×ך, ××× ××¢××××× ××× ×× ×××× ××××.
××××-×××¢× ×§×Öž××× ×ק×ַ׊××¢ ׊××××©× ××× ×××¢× ×××× ××ך××עק×Öž×× ××× ×× RTP ׀֌ך×Öž××֞ק×Öž×. ××× ××¢× ×××ַש׀֌××, ××ך ××Öž× × ×× ××Ö·×š×€Ö¿× ×Ö· ×€×× ×ך×××¡× ××ק × ×¢×¥, ××××Ö·× ×××××¢ ×× ×ך×Ö·× ×¡×××עך ××× ×× ××€× ×¢×עך ×××¢× ×××× ×××× ××××£ ×עך ××¢×××קעך ק×Öž××€ÖŒ×××עך - ×× ×€ÖŒ×ַק××¥ ×××¢× ×ַך×××€×Öž×š× ×× ×¢×¡.
×Š× ×€×ַך××××× ×Ö· RTP ×××Ö·×, ×× ×××××Ö· ס×ך××עך × ××Š× ×Š×××× ×€×××עךס: MS_RTP_SEND ××× MS_RTP_RECV. ×עך עךש×עך ×ך×Ö·× ×¡×××× ×× ×š××¢ ××× × ×¢×× ×× RTP ×××Ö·×. ×ÖŒ×× ×× ×€×××עךס ××Öž× ×ַך××¢××, ××× ××Ö·×š×€Ö¿× ×Š× ×€×Öž×š× ×Ö· ×××Ö·×× ×Š× ×Ö· RTP סעס××¢ ××××€×¢×¥, ×××֞ס ×§×¢× ×¢× ×Öž×עך ×עך ×Ö· ×××Ö·× ×€×× ××Ö·×× ×××ַקס ××× ×Ö· ×××Ö·× ×€×× RTP ×€ÖŒ×ַק××¥ ×Öž×עך ××Öž× ×× ×€×ַךקעך×. ××× × ×× ×× ×¢×š××¢× ××Ö·×× ×€Ö¿×֞ך××Ö·× ×€×× ×× ××¢×××¢ ס×ך××עך ש××××¢× × ××©× ××× ×× ××Ö·×× ×€Ö¿×֞ך××Ö·× ×€×× ×× RTP ×€ÖŒ×ַק×Ö·×, ××××עך ×ך×Ö·× ×¡×€×¢×š×× × ×× ××Ö·×× ×Š× MS_RTP_SEND, ××ך ××Ö·×š×€Ö¿× ×Š× × ××Š× ×Ö· ×¢× ×§×Öž×עך ×€×××עך ×××֞ס ק×Ö·× ××עךץ 16-×××¡× ×Ö·××××Öž ס××× ×Ö·× ×¡×Ö·××€ÖŒ×Ö·×× ××× ×Ö·××-×××¡× ×¢× ×§×Öž×××× ×××× ×-××¢××¢×¥ (××-××¢××¢×¥). ××××£ ×× ×š×ס××××× × ×××Ö·×, ×× ××ק×Öž××עך ×€×××עך ׀֌עך׀×֞ך×× ×× ×€×Ö·×š×§×¢×š× ×€×× ×§×Š××¢.
×× ×עך ××× ×עך ××¢×§×¡× ×€×× ×× ×€ÖŒ×š×Öž×ך×Ö·× ×××֞ס ×××€ÖŒ××Ö·××Ö·× ×¥ ×× ×¡××¢××¢ ××¢××××× ××× ×× ×€×××ך (×× # ס××××Öž×ס ××××עך ×× ×× ×§×××× ×××ךעק××××× ××¢× ×¢× ×Ö·××עק××¢× ×××¢×, ××Öž× × ×× ×€×ַך××¢×¡× ×Š× ×ַך××Ö·× × ×¢××¢× ×××):
/* Ѐайл 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);
}
}
××ך ׊×× ×××€× ×¢××¢× ××× ××××€×. ×עך ׀֌ך×Öž×ך×Ö·× ×××¢× ×ַך××¢×× ××× ××× ×× ×€×š×עך××קע ×××ַש׀֌××, ×Öž×עך ×× ××Ö·×× ×××¢× ×××× ×ך×Ö·× ×¡×××××¢× ×××š× ×Ö· RTP ×××Ö·×.
××× ×עך ××××Ö·×עך ×ַך×××§× ××ך ×××¢×× ××××× ××¢× ×€ÖŒ×š×Öž×ך×Ö·× ××× ×Š×××× ×€×š××Ö· ×Ö·×€ÖŒ××ַק××ש×Ö·× × - ×Ö· ××€× ×¢×עך ××× ×Ö· ×ך×Ö·× ×¡×××עך ××× ×§×Ö·×עך ××× ××× ×€×ַךש×××¢× ×¢ ×עך××× ×Ö·×ס. ××× ×עך ××¢×××קעך ׊×××, ××ך ×××¢×× ××¢×š× ×¢× ××× ×Š× ×Ö·× ×Ö·×××× RTP ×€ÖŒ×ַק××¥ × ××Š× ×× TShark ׀֌ך×Öž×ך×Ö·×.
×ק×ך: www.habr.com