Mikaroka ny motera Mediastreamer2 VoIP. Fizarana 6

Ny fitaovan'ny lahatsoratra dia nalaina avy amin'ny ahy fantsona zen.

Mampita famantarana feo amin'ny alΓ lan'ny RTP stream

Mikaroka ny motera Mediastreamer2 VoIP. Fizarana 6

Amin'ny farany lahatsoratra Nanangona faritra fanaraha-maso lavitra avy amin'ny mpamokatra tone sy mpitsikilo feo izay miasa ao anatin'ny programa iray ihany izahay. Amin'ity lahatsoratra ity dia hianatra ny fomba fampiasana ny protocol RTP (RFC 3550 - RTP: Fifanarahana fitaterana ho an'ny fampiharana amin'ny fotoana tena izy) amin'ny fandraisana/fampitana famantarana feo amin'ny tambajotra Ethernet.

RTP protocole (Protocol Real Time) nadika dia midika hoe protocol amin'ny fotoana tena izy, ampiasaina handefasana feo, horonan-tsary, angona, izay rehetra mitaky fandefasana amin'ny fotoana tena izy. Andeha horaisintsika ho ohatra ny signal audio. Ny fahafahan'ny protocole dia mamela anao handefa mari-peo miaraka amin'ny kalitao efa voafaritra mialoha.

Ny fandefasana dia atao amin'ny alΓ lan'ny fonosana UDP, izay midika fa ny fahaverezan'ny fonosana dia azo ekena mandritra ny fandefasana. Ny fonosana tsirairay dia misy lohapejy RTP manokana sy sakana angon-drakitra amin'ny famantarana alefa. Ny lohapejy dia misy mpamaritra loharanom-pamantarana nofantenana kisendrasendra, fampahalalana momba ny karazana famantarana ampitaina, ary laharan'ny filaharan'ny fonosana tokana mba hahafahan'ireo fonosana azo alamina amin'ny filaharana marina rehefa decoding, na inona na inona filaharan'ny nandefasana azy ireo. tambajotra. Ny lohapejy dia mety ahitana fampahalalana fanampiny, ilay antsoina hoe fanitarana, izay ahafahan'ny lohapejy azo ampifanarahana amin'ny fampiasana amin'ny asa fampiharana manokana.

Ny bloc data dia ahitana ny enta-mavesatry ny fonosana. Ny fandaminana anatiny ny votoaty dia miankina amin'ny karazana enta-mavesatra, mety ho santionan'ny famantarana mono, famantarana stereo, tsipika sary video, sns.

Ny karazana entana dia aseho amin'ny isa fito bit. Resadresaka RFC3551 (Profile RTP ho an'ny fihaonambe audio sy video miaraka amin'ny fifehezana kely indrindra) dia mametraka karazana enta-mavesatra maromaro; ny latabatra mifanitsy amin'izany dia manome famaritana ny karazana entana sy ny dikan'ny fehezan-dalΓ na nanondroana azy ireo. Ny kaody sasany dia tsy mifamatotra tanteraka amin'ny karazana enta-mavesatra rehetra; azo ampiasaina hanondroana entana tsy misy dikany.

Ny haben'ny sakana data dia voafetra etsy ambony amin'ny haben'ny fonosana ambony indrindra azo ampitaina amin'ny tambajotra iray tsy misy fizarana (parameter MTU). Amin'ny ankapobeny dia tsy mihoatra ny 1500 bytes izany. Noho izany, mba hampitomboana ny angon-drakitra alefa isan-tsegondra, azonao atao ny mampitombo ny haben'ny fonosana ho amin'ny teboka iray, ary avy eo dia mila mampitombo ny fatran'ny fandefasana entana ianao. Ao amin'ny streamer haino aman-jery, ity dia toe-javatra azo amboarina. Amin'ny alΓ lan'ny default dia 50 Hz, i.e. 50 fonosana isan-tsegondra. Hantsoinay hoe stream RTP ny filaharan'ny fonosana RTP nampitaina.

