áá±á¬ááºážáá«ážá á¡ááŒá±á¬ááºážá¡áá¬ááᯠáá»áœááºá¯ááºáá¶á០áá°áá«áááºá
RTP á á®ážááŒá±á¬ááºážááŸáááá·áº á¡áá¶á¡áá»ááºááŒááŸá¯áá áºáᯠáá¯ááºááœáŸáá·áºááŒááºážá
áá±á¬ááºáá¯á¶ážá
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