/* API: Initialize the audio device parameters with default values for the * specified device. */ PJ_DEF(pj_status_t) pjmedia_aud_dev_default_param(pjmedia_aud_dev_index id, pjmedia_aud_param *param) { pjmedia_aud_dev_factory *f; unsigned index; pj_status_t status; PJ_ASSERT_RETURN(param && id!=PJMEDIA_AUD_INVALID_DEV, PJ_EINVAL); //PJ_ASSERT_RETURN(aud_subsys.pf, PJMEDIA_EAUD_INIT); // DEAN don't assertion if (!aud_subsys.pf) return PJMEDIA_EAUD_INIT; status = lookup_dev(id, &f, &index); if (status != PJ_SUCCESS) return status; status = f->op->default_param(f, index, param); if (status != PJ_SUCCESS) return status; /* Normalize device IDs */ make_global_index(f->sys.drv_idx, ¶m->rec_id); make_global_index(f->sys.drv_idx, ¶m->play_id); return PJ_SUCCESS; }
/* API: Initialize the video device parameters with default values for the * specified device. */ PJ_DEF(pj_status_t) pjmedia_vid_dev_default_param(pj_pool_t *pool, pjmedia_vid_dev_index id, pjmedia_vid_dev_param *param) { pjmedia_vid_dev_factory *f; unsigned index; pj_status_t status; PJ_ASSERT_RETURN(param, PJ_EINVAL); PJ_ASSERT_RETURN(vid_subsys.pf, PJMEDIA_EVID_INIT); if (id <= PJMEDIA_VID_INVALID_DEV) return PJMEDIA_EVID_INVDEV; status = lookup_dev(id, &f, &index); if (status != PJ_SUCCESS) return status; status = f->op->default_param(pool, f, index, param); if (status != PJ_SUCCESS) return status; /* Normalize device IDs */ make_global_index(f->sys.drv_idx, ¶m->cap_id); make_global_index(f->sys.drv_idx, ¶m->rend_id); return PJ_SUCCESS; }
/* Internal: lookup device id */ static pj_status_t lookup_dev(pjmedia_aud_dev_index id, pjmedia_aud_dev_factory **p_f, unsigned *p_local_index) { int f_id, index; if (id < 0) { unsigned i; if (id == PJMEDIA_AUD_INVALID_DEV) return PJMEDIA_EAUD_INVDEV; for (i=0; i<aud_subsys.drv_cnt; ++i) { struct driver *drv = &aud_subsys.drv[i]; if (drv->dev_idx >= 0) { id = drv->dev_idx; make_global_index(i, &id); break; } else if (id==PJMEDIA_AUD_DEFAULT_CAPTURE_DEV && drv->rec_dev_idx >= 0) { id = drv->rec_dev_idx; make_global_index(i, &id); break; } else if (id==PJMEDIA_AUD_DEFAULT_PLAYBACK_DEV && drv->play_dev_idx >= 0) { id = drv->play_dev_idx; make_global_index(i, &id); break; } } if (id < 0) { return PJMEDIA_EAUD_NODEFDEV; } } f_id = GET_FID(aud_subsys.dev_list[id]); index = GET_INDEX(aud_subsys.dev_list[id]); if (f_id < 0 || f_id >= (int)aud_subsys.drv_cnt) return PJMEDIA_EAUD_INVDEV; if (index < 0 || index >= (int)aud_subsys.drv[f_id].dev_cnt) return PJMEDIA_EAUD_INVDEV; *p_f = aud_subsys.drv[f_id].f; *p_local_index = (unsigned)index; return PJ_SUCCESS; }
/* Internal: lookup device id */ static pj_status_t lookup_dev(pjmedia_vid_dev_index id, pjmedia_vid_dev_factory **p_f, unsigned *p_local_index) { int f_id, index; if (id < 0) { unsigned i; if (id <= PJMEDIA_VID_INVALID_DEV) return PJMEDIA_EVID_INVDEV; for (i=0; i<vid_subsys.drv_cnt; ++i) { pjmedia_vid_driver *drv = &vid_subsys.drv[i]; if (id==PJMEDIA_VID_DEFAULT_CAPTURE_DEV && drv->cap_dev_idx >= 0) { id = drv->cap_dev_idx; make_global_index(i, &id); break; } else if (id==PJMEDIA_VID_DEFAULT_RENDER_DEV && drv->rend_dev_idx >= 0) { id = drv->rend_dev_idx; make_global_index(i, &id); break; } } if (id < 0) { return PJMEDIA_EVID_NODEFDEV; } } f_id = GET_FID(vid_subsys.dev_list[id]); index = GET_INDEX(vid_subsys.dev_list[id]); if (f_id < 0 || f_id >= (int)vid_subsys.drv_cnt) return PJMEDIA_EVID_INVDEV; if (index < 0 || index >= (int)vid_subsys.drv[f_id].dev_cnt) return PJMEDIA_EVID_INVDEV; *p_f = vid_subsys.drv[f_id].f; *p_local_index = (unsigned)index; return PJ_SUCCESS; }
/* API: Get device information. */ PJ_DEF(pj_status_t) pjmedia_vid_dev_get_info(pjmedia_vid_dev_index id, pjmedia_vid_dev_info *info) { pjmedia_vid_dev_factory *f; unsigned index; pj_status_t status; PJ_ASSERT_RETURN(info, PJ_EINVAL); PJ_ASSERT_RETURN(vid_subsys.pf, PJMEDIA_EVID_INIT); if (id <= PJMEDIA_VID_INVALID_DEV) return PJMEDIA_EVID_INVDEV; status = lookup_dev(id, &f, &index); if (status != PJ_SUCCESS) return status; status = f->op->get_dev_info(f, index, info); /* Make sure device ID is the real ID (not PJMEDIA_VID_DEFAULT_*_DEV) */ info->id = index; make_global_index(f->sys.drv_idx, &info->id); return status; }
pjmedia_vid_dev_get_global_index(const pjmedia_vid_dev_factory *f, unsigned local_idx, pjmedia_vid_dev_index *pid) { PJ_ASSERT_RETURN(f->sys.drv_idx >= 0 && f->sys.drv_idx < MAX_DRIVERS, PJ_EINVALIDOP); *pid = local_idx; return make_global_index(f->sys.drv_idx, pid); }
/* API: Get the running parameters for the specified audio stream. */ PJ_DEF(pj_status_t) pjmedia_aud_stream_get_param(pjmedia_aud_stream *strm, pjmedia_aud_param *param) { pj_status_t status; PJ_ASSERT_RETURN(strm && param, PJ_EINVAL); PJ_ASSERT_RETURN(aud_subsys.pf, PJMEDIA_EAUD_INIT); status = strm->op->get_param(strm, param); if (status != PJ_SUCCESS) return status; /* Normalize device id's */ make_global_index(strm->sys.drv_idx, ¶m->rec_id); make_global_index(strm->sys.drv_idx, ¶m->play_id); return PJ_SUCCESS; }
/* API: find device */ PJ_DEF(pj_status_t) pjmedia_aud_dev_lookup( const char *drv_name, const char *dev_name, pjmedia_aud_dev_index *id) { pjmedia_aud_dev_factory *f = NULL; unsigned drv_idx, dev_idx; PJ_ASSERT_RETURN(drv_name && dev_name && id, PJ_EINVAL); //PJ_ASSERT_RETURN(aud_subsys.pf, PJMEDIA_EAUD_INIT); // DEAN don't assertion if (!aud_subsys.pf) return PJMEDIA_EAUD_INIT; for (drv_idx=0; drv_idx<aud_subsys.drv_cnt; ++drv_idx) { if (!pj_ansi_stricmp(drv_name, aud_subsys.drv[drv_idx].name)) { f = aud_subsys.drv[drv_idx].f; break; } } if (!f) { PJ_LOG(4, (THIS_FILE, "pjmedia_aud_dev_lookup() pjmedia_aud_dev_factory not found.")); return PJ_ENOTFOUND; } for (dev_idx=0; dev_idx<aud_subsys.drv[drv_idx].dev_cnt; ++dev_idx) { pjmedia_aud_dev_info info; pj_status_t status; status = f->op->get_dev_info(f, dev_idx, &info); if (status != PJ_SUCCESS) return status; if (!pj_ansi_stricmp(dev_name, info.name)) break; } if (dev_idx==aud_subsys.drv[drv_idx].dev_cnt) { PJ_LOG(4, (THIS_FILE, "pjmedia_aud_dev_lookup() aud_subsys.drv not found.")); return PJ_ENOTFOUND; } *id = dev_idx; make_global_index(drv_idx, id); return PJ_SUCCESS; }
/* API: find device */ PJ_DEF(pj_status_t) pjmedia_vid_dev_lookup( const char *drv_name, const char *dev_name, pjmedia_vid_dev_index *id) { pjmedia_vid_dev_factory *f = NULL; unsigned drv_idx, dev_idx; PJ_ASSERT_RETURN(drv_name && dev_name && id, PJ_EINVAL); PJ_ASSERT_RETURN(vid_subsys.pf, PJMEDIA_EVID_INIT); for (drv_idx=0; drv_idx<vid_subsys.drv_cnt; ++drv_idx) { if (!pj_ansi_stricmp(drv_name, vid_subsys.drv[drv_idx].name)) { f = vid_subsys.drv[drv_idx].f; break; } } if (!f) return PJ_ENOTFOUND; for (dev_idx=0; dev_idx<vid_subsys.drv[drv_idx].dev_cnt; ++dev_idx) { pjmedia_vid_dev_info info; pj_status_t status; status = f->op->get_dev_info(f, dev_idx, &info); if (status != PJ_SUCCESS) return status; if (!pj_ansi_stricmp(dev_name, info.name)) break; } if (dev_idx==vid_subsys.drv[drv_idx].dev_cnt) return PJ_ENOTFOUND; *id = dev_idx; make_global_index(drv_idx, id); return PJ_SUCCESS; }