Mba hanombohana ny fampitana angon-drakitra eo amin'ny loharano sy ny mpandray, dia ampy ny mahafantatra ny adiresy IP an'ny mpandray sy ny laharan'ny seranan-tsambo izay ampiasainy amin'ny fandraisana. Ireo. raha tsy misy fomba fiasa mialoha, dia manomboka mampita angon-drakitra ny loharano, ary ny mpandray indray dia vonona handray sy hikarakara azy avy hatrany. Araka ny fenitra, ny laharana seranan-tsambo ampiasaina handefasana na handraisana stream RTP dia tsy maintsy mitovy.

Amin'ny toe-javatra izay tsy azo fantarina mialoha ny adiresin'ny mpandray, dia ampiasaina ny mpizara izay mamela ny adiresiny, ary ny mpandefa dia afaka mangataka izany amin'ny alΓ lan'ny fanondroana anarana manokana an'ny mpandray.

Raha toa ka tsy fantatra ny kalitaon'ny fantsom-pifandraisana na ny fahaizan'ny mpandray, dia misy fantsona fanehoan-kevitra iray izay ahafahan'ny mpandray mampahafantatra ny fahaizany, ny isan'ny fonosana tsy hitany, sns. Ity fantsona ity dia mampiasa ny protocol RTCP. Ny endrik'ireo fonosana ampitaina amin'ity fantsona ity dia voafaritra ao amin'ny RFC 3605. Somary kely ny data alefa amin'ity fantsona ity, 200..300 bytes isan-tsegondra, ka amin'ny ankapobeny dia tsy mavesatra ny fisiany. Ny laharan'ny seranan-tsambo handefasana fonosana RTCP dia tsy maintsy hafahafa ary iray lehibe kokoa noho ny laharan'ny seranan-tsambo izay niavian'ny RTP stream. Amin'ny ohatra ataontsika dia tsy hampiasa an'io fantsona io isika, satria ny fahaizan'ny mpandray sy ny fantsona dia mazava ho azy fa mihoatra ny filantsika, hatramin'izao.

Ao amin'ny programantsika, ny fizaran-tany fampitana angon-drakitra, tsy mitovy amin'ny ohatra teo aloha, dia hozaraina ho fizarana roa: lalana fampitana sy lalana fandraisana. Ho an'ny ampahany tsirairay dia hanao loharanon'ny famantaranandro manokana isika, araka ny aseho amin'ny sary.

Ny fifandraisana tokana eo amin'izy ireo dia hatao amin'ny alΓ lan'ny protocol RTP. Amin'ity ohatra ity dia tsy mila tambajotra ivelany isika, satria na ny mpandefa sy ny mpandray dia ho hita ao amin'ny solosaina iray ihany - ny fonosana dia handeha ao anatiny.

Mba hananganana stream RTP dia mampiasa sivana roa ny streamer media: MS_RTP_SEND sy MS_RTP_RECV. Ny voalohany dia mampita ny faharoa ary mandray ny RTP stream. Mba hahafahan'ireo sivana ireo miasa, dia mila mandefa tondro mankany amin'ny zavatra RTP session izy ireo, izay afaka mamadika ny bloc data ho lasa packet RTP na manao ny mifanohitra amin'izany. Koa satria ny endrika angon-drakitra anatiny an'ny media streamer dia tsy mifanaraka amin'ny format data an'ny fonosana RTP, alohan'ny hamindrana ny angon-drakitra amin'ny MS_RTP_SEND, dia mila mampiasa sivana encoder ianao izay mamadika santionany famantarana famantarana feo 16-bit ho valo-bit voakodia araka ny u-law (mu-law). Amin'ny lafiny fandraisana, ny sivana decoder dia manao ny asa mifanohitra amin'izany.

Ity ambany ity ny lahatsoratry ny programa izay mampihatra ny drafitra aseho amin'ny sary (ireo marika # alohan'ny nesorina ny torolΓ lana misy azy, aza adino ny mampiditra azy ireo):

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

Manangona sy mihazakazaka izahay. Ny programa dia hiasa toy ny tamin'ny ohatra teo aloha, fa ny angon-drakitra dia halefa amin'ny alΓ lan'ny stream RTP.

Amin'ny lahatsoratra manaraka dia hizara ity programa ity ho fampiharana tsy miankina roa - mpandray sy mpandefa ary handefa azy ireo amin'ny terminal samihafa. Mandritra izany fotoana izany dia hianatra ny fomba famakafakana ny fonosana RTP amin'ny alΓ lan'ny programa TShark isika.

Source: www.habr.com

Add a comment