📄 confsample.c
字号:
if (!input("Enter destination port number", tmp2, sizeof(tmp2)) )
continue;
dst = strtol(tmp2, &err, 10);
if (*err || dst < 0 || dst >= port_count) {
puts("Invalid slot number");
continue;
}
status = pjmedia_conf_connect_port(conf, src, dst, 0);
if (status != PJ_SUCCESS)
app_perror(THIS_FILE, "Error connecting port", status);
break;
case 'd':
puts("");
puts("Disconnect port connection");
if (!input("Enter source port number", tmp1, sizeof(tmp1)) )
continue;
src = strtol(tmp1, &err, 10);
if (*err || src < 0 || src >= port_count) {
puts("Invalid slot number");
continue;
}
if (!input("Enter destination port number", tmp2, sizeof(tmp2)) )
continue;
dst = strtol(tmp2, &err, 10);
if (*err || dst < 0 || dst >= port_count) {
puts("Invalid slot number");
continue;
}
status = pjmedia_conf_disconnect_port(conf, src, dst);
if (status != PJ_SUCCESS)
app_perror(THIS_FILE, "Error connecting port", status);
break;
case 't':
puts("");
puts("Adjust transmit level of a port");
if (!input("Enter port number", tmp1, sizeof(tmp1)) )
continue;
src = strtol(tmp1, &err, 10);
if (*err || src < 0 || src >= port_count) {
puts("Invalid slot number");
continue;
}
if (!input("Enter level (-128 to >127, 0 for normal)",
tmp2, sizeof(tmp2)) )
continue;
level = strtol(tmp2, &err, 10);
if (*err || level < -128) {
puts("Invalid level");
continue;
}
status = pjmedia_conf_adjust_tx_level( conf, src, level);
if (status != PJ_SUCCESS)
app_perror(THIS_FILE, "Error adjusting level", status);
break;
case 'r':
puts("");
puts("Adjust receive level of a port");
if (!input("Enter port number", tmp1, sizeof(tmp1)) )
continue;
src = strtol(tmp1, &err, 10);
if (*err || src < 0 || src >= port_count) {
puts("Invalid slot number");
continue;
}
if (!input("Enter level (-128 to >127, 0 for normal)",
tmp2, sizeof(tmp2)) )
continue;
level = strtol(tmp2, &err, 10);
if (*err || level < -128) {
puts("Invalid level");
continue;
}
status = pjmedia_conf_adjust_rx_level( conf, src, level);
if (status != PJ_SUCCESS)
app_perror(THIS_FILE, "Error adjusting level", status);
break;
case 'v':
puts("");
puts("Display VU meter");
if (!input("Enter port number to monitor", tmp1, sizeof(tmp1)) )
continue;
src = strtol(tmp1, &err, 10);
if (*err || src < 0 || src >= port_count) {
puts("Invalid slot number");
continue;
}
if (!input("Enter r for rx level or t for tx level", tmp2, sizeof(tmp2)))
continue;
if (tmp2[0] != 'r' && tmp2[0] != 't') {
puts("Invalid option");
continue;
}
if (!input("Duration to monitor (in seconds)", tmp1, sizeof(tmp1)) )
continue;
strtol(tmp1, &err, 10);
if (*err) {
puts("Invalid duration number");
continue;
}
monitor_level(conf, src, tmp2[0], strtol(tmp1, &err, 10));
break;
case 'q':
goto on_quit;
default:
printf("Invalid input character '%c'\n", tmp[0]);
break;
}
}
on_quit:
/* Start deinitialization: */
/* Destroy conference bridge */
status = pjmedia_conf_destroy( conf );
PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
/* Destroy file ports */
for (i=0; i<file_count; ++i) {
status = pjmedia_port_destroy( file_port[i]);
PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
}
/* Destroy recorder port */
if (rec_port)
pjmedia_port_destroy(rec_port);
/* Release application pool */
pj_pool_release( pool );
/* Destroy media endpoint. */
pjmedia_endpt_destroy( med_endpt );
/* Destroy pool factory */
pj_caching_pool_destroy( &cp );
/* Shutdown PJLIB */
pj_shutdown();
/* Done. */
return 0;
}
/*
* List the ports in conference bridge
*/
static void conf_list(pjmedia_conf *conf, int detail)
{
enum { MAX_PORTS = 32 };
unsigned i, count;
pjmedia_conf_port_info info[MAX_PORTS];
printf("Conference ports:\n");
count = PJ_ARRAY_SIZE(info);
pjmedia_conf_get_ports_info(conf, &count, info);
for (i=0; i<count; ++i) {
char txlist[4*MAX_PORTS];
unsigned j;
pjmedia_conf_port_info *port_info = &info[i];
txlist[0] = '\0';
for (j=0; j<port_info->listener_cnt; ++j) {
char s[10];
pj_ansi_sprintf(s, "#%d ", port_info->listener_slots[j]);
pj_ansi_strcat(txlist, s);
}
if (txlist[0] == '\0') {
txlist[0] = '-';
txlist[1] = '\0';
}
if (!detail) {
printf("Port #%02d %-25.*s transmitting to: %s\n",
port_info->slot,
(int)port_info->name.slen,
port_info->name.ptr,
txlist);
} else {
unsigned tx_level, rx_level;
pjmedia_conf_get_signal_level(conf, port_info->slot,
&tx_level, &rx_level);
printf("Port #%02d:\n"
" Name : %.*s\n"
" Sampling rate : %d Hz\n"
" Samples per frame : %d\n"
" Frame time : %d ms\n"
" Signal level adjustment : tx=%d, rx=%d\n"
" Current signal level : tx=%u, rx=%u\n"
" Transmitting to ports : %s\n\n",
port_info->slot,
(int)port_info->name.slen,
port_info->name.ptr,
port_info->clock_rate,
port_info->samples_per_frame,
port_info->samples_per_frame*1000/port_info->clock_rate,
port_info->tx_adj_level,
port_info->rx_adj_level,
tx_level,
rx_level,
txlist);
}
}
puts("");
}
/*
* Display VU meter
*/
static void monitor_level(pjmedia_conf *conf, int slot, int dir, int dur)
{
enum { SLEEP = 20, SAMP_CNT = 2};
pj_status_t status;
int i, total_count;
unsigned level, samp_cnt;
puts("");
printf("Displaying VU meter for port %d for about %d seconds\n",
slot, dur);
total_count = dur * 1000 / SLEEP;
level = 0;
samp_cnt = 0;
for (i=0; i<total_count; ++i) {
unsigned tx_level, rx_level;
int j, length;
char meter[21];
/* Poll the volume every 20 msec */
status = pjmedia_conf_get_signal_level(conf, slot,
&tx_level, &rx_level);
if (status != PJ_SUCCESS) {
app_perror(THIS_FILE, "Unable to read level", status);
return;
}
level += (dir=='r' ? rx_level : tx_level);
++samp_cnt;
/* Accumulate until we have enough samples */
if (samp_cnt < SAMP_CNT) {
pj_thread_sleep(SLEEP);
continue;
}
/* Get average */
level = level / samp_cnt;
/* Draw bar */
length = 20 * level / 255;
for (j=0; j<length; ++j)
meter[j] = '#';
for (; j<20; ++j)
meter[j] = ' ';
meter[20] = '\0';
printf("Port #%02d %cx level: [%s] %d \r",
slot, dir, meter, level);
/* Next.. */
samp_cnt = 0;
level = 0;
pj_thread_sleep(SLEEP);
}
puts("");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -