Ihlola injini ye-Mediastreamer2 VoIP. Ingxenye 6

Indaba ye-athikili ithathwe kweyami ishaneli zen.

Idlulisa isignali yomsindo ngokusakaza kwe-RTP

Ihlola injini ye-Mediastreamer2 VoIP. Ingxenye 6

Ekugcineni isihloko Sihlanganise isekethe yesilawuli kude kusuka kujeneretha yethoni kanye nomtshina wethoni osebenza ngaphakathi kohlelo olufanayo. Kulesi sihloko sizofunda indlela yokusebenzisa i-RTP protocol (RFC 3550 - I-RTP: Iphrothokholi Yezokuthutha Yezicelo Zesikhathi Sangempela) ukuthola/ukudlulisa isignali yomsindo ngenethiwekhi ye-Ethernet.

Iphrothokholi ye-RTP (Iphrothokholi Yesikhathi Sangempela) elihunyushwe lisho iphrothokholi yesikhathi sangempela, isetshenziselwa ukudlulisa umsindo, ividiyo, idatha, yonke into edinga ukudluliselwa ngesikhathi sangempela. Ake sithathe isignali yomsindo njengesibonelo. Ukuvumelana nezimo kwephrothokholi kukuvumela ukuthi udlulise isignali yomsindo ngekhwalithi enqunywe kusengaphambili.

Ukudlulisa kwenziwa kusetshenziswa amaphakethe e-UDP, okusho ukuthi ukulahleka kwephakethe kwamukelekile ngesikhathi sokudlulisela. Iphakethe ngalinye liqukethe unhlokweni okhethekile we-RTP kanye nebhulokhi yedatha yesiginali edlulisiwe. Unhlokweni uqukethe isihlonzi somthombo wesignali esikhethwe ngokungahleliwe, ulwazi olumayelana nohlobo lwesiginali edluliswayo, kanye nenombolo yephakethe ehlukile yokulandelana ukuze amaphakethe ahlelwe ngendlela efanele lapho eqoshwa, kungakhathaliseki ukuthi alethwe kanjani inethiwekhi. Isihloko singaqukatha ulwazi olwengeziwe, okuthiwa isandiso, esivumela unhlokweni ukuba uguqulelwe ukusetshenziswa kumsebenzi othile wohlelo lokusebenza.

Ibhulokhi yedatha iqukethe umthwalo wephakethe. Inhlangano yangaphakathi yokuqukethwe incike ohlotsheni lomthwalo, kungaba amasampula esignali ye-mono, isiginali ye-stereo, umugqa wesithombe sevidiyo, njll.

Uhlobo lomthwalo luboniswa inombolo yamabhithi ayisikhombisa. Isincomo RFC3551 (Iphrofayela ye-RTP Yezinkomfa Zomsindo Nevidiyo Ngokulawula Okuncane) isungula izinhlobo ezimbalwa zomthwalo, ithebula elihambisanayo linikeza incazelo yezinhlobo zomthwalo kanye nencazelo yamakhodi aqokwa ngawo. Amanye amakhodi awaboshelwe ngokuqinile kunoma yiluphi uhlobo lomthwalo; angasetshenziswa ukuchaza umthwalo ongekho emthethweni.

Usayizi webhulokhi yedatha ukhawulelwe ngenhla ngosayizi wephakethe omkhulu ongadluliswa kunethiwekhi enikeziwe ngaphandle kokuhlukaniswa (ipharamitha ye-MTU). Ngokuvamile, lokhu akukho ngaphezu kwamabhayithi angu-1500. Ngakho-ke, ukuze ukwandise inani ledatha edluliswa ngomzuzwana, ungakwazi ukwandisa usayizi wephakethe kuze kufike endaweni ethile, bese uzodinga ukwandisa imvamisa yokuthumela amaphakethe. Ku-media streamer, lesi isilungiselelo esilungisekayo. Ngokuzenzakalelayo ingu-50 Hz, i.e. Amaphakethe angama-50 ngomzuzwana. Sizobiza ukulandelana kwamaphakethe e-RTP ngokusakaza kwe-RTP.

Ukuze uqale ukudlulisa idatha phakathi komthombo nomamukeli, kwanele ukuthi umthumeli azi ikheli le-IP lomamukeli kanye nenombolo yembobo eyisebenzisela ukwamukela. Labo. ngaphandle kwezinqubo zokuqala, umthombo uqala ukudlulisa idatha, futhi umamukeli, naye, ulungele ukuyithola ngokushesha futhi ayicubungule. Ngokwezinga, inombolo yembobo esetshenziselwa ukudlulisa noma ukwamukela ukusakaza kwe-RTP kufanele ilingane.

