Ukuphonononga injini yeMediastreamer2 VoIP. Icandelo 6

Izinto zenqaku zithathwe kum zen channel.

Ukusasaza isiginali yesandi ngeRTP umjelo

Ukuphonononga injini yeMediastreamer2 VoIP. Icandelo 6

Ekugqibeleni nqaku Siqokelele isiphaluka solawulo olude ukusuka kwijenereyitha yethoni kunye nethoni yethoni esebenza ngaphakathi kweprogram efanayo. Kweli nqaku siza kufunda indlela yokusebenzisa i-RTP protocol (RFC 3550 - I-RTP: IProtokholi yezoThutho yezicelo zeXesha langempela) ukufumana/ukuhambisa umqondiso wesandi kwinethiwekhi ye-Ethernet.

Iprothokholi ye-RTP (Ixesha lokwenyani Protocol) ukuguqulelwa kuthetha iprotocol yexesha langempela, isetyenziselwa ukuhambisa i-audio, ividiyo, idatha, yonke into efuna ukuhanjiswa ngexesha langempela. Makhe sithathe umqondiso wesandi njengomzekelo. Ukuguquguquka kweprotocol kukuvumela ukuba udlulise isignali yomsindo kunye nomgangatho omiselweyo.

Ukuhanjiswa kuqhutywa kusetyenziswa iipakethi ze-UDP, oku kuthetha ukuba ukulahleka kwepakethi kwamkelekile ngexesha lokuhanjiswa. Ipakethi nganye iqulethe i-header ye-RTP ekhethekileyo kunye nebhloko yedatha yesignali edlulisiweyo. Iheda iqulethe isichongi somthombo womqondiso okhethwe ngokungenamkhethe, ulwazi malunga nohlobo lomqondiso ogqithiselwayo, kunye nenombolo yolandelelwano lwepakethe eyodwa ukwenzela ukuba iipakethi zilungelelaniswe ngolandelelwano oluchanekileyo xa kufakwa ikhowudi, kungakhathaliseki indlela ezihanjiswe ngayo. inethiwekhi. I-header inokuphinda iqulethe ulwazi olongezelelweyo, okubizwa ngokuba yisandiso, esivumela ukuba intloko ilungele ukusetyenziswa kumsebenzi othile wesicelo.

Ibhloko yedatha iqulethe umthwalo wepakethi. Umbutho wangaphakathi womxholo uxhomekeke kuhlobo lomthwalo, ingaba iisampulu zesignali ye-mono, isignali ye-stereo, umgca wevidiyo wevidiyo, njl.

