/* API: create stream */ static pj_status_t bb10_factory_create_stream(pjmedia_aud_dev_factory *f, const pjmedia_aud_param *param, pjmedia_aud_rec_cb rec_cb, pjmedia_aud_play_cb play_cb, void *user_data, pjmedia_aud_stream **p_strm) { struct bb10_factory *af = (struct bb10_factory*)f; pj_status_t status; pj_pool_t* pool; struct bb10_stream* stream; pool = pj_pool_create (af->pf, "bb10%p", 1024, 1024, NULL); if (!pool) return PJ_ENOMEM; /* Allocate and initialize comon stream data */ stream = PJ_POOL_ZALLOC_T (pool, struct bb10_stream); stream->base.op = &bb10_stream_op; stream->pool = pool; stream->af = af; stream->user_data = user_data; stream->pb_cb = play_cb; stream->ca_cb = rec_cb; stream->quit = 0; pj_memcpy(&stream->param, param, sizeof(*param)); /* Init playback */ if (param->dir & PJMEDIA_DIR_PLAYBACK) { status = bb10_open_playback (stream, param); if (status != PJ_SUCCESS) { pj_pool_release (pool); return status; } } /* Init capture */ if (param->dir & PJMEDIA_DIR_CAPTURE) { status = bb10_open_capture (stream, param); if (status != PJ_SUCCESS) { if (param->dir & PJMEDIA_DIR_PLAYBACK) { close_play_pcm(stream); } pj_pool_release (pool); return status; } } *p_strm = &stream->base; return PJ_SUCCESS; }
/* API: create stream */ static pj_status_t bb10_factory_create_stream(pjmedia_aud_dev_factory *f, const pjmedia_aud_param *param, pjmedia_aud_rec_cb rec_cb, pjmedia_aud_play_cb play_cb, void *user_data, pjmedia_aud_stream **p_strm) { struct bb10_factory *af = (struct bb10_factory*)f; pj_status_t status; pj_pool_t* pool; struct bb10_stream* stream; pool = pj_pool_create (af->pf, "bb10%p", 1024, 1024, NULL); if (!pool) return PJ_ENOMEM; /* Allocate and initialize comon stream data */ stream = PJ_POOL_ZALLOC_T (pool, struct bb10_stream); stream->base.op = &bb10_stream_op; stream->pool = pool; stream->af = af; stream->user_data = user_data; stream->pb_cb = play_cb; stream->ca_cb = rec_cb; stream->quit = 0; pj_memcpy(&stream->param, param, sizeof(*param)); /* Init playback */ if (param->dir & PJMEDIA_DIR_PLAYBACK) { status = bb10_open_playback (stream, param); if (status != PJ_SUCCESS) { pj_pool_release (pool); return status; } } /* Init capture */ if (param->dir & PJMEDIA_DIR_CAPTURE) { status = bb10_open_capture (stream, param); if (status != PJ_SUCCESS) { if (param->dir & PJMEDIA_DIR_PLAYBACK) { close_play_pcm(stream); } pj_pool_release (pool); return status; } } /* Set the audio routing ONLY if app explicitly asks one */ if ((param->dir & PJMEDIA_DIR_PLAYBACK) && (param->flags & PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE)) { status = bb10_stream_set_cap(&stream->base, PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE, ¶m->output_route); if (status != PJ_SUCCESS) { TRACE_((THIS_FILE, "Error setting output route")); bb10_stream_destroy(&stream->base); return status; } } else { /* Legacy behavior: if none specified, set to speaker */ status = bb10_initialize_playback_ctrl(stream, false); } *p_strm = &stream->base; return PJ_SUCCESS; }