Ezimweni lapho kungenakwenzeka ukwazi ikheli lomamukeli kusenesikhathi, amaseva asetshenziswa lapho abamukeli beshiya ikheli labo, futhi umthumeli angakucela ngokubhekisela kwelinye igama eliyingqayizivele lomamukeli.

Ezimweni lapho ikhwalithi yesiteshi sokuxhumana noma amakhono omamukeli engaziwa, ishaneli yempendulo ihlelwa lapho umamukeli akwazi khona ukwazisa umthumeli ngamakhono akhe, inani lamaphakethe eliwagejile, njll. Lesi siteshi sisebenzisa iphrothokholi ye-RTCP. Ifomethi yamaphakethe adluliselwe kulesi siteshi ichazwa ku-RFC 3605. Idatha encane ngokuqhathaniswa idluliselwa kulesi siteshi, amabhayithi angu-200..300 ngomzuzwana, ngakho-ke ngokuvamile, ukuba khona kwayo akuwona umthwalo. Inombolo yembobo lapho amaphakethe e-RTCP athunyelwa khona kumelwe ibe yinqaba futhi ibe nkulu kunenombolo yembobo okuphuma kuyo ukusakaza kwe-RTP. Esibonelweni sethu, ngeke sisebenzise lesi siteshi, njengoba amandla omamukeli nesiteshi ngokusobala edlula izidingo zethu, kuze kube manje, anesizotha.

Kuhlelo lwethu, isifunda sokudlulisa idatha, ngokungafani nesibonelo sangaphambilini, sizohlukaniswa sibe izingxenye ezimbili: indlela yokudlulisa kanye nendlela yokwamukela. Engxenyeni ngayinye sizokwenza umthombo wethu wewashi, njengoba kukhonjisiwe esithombeni sesihloko.

Ukuxhumana kwendlela eyodwa phakathi kwabo kuzokwenziwa kusetshenziswa iphrothokholi ye-RTP. Kulesi sibonelo, asidingi inethiwekhi yangaphandle, ngoba kokubili umthumeli kanye nomamukeli bazotholakala kukhompuyutha efanayo - amaphakethe azohamba ngaphakathi kwayo.

Ukuze kusungulwe ukusakaza kwe-RTP, isisakazi semidiya sisebenzisa izihlungi ezimbili: MS_RTP_SEND kanye ne-MS_RTP_RECV. Eyokuqala idlulisela eyesibili bese ithola ukusakaza kwe-RTP. Ukuze lezi zihlungi zisebenze, zidinga ukudlulisa isikhombi entweni yeseshini ye-RTP, engaguqula ukusakazwa kwamabhulokhi edatha ibe ukusakaza kwamaphakethe e-RTP noma yenze okuphambene. Njengoba ifomethi yedatha yangaphakathi ye-media streamer ingafani nefomethi yedatha yephakethe le-RTP, ngaphambi kokudlulisela idatha ku-MS_RTP_SEND, udinga ukusebenzisa isihlungi se-encoder esiguqula amasampula esignali yomsindo engu-16-bit abe amabhithi ayisishiyagalombili abhalwe ngekhodi ngokuya u-u-law (mu-law). Ohlangothini lokwamukela, isihlungi sedekhoda senza umsebenzi ophambene.

Ngezansi umbhalo wohlelo olusebenzisa uhlelo olukhonjiswe emfanekisweni (izimpawu ezingu-# ngaphambi kokuthi kukhishwe iziqondiso, ungakhohlwa ukuzifaka):

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

Siyahlanganisa bese siyagijima. Uhlelo luzosebenza njengesibonelo sangaphambilini, kodwa idatha izodluliswa ngokusakaza kwe-RTP.

Esihlokweni esilandelayo sizohlukanisa lolu hlelo zibe izinhlelo zokusebenza ezimbili ezizimele - umamukeli kanye nesidlulisi futhi sikwethule kumatheminali ahlukene. Ngesikhathi esifanayo, sizofunda ukuhlaziya amaphakethe e-RTP sisebenzisa uhlelo lwe-TShark.

Source: www.habr.com

Engeza amazwana