Загрузка данных
Дефолтное создание в самом начале:
PJ_DEF(pj_status_t) pjmedia_conf_create( pj_pool_t *pool_,
unsigned max_ports,
unsigned clock_rate,
unsigned channel_count,
unsigned samples_per_frame,
unsigned bits_per_sample,
unsigned options,
pjmedia_conf **p_conf )
{
pj_pool_t *pool;
pjmedia_conf *conf;
const pj_str_t name = { "Conf", 4 };
pj_status_t status;
PJ_ASSERT_RETURN(samples_per_frame > 0, PJ_EINVAL);
/* Can only accept 16bits per sample, for now.. */
PJ_ASSERT_RETURN(bits_per_sample == 16, PJ_EINVAL);
PJ_LOG(5,(THIS_FILE, "Creating conference bridge with %d ports",
max_ports));
/* Create own pool */
pool = pj_pool_create(pool_->factory, name.ptr, 512, 512, NULL);
if (!pool) {
PJ_PERROR(1, (THIS_FILE, PJ_ENOMEM, "Create failed in alloc"));
return PJ_ENOMEM;
}
/* Create and init conf structure. */
conf = PJ_POOL_ZALLOC_T(pool, pjmedia_conf);
PJ_ASSERT_RETURN(conf, PJ_ENOMEM);
conf->pool = pool;
conf->ports = (struct conf_port**)
pj_pool_zalloc(pool, max_ports*sizeof(void*));
PJ_ASSERT_RETURN(conf->ports, PJ_ENOMEM);
conf->options = options;
conf->max_ports = max_ports;
conf->clock_rate = clock_rate;
conf->channel_count = channel_count;
conf->samples_per_frame = samples_per_frame;
conf->bits_per_sample = bits_per_sample;
printf("%s(%d) clock_rate=%u samples_per_frame=%u\n",__FUNCTION__,__LINE__,conf->clock_rate,conf->samples_per_frame);
/* Create and initialize the master port interface. */
conf->master_port = PJ_POOL_ZALLOC_T(pool, pjmedia_port);
PJ_ASSERT_RETURN(conf->master_port, PJ_ENOMEM);
pjmedia_port_info_init(&conf->master_port->info, &name, SIGNATURE,
clock_rate, channel_count, bits_per_sample,
samples_per_frame);
conf->master_port->port_data.pdata = conf;
conf->master_port->port_data.ldata = 0;
conf->master_port->get_frame = &get_frame;
conf->master_port->put_frame = &put_frame;
conf->master_port->on_destroy = &destroy_port;
/* Create port zero for sound device. */
status = create_sound_port(pool, conf);
if (status != PJ_SUCCESS) {
pjmedia_conf_destroy(conf);
return status;
}
/* Create mutex. */
status = pj_mutex_create_recursive(pool, "conf", &conf->mutex);
if (status != PJ_SUCCESS) {
pjmedia_conf_destroy(conf);
return status;
}
/* If sound device was created, connect sound device to the
* master port.
*/
if (conf->snd_dev_port) {
status = pjmedia_snd_port_connect( conf->snd_dev_port,
conf->master_port );
if (status != PJ_SUCCESS) {
pjmedia_conf_destroy(conf);
return status;
}
}
/* Allocate synchronized operation queues */
conf->op_queue = PJ_POOL_ZALLOC_T(pool, op_entry);
conf->op_queue_free = PJ_POOL_ZALLOC_T(pool, op_entry);
if (!conf->op_queue || !conf->op_queue_free) {
PJ_PERROR(1, (THIS_FILE, PJ_ENOMEM, "Create failed in create queues"));
pjmedia_conf_destroy(conf);
return PJ_ENOMEM;
}
pj_list_init(conf->op_queue);
pj_list_init(conf->op_queue_free);
/* Done */
*p_conf = conf;
return PJ_SUCCESS;
}
static pj_status_t create_sound_port( pj_pool_t *pool,
pjmedia_conf *conf )
{
struct conf_port *conf_port;
pj_str_t name = { "Master/sound", 12 };
pj_status_t status;
status = create_pasv_port(conf, pool, &name, NULL, &conf_port);
if (status != PJ_SUCCESS)
return status;
/* Create sound device port: */
if ((conf->options & PJMEDIA_CONF_NO_DEVICE) == 0) {
pjmedia_aud_stream *strm;
pjmedia_aud_param param;
/*
* If capture is disabled then create player only port.
* Otherwise create bidirectional sound device port.
*/
if (conf->options & PJMEDIA_CONF_NO_MIC) {
status = pjmedia_snd_port_create_player(pool, -1, conf->clock_rate,
conf->channel_count,
conf->samples_per_frame,
conf->bits_per_sample,
0, /* options */
&conf->snd_dev_port);
} else {
status = pjmedia_snd_port_create( pool, -1, -1, conf->clock_rate,
conf->channel_count,
conf->samples_per_frame,
conf->bits_per_sample,
0, /* Options */
&conf->snd_dev_port);
}
if (status != PJ_SUCCESS)
//TODO: resource leak! Newly created conf_port is leaked here.
return status;
strm = pjmedia_snd_port_get_snd_stream(conf->snd_dev_port);
status = pjmedia_aud_stream_get_param(strm, ¶m);
if (status == PJ_SUCCESS) {
pjmedia_aud_dev_info snd_dev_info;
if (conf->options & PJMEDIA_CONF_NO_MIC)
pjmedia_aud_dev_get_info(param.play_id, &snd_dev_info);
else
pjmedia_aud_dev_get_info(param.rec_id, &snd_dev_info);
pj_strdup2_with_null(pool, &conf_port->name, snd_dev_info.name);
}
PJ_LOG(5,(THIS_FILE, "Sound device successfully created for port 0"));
}
printf("%s(%d) clock_rate=%u channel_count=%u samples_per_frame=%u\n",__FUNCTION__,__LINE__,conf_port->clock_rate,conf_port->channel_count,conf_port->samples_per_frame);
/* Add the port to the bridge */
conf->ports[0] = conf_port;
conf->port_cnt++;
return PJ_SUCCESS;
}
static pj_status_t create_pasv_port( pjmedia_conf *conf,
pj_pool_t *pool,
const pj_str_t *name,
pjmedia_port *port,
struct conf_port **p_conf_port)
{
struct conf_port *conf_port;
pj_status_t status;
unsigned ptime;
/* Create port */
status = create_conf_port(pool, conf, port, name, &conf_port);
if (status != PJ_SUCCESS)
return status;
//TODO: potential bug! Is this intended? delay_buf is created in
//a different pool than conf_port. need poll = conf_port->pool?
printf("%s(%d) clock_rate=%u samples_per_frame=%u\n",__FUNCTION__,__LINE__,conf->clock_rate,conf->samples_per_frame);
/* Passive port has delay buf. */
ptime = conf->samples_per_frame * 1000 / conf->clock_rate /
conf->channel_count;
status = pjmedia_delay_buf_create(pool, name->ptr,
conf->clock_rate,
conf->samples_per_frame,
conf->channel_count,
RX_BUF_COUNT * ptime, /* max delay */
0, /* options */
&conf_port->delay_buf);
if (status != PJ_SUCCESS)
//TODO: resource leak! Newly created conf_port is leaked here.
return status;
*p_conf_port = conf_port;
return PJ_SUCCESS;
}
Здесь надо пересоздать всё с полученным от кодека sample_rate, ничего не убивая. По умолчанию стоит 16kHz, надо пересоздать на 8Khz(sample_rate полученного кодека PCMU).
Логи:
pjmedia_conf_create
create_conf_port(455) port=0
create_conf_port(533) conf_port(IN):
clock_rate=16000 channel_count=1 samples_per_frame=320
create_conf_port(535) conf(OUT):
clock_rate=16000 channel_count=1 samples_per_frame=320
create_pasv_port(663) clock_rate=16000 samples_per_frame=320
create_sound_port(745) clock_rate=16000 channel_count=1 samples_per_frame=320