Пример #1
0
/**
 * Deinitialize media endpoint.
 */
PJ_DEF(pj_status_t) pjmedia_endpt_destroy (pjmedia_endpt *endpt)
{
    exit_cb *ecb;

    pjmedia_endpt_stop_threads(endpt);

    /* Destroy internal ioqueue */
    if (endpt->ioqueue && endpt->own_ioqueue) {
        pj_ioqueue_destroy(endpt->ioqueue);
        endpt->ioqueue = NULL;
    }

    endpt->pf = NULL;

    pjmedia_codec_mgr_destroy(&endpt->codec_mgr);
    pjmedia_aud_subsys_shutdown();

    /* Call all registered exit callbacks */
    ecb = endpt->exit_cb_list.next;
    while (ecb != &endpt->exit_cb_list) {
        (*ecb->func)(endpt);
        ecb = ecb->next;
    }

    pj_pool_release (endpt->pool);

    return PJ_SUCCESS;
}
Пример #2
0
/**
* Deinitialize media endpoint.
*/
PJ_DEF(pj_status_t) pjmedia_endpt_destroy (pjmedia_endpt *endpt)
{
	exit_cb *ecb;
	unsigned i;

	PJ_ASSERT_RETURN(endpt, PJ_EINVAL);

	endpt->quit_flag = 1;

	/* Destroy threads */
	for (i=0; i<endpt->thread_cnt; ++i) {
		if (endpt->thread[i]) {
			pj_thread_join(endpt->thread[i]);
			pj_thread_destroy(endpt->thread[i]);
			endpt->thread[i] = NULL;
		}
	}

	/* Destroy internal ioqueue */
	if (endpt->ioqueue && endpt->own_ioqueue) {
		pj_ioqueue_destroy(endpt->ioqueue);
		endpt->ioqueue = NULL;
	}

	endpt->pf = NULL;

	pjmedia_codec_mgr_destroy(&endpt->codec_mgr);
	pjmedia_aud_subsys_shutdown();

	/* Call all registered exit callbacks */
	ecb = endpt->exit_cb_list.next;
	while (ecb != &endpt->exit_cb_list) {
		(*ecb->func)(endpt);
		ecb = ecb->next;
	}

	pj_pool_release (endpt->pool);

	return PJ_SUCCESS;
}
Пример #3
0
/**
* Initialize and get the instance of media endpoint.
*/
PJ_DEF(pj_status_t) pjmedia_endpt_create(pj_pool_factory *pf,
																				 pj_ioqueue_t *ioqueue,
																				 unsigned worker_cnt,
																				 pjmedia_endpt **p_endpt)
{
	pj_pool_t *pool;
	pjmedia_endpt *endpt;
	unsigned i;
	pj_status_t status;

	status = pj_register_strerror(PJMEDIA_ERRNO_START, PJ_ERRNO_SPACE_SIZE,
		&pjmedia_strerror);
	pj_assert(status == PJ_SUCCESS);

	PJ_ASSERT_RETURN(pf && p_endpt, PJ_EINVAL);
	PJ_ASSERT_RETURN(worker_cnt <= MAX_THREADS, PJ_EINVAL);

	pool = pj_pool_create(pf, "med-ept", 512, 512, NULL);
	if (!pool)
		return PJ_ENOMEM;

	endpt = PJ_POOL_ZALLOC_T(pool, struct pjmedia_endpt);
	endpt->pool = pool;
	endpt->pf = pf;
	endpt->ioqueue = ioqueue;
	endpt->thread_cnt = worker_cnt;
	//endpt->has_telephone_event = PJ_TRUE;
	endpt->has_telephone_event = PJ_FALSE; // POPOV: remove telephone event temporary

	/* Sound */
	status = pjmedia_aud_subsys_init(pf);
	if (status != PJ_SUCCESS)
		goto on_error;

	/* Init codec manager. */
	status = pjmedia_codec_mgr_init(&endpt->codec_mgr, endpt->pf);
	if (status != PJ_SUCCESS)
		goto on_error;

	/* Initialize exit callback list. */
	pj_list_init(&endpt->exit_cb_list);

	/* Create ioqueue if none is specified. */
	if (endpt->ioqueue == NULL) {

		endpt->own_ioqueue = PJ_TRUE;

		status = pj_ioqueue_create( endpt->pool, PJ_IOQUEUE_MAX_HANDLES,
			&endpt->ioqueue);
		if (status != PJ_SUCCESS)
			goto on_error;

		if (worker_cnt == 0) {
			PJ_LOG(4,(THIS_FILE, "Warning: no worker thread is created in"  
				"media endpoint for internal ioqueue"));
		}
	}

	/* Create worker threads if asked. */
	for (i=0; i<worker_cnt; ++i) {
		status = pj_thread_create( endpt->pool, "media", &worker_proc,
			endpt, 0, 0, &endpt->thread[i]);
		if (status != PJ_SUCCESS)
			goto on_error;
	}


	*p_endpt = endpt;
	return PJ_SUCCESS;

on_error:

	/* Destroy threads */
	for (i=0; i<endpt->thread_cnt; ++i) {
		if (endpt->thread[i]) {
			pj_thread_destroy(endpt->thread[i]);
		}
	}

	/* Destroy internal ioqueue */
	if (endpt->ioqueue && endpt->own_ioqueue)
		pj_ioqueue_destroy(endpt->ioqueue);

	pjmedia_codec_mgr_destroy(&endpt->codec_mgr);
	pjmedia_aud_subsys_shutdown();
	pj_pool_release(pool);
	return status;
}