αααααΆααααα’αααααααΊααααΈαααα»α
ααΆααααααΌααααααΆα’αΌααΈαααΌααΆααααααααααΈα RTP
αααα»αβα’ααΈαααΆα
αα·ααΈααΆα RTP (αα·ααΈααΆααααααααΆαα·α) ααααααααΆααααααΆαα·ααΈααΆααααααααΆαα·α ααΆααααΌαααΆαααααΎααΎααααΈαααααΌαα’αΌααΈαααΌ ααΈααα’αΌ αα·αααααα α’αααΈααααααααΆααααααΆαααΆαααΆααααααΌαααΆααααααααΆααΆαααααααα ααααααααααΆα’αΌααΈαααΌααΆα§ααΆα αααα ααΆααααααααααα·ααΈααΆαααΊααΌα αααααΆα’αα»ααααΆαα±ααα’ααααααααΌααααααΆααα‘ααααΆαα½αααΉααα»αααΆααααααΆαααααααα»αααΆαα»αα
ααΆααααααΌαααααΌαααΆαα’αα»αααααααααααΎαααα αα UDP αααααΆααααααΆααΆαααΆααααααααα ααααααααΆαααΊα’αΆα ααα½αααααΆααααα»αα’αα‘α»αααααααααΌαα αααα ααααΈαα½ααααΆαααααααΆ RTP αα·ααα αα·ααααα»ααα·αααααααααααααΆαααααΌαα ααααααΆααΆαα§ααααααααααΆααααααααααααΆαααααΆαααααΎαααΎααααα ααααα ααααααΆαα’αααΈαααααααααααααΆαααααααΌαααΆααααααΌα αα·ααααααααΆαααααα ααααααααΆααααα½αααα ααΌα αααααααα ααααααααΆαα’αΆα ααααΌαααΆααααα αααΆαααααΆαααααααααααΉαααααΌααα αααααααΎααΆααα·ααΌα ααααα·ααα·αααΈααααΆααααααα½αααααααΌαααΆααααααΌαααα αααααΆαα ααααααΆααα’αΆα ααΆαααααααΆαααααααααααα αααα α ααΆααααααααααα αααα’αα»ααααΆαα±ααααααααΆααααΌαααΆαααααααα½ααααααΆααααααΎαααα»ααα·α αα ααΆααααααα·ααΈααΆααααΆαααα½αα
αααα»ααα·αααααααααα»αααααα»ααααααα ααααααααΆαα ααΆααααα ααααααααα»αααααΆαα·ααΆα’αΆαααααααΎααααααααααΆααααα»α ααΆα’αΆα ααΆααααΌαααααααΆαααΌααΌ αααααΆαααααααα’αΌ ααααααΌαααΆαααΈααα’αΌααα
ααααααααααΆααααα»αααααΌαααΆαα ααα’α»ααααα αΆαααααααααααΆαααΈααααΈαα α’αα»ααΆααα RFC3551 (αααααααααααΆα RTP αααααΆααααααα·αα·αα’αΌααΈαααΌ αα·αααΈααα’αΌααΆαα½αααΉαααΆαααααααααααα·α αα½α αααα»αα) αααααΎαααααααααααα»αααΆα αααΎα ααΆααΆααααααααΌαααααΆαααααααΌαααΆααα·αααααΆα’αααΈααααααααααααα»α αα·αα’ααααααααααΌαααααα½αααΆααααΌαααΆααααααα αααααΌααα½αα ααα½ααα·αααααΌαααΆαααααΆαααααΆαααΉααααΉααα ααΉαααααααααααΆααααα»αααΆαα½ααα αα½αααα’αΆα ααααΎααΎααααΈαααααααΆααααα»αααΆαα’αααΎα α·αααα
ααα ααααααα»ααα·ααααααααααΌαααΆααααααααΆαααΎαααααα ααααα ααα’αα·ααααΆαααα’αΆα ααααΌαααΆααααααΌααα ααΎαααααΆααααααΆααααααα±αααααααααΆαααΆααααα αα (αααΆαααΆαααααα MTU) α ααΆααΌαα ααΆαα·αααΎαααΈ 1500 ααααα ααΌα αααα ααΎααααΈαααααΎαα ααα½ααα·αααααααααααΆααααααΌααααα»ααα½ααα·ααΆααΈ α’αααα’αΆα αααααΎαααα ααααα ααααααααΆααα αΌααααα ααα»α ααΆααααΆαααα½α α αΎααααααΆααααα’αααααΉαααααΌααααααΎαααΆαααΉαααΆααααααΆαααααΎαααα ααααααααΆαα αα αααα»ααααααα·ααΈααααΆααααα αααααΊααΆααΆαααααααααα’αΆα αααααααΆαα ααΆαααααΆαααΎαααΆααΊ 50 Hz, i.e. 50 αααα αααααα»ααα½ααα·ααΆααΈα ααΎαβααΉαβα α βααααΆααβααβαααα αα RTP αααβααΆαβαααααΌαβααΆβααΆβααααααΈα RTP α
ααΎααααΈα αΆααααααΎααααααΌααα·αααααααααΆαααααααα·αα’αααααα½α ααΆαααααααααΆααα αΎααααα’ααααααααΌαααΉαα’αΆααααααΆα 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 αααΈααα ααΆααααΆαααΈαααΈααααααΆαα’αα·αααΌααααααααα ααΆα 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);
}
}
ααΎαα ααααααα·αααααΎαααΆαα αααααα·ααΈααΉαααααΎαααΆαααΌα αααα»αα§ααΆα ααααα»α ααα»αααααα·ααααααααΉαααααΌαααΆααααααΌαααΆααααααααααΈα RTP α
αα αααα»αα’ααααααααααΆαα ααΎαααΉααααα αααααααα·ααΈαααααΆαααααα·ααΈα―αααΆαααααΈα - α’αααααα½α αα·αα§ααααααααααΌα α αΎαααΎαααααΎαααΆααα½αααΆαα αααα»αααααΆααΈαααααααααααΆα αααα»ααααααΆαα½αααααΆααα ααΎαααΉααααααΈαααααα·ααΆααααα ααααααααΆα RTP αααααααΎαααααα·ααΈ TShark α
ααααα: www.habr.com