Uhlobo lomthwalo luboniswa ngamanani asixhenxe. Ingcebiso RFC3551 (Iprofayile ye-RTP yeeNkomfa zeAudio kunye neVidiyo enoLawulo oluncinciiseka iintlobo ezininzi zomthwalo, itheyibhile ehambelanayo ibonelela ngenkcazo yeentlobo zomthwalo kunye nentsingiselo yeekhowudi ezichongwe ngazo. Ezinye iikhowudi azibotshelelwanga ngokungqongqo kulo naluphi na uhlobo lomthwalo; zingasetyenziselwa ukumisela umthwalo ongekho mthethweni.

Ubungakanani bebhloko yedatha bukhawulelwe ngasentla ngobungakanani bepakethe enkulu enokuthi idluliselwe kumnatha onikiweyo ngaphandle kokwahlula (MTU parameter). Ngokubanzi, oku akukho ngaphezu kwe-1500 bytes. Ngaloo ndlela, ukwenzela ukwandisa inani leedatha ezithunyelwa ngesekhondi, unokwandisa ubungakanani bepakethi ukuya kwindawo ethile, kwaye emva koko kuya kufuneka ukwandise ukuphindaphinda kokuthumela iipakethi. Kusasazo lwemidiya, olu lulungiselelo oluqwalaselweyo. Ngokungagqibekanga yi-50 Hz, okt. Iipakethi ezingama-50 ngesekhondi. Siza kubiza ukulandelelana kweepakethi ze-RTP ezigqithisiweyo ngumjelo we-RTP.

Ukuqala ukudlulisa idatha phakathi komthombo kunye nommkeli, kwanele ukuba umthumeli uyazi idilesi ye-IP yomamkeli kunye nenombolo ye-port esetyenziselwa ukufumana. Ezo. ngaphandle kweenkqubo zokuqala, umthombo uqala ukuhambisa idatha, kwaye umamkeli, naye, ulungele ukuyifumana ngokukhawuleza kwaye ayiqhube. Ngokomgangatho, inombolo yezibuko esetyenziselwa ukuhambisa okanye ukufumana umjelo we-RTP kufuneka ilingane.

Kwiimeko apho kungenakwenzeka ukwazi idilesi yomamkeli kwangaphambili, iiseva zisetyenziswa apho abamkeli beshiya idilesi yabo, kwaye umthumeli unokucela ngokubhekisa kwelinye igama elikhethekileyo lomamkeli.

Kwiimeko apho umgangatho wejelo lonxibelelwano okanye amandla omntu owamkelayo angaziwa, ishaneli yempendulo ihlelwe apho ummkeli anokwazisa umthumeli malunga nobuchule bakhe, inani leepakethi eziphosiweyo, njl. Eli jelo lisebenzisa iprotocol ye-RTCP. Ifomathi yeepakethi ezihanjiswe kule tshaneli ichazwe kwi-RFC 3605. Idatha encinci ihanjiswa phezu kwesi siteshi, i-200.. Inombolo yezibuko apho iipakethi ze-RTCP zithunyelwa khona kufuneka ibe ngumnqakathi kwaye enye inkulu kunenombolo yezibuko apho umsinga we-RTP uvela khona. Kumzekelo wethu, asiyi kusebenzisa eli jelo, kuba amandla omamkeli kunye nejelo ngokucacileyo adlula iimfuno zethu, ukuza kuthi ga ngoku.

Kwiprogram yethu, isekethe yokuhanjiswa kwedatha, ngokungafaniyo nomzekelo wangaphambili, iya kwahlulwa ibe ngamacandelo amabini: indlela yokudlulisa kunye nendlela yokufumana. Kwinxalenye nganye siya kwenza umthombo wethu wewotshi, njengoko kubonisiwe kumfanekiso wesihloko.

Unxibelelwano lwendlela enye phakathi kwabo luya kwenziwa kusetyenziswa iprotocol ye-RTP. Kulo mzekelo, asiyidingi inethiwekhi yangaphandle, kuba zombini i-transmitter kunye ne-receiver iya kufumaneka kwikhompyuter enye - iipakethi ziya kuhamba ngaphakathi kwayo.

Ukuseka umjelo we-RTP, i-media streamer isebenzisa izihluzo ezimbini: MS_RTP_SEND kunye ne-MS_RTP_RECV. Eyokuqala idlulisela eyesibini kwaye ifumana umsinga we-RTP. Ukuze ezi zihluzo zisebenze, kufuneka zigqithise isalathisi kwinto yeseshoni ye-RTP, enokuthi iguqule umlambo weebhloko zedatha kwi-packet ye-RTP okanye yenza okuchaseneyo. Kuba ifomathi yedatha yangaphakathi ye-media streamer ayihambelani nefomathi yedatha yepakethe ye-RTP, ngaphambi kokudlulisela idatha kwi-MS_RTP_SEND, kufuneka usebenzise isihluzo se-encoder esiguqula iisampulu ze-16-bit zesandi kwi-bit-bit encoded ngokwe- u-law (mu-law). Kwicala lokufumana, isihluzo sedekhowuda senza umsebenzi ochaseneyo.

Apha ngezantsi kumbhalo wenkqubo ophumeza iskimu esiboniswe kumzobo (iisimboli # phambi kokuba izikhokelo zisuswe, ungalibali ukuzibandakanya):

/* Π€Π°ΠΉΠ» 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);
}
}

Siyaqokelela kwaye siqhube. Inkqubo iya kusebenza njengakumzekelo wangaphambili, kodwa idatha iya kuhanjiswa nge-RTP stream.

Kwinqaku elilandelayo siya kwahlula le nkqubo ibe zizicelo ezimbini ezizimeleyo - umamkeli kunye nomthumeli kwaye uziqalise kwii-terminals ezahlukeneyo. Ngelo xesha, siya kufunda indlela yokuhlalutya iipakethi ze-RTP usebenzisa inkqubo ye-TShark.

umthombo: www.habr.com

Yongeza izimvo