เชฒเซเชเชจเซ เชธเชพเชฎเชเซเชฐเซ เชฎเชพเชฐเชพ เชชเชฐเชฅเซ เชฒเซเชตเชพเชฎเชพเช เชเชตเซ เชเซ
เชกเซเชชเซเชฒเซเชเซเชธ เชเชจเซเชเชฐเชเซเชฎ
เชเซเชฒเซเชฒเชพเชฎเชพเช
เชเชเซเชคเชฟ เชถเซเชฐเซเชทเช เชเชเซเชคเชฟเชฎเชพเช เชฌเชคเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เชซเชฟเชฒเซเชเชฐเซเชธเชจเซ เชจเซเชเซเชจเซ เชธเชพเชเชเชณ เชเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เชชเชพเชฅ เชฌเชจเชพเชตเซ เชเซ, เชเซ เชธเชพเชเชจเซเชก เชเชพเชฐเซเชกเชฅเซ เชถเชฐเซ เชฅเชพเชฏ เชเซ. เชคเซ เชฎเชพเชเชเซเชฐเซเชซเซเชจเชฎเชพเชเชฅเซ เชธเชฟเชเซเชจเชฒ เชจเชฎเซเชจเชพเช เชชเซเชฐเชฆเชพเชจ เชเชฐเซ เชเซ. เชฎเซเชณเชญเซเชค เชฐเซเชคเซ, เช เชชเซเชฐเชคเชฟ เชธเซเชเชจเซเชก 8000 เชจเชฎเซเชจเชพเชจเชพ เชฆเชฐเซ เชฅเชพเชฏ เชเซ. เชฎเซเชกเชฟเชฏเชพ เชธเซเชเซเชฐเซเชฎเชฐ เชเชกเชฟเชฏเซ เชซเชฟเชฒเซเชเชฐเซเชธ เชเซ เชกเซเชเชพ เชฌเซเช เชกเซเชชเซเชฅเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ เชคเซ 16 เชฌเชฟเชเซเชธ เชเซ (เช เชฎเชนเชคเซเชตเชจเซเช เชจเชฅเซ; เชเซ เชคเชฎเซ เชเชเซเชเซ เชคเซ, เชคเชฎเซ เชซเชฟเชฒเซเชเชฐเซเชธ เชฒเชเซ เชถเชเซ เชเซ เชเซ เชตเชงเซ เชฌเซเช เชกเซเชชเซเชฅ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชถเซ). เชกเซเชเชพเชจเซ 160 เชจเชฎเซเชจเชพเชเชจเชพ เชฌเซเชฒเซเชเชฎเชพเช เชเซเชฅเชฌเชฆเซเชง เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชเซ. เชเชฎ, เชฆเชฐเซเช เชฌเซเชฒเซเชเชจเซเช เชเชฆ 320 เชฌเชพเชเชเซเชธ เชเซ. เชเชเชณ, เช เชฎเซ เชเชจเชฐเซเชเชฐเชจเชพ เชเชจเชชเซเช เชชเชฐ เชกเซเชเชพ เชซเซเชก เชเชฐเซเช เชเซเช, เชเซ, เชเซเชฏเชพเชฐเซ เชฌเชเชง เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชคเซเชฏเชพเชฐเซ เชกเซเชเชพ เชฎเชพเชเซ "เชชเชพเชฐเชฆเชฐเซเชถเช" เชนเซเชฏ เชเซ. เชเซ เชคเชฎเซ เชกเชฟเชฌเชเซเชเช เชฆเชฐเชฎเชฟเชฏเชพเชจ เชฎเชพเชเชเซเชฐเซเชซเซเชจเชฎเชพเช เชตเชพเชค เชเชฐเซเชจเซ เชเชเชเชพเชณเซ เชเชฏเชพ เชนเซเชต เชคเซ เชฎเซเช เชคเซเชจเซ เชเชฎเซเชฐเซเชฏเซเช เชเซ - เชคเชฎเซ เชเซเชจ เชธเชฟเชเซเชจเชฒ เชธเชพเชฅเซ เชชเชพเชฅเชจเซ "เชถเซเช" เชเชฐเชตเชพ เชฎเชพเชเซ เชเชจเชฐเซเชเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชถเชเซ เชเซ.
เชเชจเชฐเซเชเชฐ เชชเชเซ, เชธเชฟเชเซเชจเชฒ เชเชจเซเชเซเชกเชฐ เชชเชฐ เชเชพเชฏ เชเซ, เชเซ ยต-เชฒเซ (G.16 เชธเซเชเชพเชจเซเชกเชฐเซเชก) เช เชจเซเชธเชพเชฐ เช เชฎเชพเชฐเชพ 711-เชฌเซเช เชจเชฎเซเชจเชพเชเชจเซ เชเช -เชฌเซเชเชฎเชพเช เชฐเซเชชเชพเชเชคเชฐเชฟเชค เชเชฐเซ เชเซ. เชเชจเซเชเซเชกเชฐเชจเชพ เชเชเชเชชเซเช เชชเชฐ, เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชชเชนเซเชฒเชพเชฅเซ เช เช เชกเชงเชพ เชเชฆเชจเชพ เชกเซเชเชพ เชฌเซเชฒเซเช เชเซ. เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ, เชเซ เช เชฎเชจเซ เชเซเชฐเชพเชซเชฟเช เชฌเชเชพเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชจ เชนเซเชฏ เชคเซ เช เชฎเซ เชเชฎเซเชชเซเชฐเซเชถเชจ เชตเชฟเชจเชพ เชกเซเชเชพ เชเซเชฐเชพเชจเซเชธเชฎเชฟเช เชเชฐเซ เชถเชเซเช เชเซเช. เชชเชฐเชเชคเซ เช เชนเซเช เชเชจเซเชเซเชกเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเชตเซ เชเชชเชฏเซเชเซ เชเซ, เชเชพเชฐเชฃ เชเซ เชตเชพเชฏเชฐเชถเชพเชฐเซเช เชเชฐเชเซเชชเซ เชธเซเชเซเชฐเซเชฎเชฎเชพเชเชฅเซ เชเชกเชฟเชฏเซ เชคเซเชฏเชพเชฐเซ เช เชชเซเชจเชเชเชคเซเชชเชพเชฆเชฟเชค เชเชฐเซ เชถเชเซ เชเซ เชเซเชฏเชพเชฐเซ เชคเซเชจเซ ยต-เชฒเซ เช เชฅเชตเชพ เช-เชฒเซ เช เชจเซเชธเชพเชฐ เชธเชเชเซเชเชฟเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเซ.
เชเชจเซเชเซเชกเชฐ เชชเชเซ, เชกเซเชเชพเชจเชพ เชนเชณเชตเชพ เชฌเซเชฒเซเชเซเชธ rtpsend เชซเชฟเชฒเซเชเชฐเชจเซ เชฎเซเชเชฒเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชเซ เชคเซเชฎเชจเซ RTP เชชเซเชเซเชเชฎเชพเช เชฎเซเชเชถเซ, เชเชฐเซเชฐเซ เชซเซเชฒเซเช เชธเซเช เชเชฐเชถเซ เช เชจเซ UDP เชชเซเชเซเชเชจเชพ เชฐเซเชชเชฎเชพเช เชจเซเชเชตเชฐเซเช เชชเชฐ เชเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เชฎเชพเชเซ เชฎเซเชกเชฟเชฏเชพ เชธเซเชเซเชฐเซเชฎเชฐเชจเซ เชเชชเชถเซ.
เชซเชฟเชฒเซเชเชฐเซเชธเชจเซ เชเชชเชฒเซ เชธเชพเชเชเชณ เชชเซเชฐเชพเชชเซเชคเชฟ เชชเชพเชฅ เชฌเชจเชพเชตเซ เชเซ; เชจเซเชเชตเชฐเซเชเชฎเชพเชเชฅเซ เชฎเซเชกเชฟเชฏเชพ เชธเซเชเซเชฐเซเชฎเชฐ เชฆเซเชตเชพเชฐเชพ เชฎเซเชณเชตเซเชฒเชพ RTP เชชเซเชเซเชเซเชธ rtprecv เชซเชฟเชฒเซเชเชฐเชฎเชพเช เชฆเชพเชเชฒ เชฅเชพเชฏ เชเซ, เชเซเชจเชพ เชเชเชเชชเซเช เชชเชฐ เชคเซเช เชกเซเชเชพ เชฌเซเชฒเซเชเซเชธเชจเชพ เชธเซเชตเชฐเซเชชเชฎเชพเช เชฆเซเชเชพเชฏ เชเซ, เชเซเชฎเชพเชเชฅเซ เชฆเชฐเซเช เชเช เชชเซเชฐเชพเชชเซเชค เชชเซเชเซเชเชจเซ เช เชจเซเชฐเซเชช เชเซ. เชฌเซเชฒเซเชเชฎเชพเช เชฎเชพเชคเซเชฐ เชชเซเชฒเซเชก เชกเซเชเชพ เชเซ; เช เชเชพเชเชจเชพ เชฒเซเชเชฎเชพเช เชคเซเช เชเชฟเชคเซเชฐเชฎเชพเช เชฒเซเชฒเชพ เชฐเชเชเชฎเชพเช เชฆเชฐเซเชถเชพเชตเชตเชพเชฎเชพเช เชเชตเซเชฏเชพ เชนเชคเชพ.
เชเชเชณ, เชฌเซเชฒเซเชเซเชธเชจเซ เชกเซเชเซเชกเชฐ เชซเชฟเชฒเซเชเชฐเชฎเชพเช เชฎเซเชเชฒเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชเซ เชคเซเชฎเชพเช เชฐเชนเซเชฒเชพ เชธเชฟเชเชเชฒ-เชฌเชพเชเช เชจเชฎเซเชจเชพเชเชจเซ เชฐเซเชเซเชฏ, 16-เชฌเซเชเชฎเชพเช เชฐเซเชชเชพเชเชคเชฐเชฟเชค เชเชฐเซ เชเซ. เชเซ เชฎเซเชกเชฟเชฏเชพ เชธเซเชเซเชฐเซเชฎเชฐ เชซเชฟเชฒเซเชเชฐเซเชธ เชฆเซเชตเชพเชฐเชพ เชชเชนเซเชฒเชพเชฅเซ เช เชชเซเชฐเซเชธเซเชธ เชเชฐเซ เชถเชเชพเชฏ เชเซ. เช เชฎเชพเชฐเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช, เช เชฎเซ เชคเซเชฎเชจเซ เชคเชฎเชพเชฐเชพ เชนเซเชกเชธเซเชเชจเชพ เชธเซเชชเซเชเชฐเซเชธ เชชเชฐ เชชเซเชฒเซเชฌเซเช เชฎเชพเชเซ เชธเชพเชเชจเซเชก เชเชพเชฐเซเชก เชชเชฐ เชฎเซเชเชฒเซเช เชเซเช.
เชนเชตเซ เชเชพเชฒเซ เชธเซเชซเซเชเชตเซเชฐ เช เชฎเชฒเซเชเชฐเชฃ เชคเชฐเชซ เชเชเชณ เชตเชงเซเช. เช เชเชฐเชตเชพ เชฎเชพเชเซ, เช เชฎเซ เชฐเซเชธเซเชตเชฐ เช เชจเซ เชเซเชฐเชพเชจเซเชธเชฎเซเชเชฐ เชซเชพเชเชฒเซเชจเซ เชเซเชกเซเชถเซเช เชเซ เช เชฎเซ เชชเชนเซเชฒเชพ เช เชฒเช เชเชฐเซ เชนเชคเซ. เช เชชเชนเซเชฒเชพเช, เช เชฎเซ เชชเซเชฐเซเชเซเชธ เช เชจเซ เชธเชฐเชจเชพเชฎเชพเชเช เชฎเชพเชเซ เชจเชฟเชถเซเชเชฟเชค เชธเซเชเชฟเชเชเซเชธเชจเซ เชเชชเชฏเซเช เชเชฐเซเชฏเซ เชนเชคเซ, เชชเชฐเชเชคเซ เชนเชตเซ เช เชฎเชจเซ เชธเซเชเชพเชฐเซเชเช เชช เชตเชเชคเซ เชเชฒเซเชฒเซเชเชฟเชค เชธเซเชเชฟเชเชเซเชธเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพ เชฎเชพเชเซ เชธเชเซเชทเชฎ เชฅเชตเชพ เชฎเชพเชเซ เชชเซเชฐเซเชเซเชฐเชพเชฎเชจเซ เชเชฐเซเชฐ เชเซ. เช เชเชฐเชตเชพ เชฎเชพเชเซ, เช เชฎเซ เชเชฆเซเชถ เชตเชพเชเซเชฏ เชฆเชฒเซเชฒเซเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพ เชฎเชพเชเซ เชเชพเชฐเซเชฏเชเซเชทเชฎเชคเชพ เชเชฎเซเชฐเซเชถเซเช. เชเซ เชชเชเซ เช เชฎเซ เชเซ เชเชจเซเชเชฐเชเซเชฎ เชธเชพเชฅเซ เชเชจเซเชเซเชถเชจ เชธเซเชฅเชพเชชเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซเช เชเซเช เชคเซเชจเซเช IP เชเชกเซเชฐเซเชธ เช เชจเซ เชชเซเชฐเซเช เชธเซเช เชเชฐเซ เชถเชเซเชถเซเช.
เชชเซเชฐเชฅเชฎ, เชเชพเชฒเซ เชชเซเชฐเซเชเซเชฐเชพเชฎเชฎเชพเช เชเช เชฎเชพเชณเชเซเช เชเชฎเซเชฐเซเช เชเซ เชคเซเชจเซ เชธเซเชเชฟเชเชเซเชธ เชธเชเชเซเชฐเชนเชฟเชค เชเชฐเชถเซ:
struct _app_vars
{
int local_port; /* ะะพะบะฐะปัะฝัะน ะฟะพัั. */
int remote_port; /* ะะพัั ะฟะตัะตะณะพะฒะพัะฝะพะณะพ ััััะพะนััะฒะฐ ะฝะฐ ัะดะฐะปะตะฝะฝะพะผ ะบะพะผะฟัััะตัะต. */
char remote_addr[128]; /* IP-ะฐะดัะตั ัะดะฐะปะตะฝะฝะพะณะพ ะบะพะผะฟัััะตัะฐ. */
MSDtmfGenCustomTone dtmf_cfg; /* ะะฐัััะพะนะบะธ ัะตััะพะฒะพะณะพ ัะธะณะฝะฐะปะฐ ะณะตะฝะตัะฐัะพัะฐ. */
};
typedef struct _app_vars app_vars;
เชชเซเชฐเซเชเซเชฐเชพเชฎ เช เชชเซเชฐเชเชพเชฐเชจเซเช เชฎเชพเชณเชเซเช เชเชพเชนเซเชฐ เชเชฐเชถเซ เชเซเชจเซ vars เชเชนเซเชตเชพเชฏ เชเซ.
เชเชเชณ, เชเชพเชฒเซ เชเชฆเซเชถ เชตเชพเชเซเชฏ เชฆเชฒเซเชฒเซเชจเซ เชชเชพเชฐเซเชธ เชเชฐเชตเชพ เชฎเชพเชเซ เชซเชเชเซเชถเชจ เชเชฎเซเชฐเซเช:
/* ะคัะฝะบัะธั ะฟัะตะพะฑัะฐะทะพะฒะฐะฝะธั ะฐัะณัะผะตะฝัะพะฒ ะบะพะผะฐะฝะดะฝะพะน ัััะพะบะธ ะฒ
* ะฝะฐัััะพะนะบะธ ะฟัะพะณัะฐะผะผั. */
void scan_args(int argc, char *argv[], app_vars *v)
{
char i;
for (i=0; i<argc; i++)
{
if (!strcmp(argv[i], "--help"))
{
char *p=argv[0]; p=p + 2;
printf(" %s walkie talkienn", p);
printf("--help List of options.n");
printf("--version Version of application.n");
printf("--addr Remote abonent IP address string.n");
printf("--port Remote abonent port number.n");
printf("--lport Local port number.n");
printf("--gen Generator frequency.n");
exit(0);
}
if (!strcmp(argv[i], "--version"))
{
printf("0.1n");
exit(0);
}
if (!strcmp(argv[i], "--addr"))
{
strncpy(v->remote_addr, argv[i+1], 16);
v->remote_addr[16]=0;
printf("remote addr: %sn", v->remote_addr);
}
if (!strcmp(argv[i], "--port"))
{
v->remote_port=atoi(argv[i+1]);
printf("remote port: %in", v->remote_port);
}
if (!strcmp(argv[i], "--lport"))
{
v->local_port=atoi(argv[i+1]);
printf("local port : %in", v->local_port);
}
if (!strcmp(argv[i], "--gen"))
{
v -> dtmf_cfg.frequencies[0] = atoi(argv[i+1]);
printf("gen freq : %in", v -> dtmf_cfg.frequencies[0]);
}
}
}
เชชเชฆเชเซเชเซเชฆเชจเชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซ, เชเชฎเชพเชจเซเชก เชฒเชพเชเชจ เชฆเชฒเซเชฒเซ vars เชธเซเชเซเชฐเชเซเชเชฐเชจเชพ เชเซเชทเซเชคเซเชฐเซเชฎเชพเช เชฎเซเชเชตเชพเชฎเชพเช เชเชตเชถเซ. เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซเช เชฎเซเชเซเชฏ เชเชพเชฐเซเชฏ เชซเชฟเชฒเซเชเชฐเซเชธเชฎเชพเชเชฅเซ เชเซเชฐเชพเชจเซเชธเชฎเชฟเชเชฟเชเช เช เชจเซ เชชเซเชฐเชพเชชเซเชค เชเชฐเชตเชพเชจเชพ เชชเชพเชฅ เชเชเชคเซเชฐเชฟเชค เชเชฐเชตเชพเชจเซเช เชฐเชนเซเชถเซ; เชเซเชเชฐเชจเซ เชเชจเซเชเซเช เชเชฐเซเชฏเชพ เชชเชเซ, เชจเชฟเชฏเชเชคเซเชฐเชฃเชจเซ เช เชจเชเชค เชฒเซเชชเชฎเชพเช เชธเซเชฅเชพเชจเชพเชเชคเชฐเชฟเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ, เชเซ, เชเซ เชเชจเชฐเซเชเชฐเชจเซ เชเชตเชฐเซเชคเชจ เชฌเชฟเชจ-เชถเซเชจเซเชฏ เชชเชฐ เชธเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชนเซเชฏ, เชคเซ เชชเชฐเซเชเซเชทเชฃ เชเชจเชฐเซเชเชฐเชจเซ เชชเซเชจเชเชชเซเชฐเชพเชฐเชเชญ เชเชฐเชถเซ เชเซเชฅเซ เชเชฐเซเชจเซ เชคเซ เช เชเชเซเชฏเชพ เชตเชฟเชจเชพ เชเชพเชฎ เชเชฐเซ เชเซ.
เชเชจเชฐเซเชเชฐเชจเซ เชคเซเชจเซ เชกเชฟเชเชพเชเชจเชจเซ เชเชพเชฐเชฃเซ เช เชชเซเชจเชเชชเซเชฐเชพเชฐเชเชญเชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ; เชเซเชเชฒเชพเช เชเชพเชฐเชฃเซเชธเชฐ เชคเซ 16 เชธเซเชเชจเซเชกเชฅเซ เชตเชงเซ เชธเชฎเชฏ เชธเซเชงเซ เชเชพเชฒเชคเซเช เชธเชฟเชเซเชจเชฒ เชเชคเซเชชเชจเซเชจ เชเชฐเซ เชถเชเชคเซเช เชจเชฅเซ. เช เชจเซเชเชงเชตเซเช เชเซเชเช เชเซ เชคเซเชจเซ เช เชตเชงเชฟ 32-เชฌเซเช เชจเชเชฌเชฐ เชฆเซเชตเชพเชฐเชพ เชจเชฟเชฐเซเชฆเชฟเชทเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ.
เชธเชฎเชเซเชฐ เชเชพเชฐเซเชฏเชเซเชฐเชฎ เชเชจเชพ เชเซเชตเซ เชฆเซเชเชพเชถเซ:
/* ะคะฐะนะป mstest8.c ะะผะธัะฐัะพั ะฟะตัะตะณะพะฒะพัะฝะพะณะพ ััััะพะนััะฒะฐ. */
#include <mediastreamer2/mssndcard.h>
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/msrtp.h>
/* ะะพะดะบะปััะฐะตะผ ัะฐะนะป ะพะฑัะธั
ััะฝะบัะธะน. */
#include "mstest_common.c"
/*----------------------------------------------------------*/
struct _app_vars
{
int local_port; /* ะะพะบะฐะปัะฝัะน ะฟะพัั. */
int remote_port; /* ะะพัั ะฟะตัะตะณะพะฒะพัะฝะพะณะพ ััััะพะนััะฒะฐ ะฝะฐ ัะดะฐะปะตะฝะฝะพะผ ะบะพะผะฟัััะตัะต. */
char remote_addr[128]; /* IP-ะฐะดัะตั ัะดะฐะปะตะฝะฝะพะณะพ ะบะพะผะฟัััะตัะฐ. */
MSDtmfGenCustomTone dtmf_cfg; /* ะะฐัััะพะนะบะธ ัะตััะพะฒะพะณะพ ัะธะณะฝะฐะปะฐ ะณะตะฝะตัะฐัะพัะฐ. */
};
typedef struct _app_vars app_vars;
/*----------------------------------------------------------*/
/* ะกะพะทะดะฐะตะผ ะดัะฟะปะตะบัะฝัั RTP-ัะตััะธั. */
RtpSession* create_duplex_rtp_session(app_vars v)
{
RtpSession *session = create_rtpsession (v.local_port, v.local_port + 1, FALSE, RTP_SESSION_SENDRECV);
rtp_session_set_remote_addr_and_port(session, v.remote_addr, v.remote_port, v.remote_port + 1);
rtp_session_set_send_payload_type(session, PCMU);
return session;
}
/*----------------------------------------------------------*/
/* ะคัะฝะบัะธั ะฟัะตะพะฑัะฐะทะพะฒะฐะฝะธั ะฐัะณัะผะตะฝัะพะฒ ะบะพะผะฐะฝะดะฝะพะน ัััะพะบะธ ะฒ
* ะฝะฐัััะพะนะบะธ ะฟัะพะณัะฐะผะผั. */
void scan_args(int argc, char *argv[], app_vars *v)
{
char i;
for (i=0; i<argc; i++)
{
if (!strcmp(argv[i], "--help"))
{
char *p=argv[0]; p=p + 2;
printf(" %s walkie talkienn", p);
printf("--help List of options.n");
printf("--version Version of application.n");
printf("--addr Remote abonent IP address string.n");
printf("--port Remote abonent port number.n");
printf("--lport Local port number.n");
printf("--gen Generator frequency.n");
exit(0);
}
if (!strcmp(argv[i], "--version"))
{
printf("0.1n");
exit(0);
}
if (!strcmp(argv[i], "--addr"))
{
strncpy(v->remote_addr, argv[i+1], 16);
v->remote_addr[16]=0;
printf("remote addr: %sn", v->remote_addr);
}
if (!strcmp(argv[i], "--port"))
{
v->remote_port=atoi(argv[i+1]);
printf("remote port: %in", v->remote_port);
}
if (!strcmp(argv[i], "--lport"))
{
v->local_port=atoi(argv[i+1]);
printf("local port : %in", v->local_port);
}
if (!strcmp(argv[i], "--gen"))
{
v -> dtmf_cfg.frequencies[0] = atoi(argv[i+1]);
printf("gen freq : %in", v -> dtmf_cfg.frequencies[0]);
}
}
}
/*----------------------------------------------------------*/
int main(int argc, char *argv[])
{
/* ะฃััะฐะฝะฐะฒะปะธะฒะฐะตะผ ะฝะฐัััะพะนะบะธ ะฟะพ ัะผะพะปัะฐะฝะธั. */
app_vars vars={5004, 7010, "127.0.0.1", {0}};
/* ะฃััะฐะฝะฐะฒะปะธะฒะฐะตะผ ะฝะฐัััะพะนะบะธ ะฝะฐัััะพะนะบะธ ะฟัะพะณัะฐะผะผั ะฒ
* ัะพะพัะฒะตัััะฒะธะธ ั ะฐัะณัะผะตะฝัะฐะผะธ ะบะพะผะฐะฝะดะฝะพะน ัััะพะบะธ. */
scan_args(argc, argv, &vars);
ms_init();
/* ะกะพะทะดะฐะตะผ ัะบะทะตะผะฟะปััั ัะธะปัััะพะฒ ะฟะตัะตะดะฐััะตะณะพ ััะฐะบัะฐ. */
MSSndCard *snd_card =
ms_snd_card_manager_get_default_card(ms_snd_card_manager_get());
MSFilter *snd_card_read = ms_snd_card_create_reader(snd_card);
MSFilter *dtmfgen = ms_filter_new(MS_DTMF_GEN_ID);
MSFilter *rtpsend = ms_filter_new(MS_RTP_SEND_ID);
/* ะกะพะทะดะฐะตะผ ัะธะปััั ะบะพะดะตัะฐ. */
MSFilter *encoder = ms_filter_create_encoder("PCMU");
/* ะ ะตะณะธัััะธััะตะผ ัะธะฟั ะฝะฐะณััะทะบะธ. */
register_payloads();
/* ะกะพะทะดะฐะตะผ ะดัะฟะปะตะบัะฝัั RTP-ัะตััะธั. */
RtpSession* rtp_session= create_duplex_rtp_session(vars);
ms_filter_call_method(rtpsend, MS_RTP_SEND_SET_SESSION, rtp_session);
/* ะกะพะตะดะธะฝัะตะผ ัะธะปัััั ะฟะตัะตะดะฐััะธะบะฐ. */
ms_filter_link(snd_card_read, 0, dtmfgen, 0);
ms_filter_link(dtmfgen, 0, encoder, 0);
ms_filter_link(encoder, 0, rtpsend, 0);
/* ะกะพะทะดะฐะตะผ ัะธะปัััั ะฟัะธะตะผะฝะพะณะพ ััะฐะบัะฐ. */
MSFilter *rtprecv = ms_filter_new(MS_RTP_RECV_ID);
ms_filter_call_method(rtprecv, MS_RTP_RECV_SET_SESSION, rtp_session);
/* ะกะพะทะดะฐะตะผ ัะธะปััั ะดะตะบะพะดะตัะฐ, */
MSFilter *decoder=ms_filter_create_decoder("PCMU");
/* ะกะพะทะดะฐะตะผ ัะธะปััั ะทะฒัะบะพะฒะพะน ะบะฐััั. */
MSFilter *snd_card_write = ms_snd_card_create_writer(snd_card);
/* ะกะพะตะดะธะฝัะตะผ ัะธะปัััั ะฟัะธัะผะฝะพะณะพ ััะฐะบัะฐ. */
ms_filter_link(rtprecv, 0, decoder, 0);
ms_filter_link(decoder, 0, snd_card_write, 0);
/* ะกะพะทะดะฐะตะผ ะธััะพัะฝะธะบ ัะฐะบัะพะฒ - ัะธะบะตั. */
MSTicker *ticker = ms_ticker_new();
/* ะะพะดะบะปััะฐะตะผ ะธััะพัะฝะธะบ ัะฐะบัะพะฒ. */
ms_ticker_attach(ticker, snd_card_read);
ms_ticker_attach(ticker, rtprecv);
/* ะัะปะธ ะฝะฐัััะพะนะบะฐ ัะฐััะพัั ะณะตะฝะตัะฐัะพัะฐ ะพัะปะธัะฝะฐ ะพั ะฝัะปั, ัะพ ะทะฐะฟััะบะฐะตะผ ะณะตะฝะตัะฐัะพั. */
if (vars.dtmf_cfg.frequencies[0])
{
/* ะะฐัััะฐะธะฒะฐะตะผ ััััะบัััั, ัะฟัะฐะฒะปััััั ะฒัั
ะพะดะฝัะผ ัะธะณะฝะฐะปะพะผ ะณะตะฝะตัะฐัะพัะฐ. */
vars.dtmf_cfg.duration = 10000;
vars.dtmf_cfg.amplitude = 1.0;
}
/* ะัะณะฐะฝะธะทัะตะผ ัะธะบะป ะฟะตัะตะทะฐะฟััะบะฐ ะณะตะฝะตัะฐัะพัะฐ. */
while(TRUE)
{
if(vars.dtmf_cfg.frequencies[0])
{
/* ะะบะปััะฐะตะผ ะทะฒัะบะพะฒะพะน ะณะตะฝะตัะฐัะพั. */
ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY_CUSTOM,
(void*)&vars.dtmf_cfg);
}
/* ะฃะบะปะฐะดัะฒะฐะตะผ ััะตะด ะฒ ัะฟััะบั ะฝะฐ 20ะผั, ััะพะฑั ะดััะณะธะต ััะตะดั
* ะฟัะธะปะพะถะตะฝะธั ะฟะพะปััะธะปะธ ะฒัะตะผั ะฝะฐ ัะฐะฑะพัั. */
ms_usleep(20000);
}
}
เชเชพเชฒเซ เชธเชเชเชฒเชจ เชเชฐเซเช. เชชเชเซ เชชเซเชฐเซเชเซเชฐเชพเชฎ เชฌเซ เชเชฎเซเชชเซเชฏเซเชเชฐ เชชเชฐ เชเชฒเชพเชตเซ เชถเชเชพเชฏ เชเซ. เช เชฅเชตเชพ เชเช เชชเชฐ, เชเซเชฎ เชนเซเช เชนเชตเซ เชเชฐเซเชถ. เช เชฎเซ เชจเซเชเซเชจเซ เชฆเชฒเซเชฒเซ เชธเชพเชฅเซ TShark เชฒเซเชจเซเช เชเชฐเซเช เชเซเช:
$ sudo tshark -i lo -f "udp dst port 7010" -P -V -O RTP -o rtp.heuristic_rtp:TRUE -x
เชเซ เชเชจเซเชธเซเชฒเชฎเชพเช เชฒเซเชเช เชซเซเชฒเซเชก เชซเชเซเชค เชเซเชชเซเชเชฐเชจเซ เชถเชฐเซเชเชค เชตเชฟเชถเซเชจเซ เชธเชเชฆเซเชถ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เชเชฐเซ เชเซ, เชคเซ เช เชเช เชธเชพเชฐเซ เชธเชเชเซเชค เชเซ - เชคเซเชจเซ เช เชฐเซเชฅ เช เชเซ เชเซ เช เชฎเชพเชฐเซเช เชชเซเชฐเซเช เชฎเซเชเซ เชญเชพเชเซ เช เชจเซเชฏ เชชเซเชฐเซเชเซเชฐเชพเชฎเซเชธ เชฆเซเชตเชพเชฐเชพ เชเชฌเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเชคเซเช เชจเชฅเซ. เชฌเซเชเชพ เชเชฐเซเชฎเชฟเชจเชฒเชฎเชพเช, เช เชฎเซ เชเช เชชเซเชฐเซเชเซเชฐเชพเชฎ เชเชจเซเชธเซเชเชจเซเชธ เชฒเซเชจเซเช เชเชฐเซเช เชเซเช เชเซ เช เชชเซเชฐเซเช เชจเชเชฌเชฐเชจเซ เชเชฒเซเชฒเซเช เชเชฐเซเชจเซ "เชฐเชฟเชฎเซเช" เชเชจเซเชเชฐเชเซเชฎเชจเซเช เช เชจเซเชเชฐเชฃ เชเชฐเชถเซ:
$ ./mstest8 --port 9010 --lport 7010
เชชเซเชฐเซเชเซเชฐเชพเชฎ เชเซเชเซเชธเซเชเชฎเชพเชเชฅเซ เชเซเช เชถเชเชพเชฏ เชเซ เชคเซเชฎ, เชกเชฟเชซเซเชฒเซเช IP เชธเชฐเชจเชพเชฎเซเช 127.0.0.1 (เชธเซเชฅเชพเชจเชฟเช เชฒเซเชชเชฌเซเช) เชเซ.
เชฌเซเชเชพ เชเชฐเซเชฎเชฟเชจเชฒเชฎเชพเช, เช เชฎเซ เชชเซเชฐเซเชเซเชฐเชพเชฎเชจเซ เชฌเซเชเซ เชฆเชพเชเชฒเซ เชถเชฐเซ เชเชฐเซเช เชเซเช, เชเซ เชธเซเชฅเชพเชจเชฟเช เชเชชเชเชฐเชฃเชจเซเช เช เชจเซเชเชฐเชฃ เชเชฐเซ เชเซ. เช เชฎเซ เชตเชงเชพเชฐเชพเชจเซ เชฆเชฒเซเชฒเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช เชเซ เชฌเชฟเชฒเซเช-เชเชจ เชเซเชธเซเช เชเชจเชฐเซเชเชฐเชจเซ เชเชพเชฎ เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ:
$ ./mstest8 --port 7010 --lport 9010 --gen 440
เช เชเซเชทเชฃเซ, "เชฐเชฟเชฎเซเช" เชเชชเชเชฐเชฃ เชคเชฐเชซ เชชเซเชฐเชธเชพเชฐเชฟเชค เชชเซเชเซเชเซ TShark เชธเชพเชฅเซ เชเชจเซเชธเซเชฒเชฎเชพเช เชซเซเชฒเซเชถ เชฅเชตเชพเชจเซเช เชถเชฐเซ เชฅเชตเซเช เชเซเชเช, เช เชจเซ เชเชฎเซเชชเซเชฏเซเชเชฐ เชธเซเชชเซเชเชฐเชฎเชพเชเชฅเซ เชธเชคเชค เชธเซเชตเชฐ เชธเชพเชเชญเชณเชตเชพเชฎเชพเช เชเชตเชถเซ.
เชเซ เชฌเชงเซเช เชฒเชเซเชฏเชพ เชชเซเชฐเชฎเชพเชฃเซ เชฅเชฏเซเช เชนเซเชฏ, เชคเซ เช เชฎเซ เชชเซเชฐเซเชเซเชฐเชพเชฎเชจเซ เชฌเซเชเซ เชจเชเชฒเชจเซ เชซเชฐเซเชฅเซ เชถเชฐเซ เชเชฐเซเช เชเซเช, เชชเชฐเชเชคเซ เชเซ เช เชจเซ เชฆเชฒเซเชฒ เชตเชฟเชจเชพ โโgen 440โ. เชนเชตเซ เชคเชฎเซ เชเชจเชฐเซเชเชฐเชจเซ เชญเซเชฎเชฟเชเชพ เชญเชเชตเชถเซ. เช เชชเชเซ, เชคเชฎเซ เชฎเชพเชเชเซเชฐเซเชซเซเชจเชฎเชพเช เช เชตเชพเช เชเชฐเซ เชถเชเซ เชเซ; เชคเชฎเชพเชฐเซ เชธเซเชชเซเชเชฐ เช เชฅเชตเชพ เชนเซเชกเชซเซเชจเชฎเชพเช เช เชจเซเชฐเซเชช เช เชตเชพเช เชธเชพเชเชญเชณเชตเซ เชเซเชเช. เชเชเซเชธเซเชเชฟเช เชธเซเชต-เชเชคเซเชคเซเชเชจเชพ เชชเชฃ เชฅเช เชถเชเซ เชเซ; เชธเซเชชเซเชเชฐเชจเชพ เชตเซเชฒเซเชฏเซเชฎเชจเซ เชฌเชเชง เชเชฐเซ เช เชจเซ เช เชธเชฐ เช เชฆเซเชถเซเชฏ เชฅเช เชเชถเซ.
เชเซ เชคเชฎเซ เชคเซเชจเซ เชฌเซ เชเชฎเซเชชเซเชฏเซเชเชฐเซเชธ เชชเชฐ เชเชฒเชพเชตเซเชฏเซเช เชเซ เช เชจเซ IP เชธเชฐเชจเชพเชฎเชพเช เชตเชฟเชถเซ เชฎเซเชเชเชตเชฃเชฎเชพเช เชจเชฅเซ, เชคเซ เชคเซ เช เชชเชฐเชฟเชฃเชพเชฎ เชคเชฎเชพเชฐเซ เชฐเชพเชน เชเซเชถเซ - เชฆเซเชตเชฟ-เชฎเชพเชฐเซเชเซ เชกเชฟเชเชฟเชเชฒ เชเซเชฃเชตเชคเซเชคเชพเชฏเซเชเซเชค เชตเซเชเชธ เชเชฎเซเชฏเซเชจเชฟเชเซเชถเชจ.
เชนเชตเซ เชชเชเซเชจเชพ เชฒเซเชเชฎเชพเช เชเชชเชฃเซ เชถเซเชเซเชถเซเช เชเซ เชเชชเชฃเชพ เชชเซเชคเชพเชจเชพ เชซเชฟเชฒเซเชเชฐเซเชธ - เชชเซเชฒเชเชเชจเซเชธ เชเซเชตเซ เชฐเซเชคเซ เชฒเชเชตเชพ, เช เชเซเชถเชฒเซเชฏเชจเซ เชเชพเชฐเชฃเซ เชคเชฎเซ เชฎเซเชกเชฟเชฏเชพ เชธเซเชเซเชฐเซเชฎเชฐเชจเซ เชเชชเชฏเซเช เชฎเชพเชคเซเชฐ เชเชกเชฟเชฏเซ เช เชจเซ เชตเชฟเชกเชฟเชฏเซ เชฎเชพเชเซ เช เชจเชนเซเช, เชชเชฐเชเชคเซ เช เชจเซเชฏ เช เชฎเซเช เชเซเชเซเชเชธ เชเซเชทเซเชคเซเชฐเชฎเชพเช เชชเชฃ เชเชฐเซ เชถเชเชถเซ.
เชธเซเชฐเซเชธ: www.habr.com