/* * API: set capability * Currently just supporting toggle between speaker and earpiece */ static pj_status_t bb10_stream_set_cap(pjmedia_aud_stream *strm, pjmedia_aud_dev_cap cap, const void *value) { struct bb10_stream *stream = (struct bb10_stream*)strm; if (cap==PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE && (stream->param.dir & PJMEDIA_DIR_PLAYBACK)) { pjmedia_aud_dev_route route; pj_bool_t need_restart; pj_status_t ret; PJ_ASSERT_RETURN(value, PJ_EINVAL); /* OS 10.2.1 requires pausing audio stream */ need_restart = (stream->pb_thread != NULL); if (need_restart) { PJ_LOG(4,(THIS_FILE, "pausing audio stream..")); ret = bb10_stream_stop(strm); if (ret != PJ_SUCCESS) { PJ_PERROR(1,(THIS_FILE, ret, "Error pausing stream")); return ret; } } route = *((pjmedia_aud_dev_route*)value); PJ_LOG(4,(THIS_FILE, "setting audio route to %d..", route)); /* Use the initialization function which lazy-inits the * handle for routing */ if (route == PJMEDIA_AUD_DEV_ROUTE_LOUDSPEAKER) { ret = bb10_initialize_playback_ctrl(stream,true); } else { ret = bb10_initialize_playback_ctrl(stream,false); } if (need_restart) { PJ_LOG(4,(THIS_FILE, "resuming audio stream..")); ret = bb10_stream_start(strm); if (ret != PJ_SUCCESS) { PJ_PERROR(1,(THIS_FILE, ret, "Error resuming stream")); } } return ret; } else if (cap==PJMEDIA_AUD_DEV_CAP_EC && (stream->param.dir & PJMEDIA_DIR_CAPTURE)) { /* EC is always enabled. Silently ignore the request */ return PJ_SUCCESS; } TRACE_((THIS_FILE,"bb10_stream_set_cap() = PJMEDIA_EAUD_INVCAP")); return PJMEDIA_EAUD_INVCAP; }
static pj_status_t bb10_stream_destroy (pjmedia_aud_stream *s) { struct bb10_stream *stream = (struct bb10_stream*)s; TRACE_((THIS_FILE,"bb10_stream_destroy()")); bb10_stream_stop (s); pj_pool_release (stream->pool); return PJ_SUCCESS; }