pjmedia_vid_register_factory(pjmedia_vid_dev_factory_create_func_ptr adf, pjmedia_vid_dev_factory *factory) { pj_bool_t refresh = PJ_FALSE; pj_status_t status; if (vid_subsys.init_count == 0) return PJMEDIA_EVID_INIT; vid_subsys.drv[vid_subsys.drv_cnt].create = adf; vid_subsys.drv[vid_subsys.drv_cnt].f = factory; if (factory) { /* Call factory->init() */ status = factory->op->init(factory); if (status != PJ_SUCCESS) { factory->op->destroy(factory); return status; } refresh = PJ_TRUE; } status = init_driver(vid_subsys.drv_cnt, refresh); if (status == PJ_SUCCESS) { vid_subsys.drv_cnt++; } else { deinit_driver(vid_subsys.drv_cnt); } return status; }
pjmedia_vid_unregister_factory(pjmedia_vid_dev_factory_create_func_ptr adf, pjmedia_vid_dev_factory *factory) { unsigned i, j; if (vid_subsys.init_count == 0) return PJMEDIA_EVID_INIT; for (i=0; i<vid_subsys.drv_cnt; ++i) { struct driver *drv = &vid_subsys.drv[i]; if ((factory && drv->f==factory) || (adf && drv->create == adf)) { for (j = drv->start_idx; j < drv->start_idx + drv->dev_cnt; j++) { vid_subsys.dev_list[j] = (pj_uint32_t)PJMEDIA_VID_INVALID_DEV; } deinit_driver(i); pj_bzero(drv, sizeof(*drv)); return PJ_SUCCESS; } } return PJMEDIA_EVID_ERR; }
/* API: Initialize the video device subsystem. */ PJ_DEF(pj_status_t) pjmedia_vid_dev_subsys_init(pj_pool_factory *pf) { unsigned i; pj_status_t status = PJ_SUCCESS; /* Allow init() to be called multiple times as long as there is matching * number of shutdown(). */ if (vid_subsys.init_count++ != 0) { return PJ_SUCCESS; } /* Register error subsystem */ pj_register_strerror(PJMEDIA_VIDEODEV_ERRNO_START, PJ_ERRNO_SPACE_SIZE, &pjmedia_videodev_strerror); /* Init */ vid_subsys.pf = pf; vid_subsys.drv_cnt = 0; vid_subsys.dev_cnt = 0; /* Register creation functions */ #if PJMEDIA_VIDEO_DEV_HAS_ANDROID_CAPTURE vid_subsys.drv[vid_subsys.drv_cnt++].create = &pjmedia_android_cam_factory; #endif #if PJMEDIA_VIDEO_DEV_HAS_V4L2 vid_subsys.drv[vid_subsys.drv_cnt++].create = &pjmedia_v4l2_factory; #endif #if PJMEDIA_VIDEO_DEV_HAS_QT vid_subsys.drv[vid_subsys.drv_cnt++].create = &pjmedia_qt_factory; #endif #if PJMEDIA_VIDEO_DEV_HAS_IOS vid_subsys.drv[vid_subsys.drv_cnt++].create = &pjmedia_ios_factory; #endif #if PJMEDIA_VIDEO_DEV_HAS_DSHOW vid_subsys.drv[vid_subsys.drv_cnt++].create = &pjmedia_dshow_factory; #endif #if PJMEDIA_VIDEO_DEV_HAS_FFMPEG vid_subsys.drv[vid_subsys.drv_cnt++].create = &pjmedia_ffmpeg_factory; #endif #if PJMEDIA_VIDEO_DEV_HAS_CBAR_SRC vid_subsys.drv[vid_subsys.drv_cnt++].create = &pjmedia_cbar_factory; #endif #if PJMEDIA_VIDEO_DEV_HAS_SDL vid_subsys.drv[vid_subsys.drv_cnt++].create = &pjmedia_sdl_factory; #endif /* Initialize each factory and build the device ID list */ for (i=0; i<vid_subsys.drv_cnt; ++i) { status = init_driver(i, PJ_FALSE); if (status != PJ_SUCCESS) { deinit_driver(i); continue; } } return vid_subsys.dev_cnt ? PJ_SUCCESS : status; }
/* API: Initialize the audio subsystem. */ PJ_DEF(pj_status_t) pjmedia_aud_subsys_init(pj_pool_factory *pf) { unsigned i; pj_status_t status = PJ_SUCCESS; /* Allow init() to be called multiple times as long as there is matching * number of shutdown(). */ if (aud_subsys.init_count++ != 0) { return PJ_SUCCESS; } /* Register error subsystem */ pj_register_strerror(PJMEDIA_AUDIODEV_ERRNO_START, PJ_ERRNO_SPACE_SIZE, &pjmedia_audiodev_strerror); /* Init */ aud_subsys.pf = pf; aud_subsys.drv_cnt = 0; aud_subsys.dev_cnt = 0; /* Register creation functions */ #if PJMEDIA_AUDIO_DEV_HAS_PORTAUDIO aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_pa_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_WMME aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_wmme_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_SYMB_VAS aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_symb_vas_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_SYMB_APS aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_aps_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_SYMB_MDA aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_symb_mda_factory; #endif /* Initialize each factory and build the device ID list */ for (i=0; i<aud_subsys.drv_cnt; ++i) { status = init_driver(i); if (status != PJ_SUCCESS) { deinit_driver(i); continue; } } return aud_subsys.dev_cnt ? PJ_SUCCESS : status; }
pjmedia_vid_register_factory(pjmedia_vid_dev_factory_create_func_ptr adf) { pj_status_t status; if (vid_subsys.init_count == 0) return PJMEDIA_EVID_INIT; vid_subsys.drv[vid_subsys.drv_cnt].create = adf; status = init_driver(vid_subsys.drv_cnt, PJ_FALSE); if (status == PJ_SUCCESS) { vid_subsys.drv_cnt++; } else { deinit_driver(vid_subsys.drv_cnt); } return status; }
/* API: Shutdown the audio subsystem. */ PJ_DEF(pj_status_t) pjmedia_aud_subsys_shutdown(void) { unsigned i; /* Allow shutdown() to be called multiple times as long as there is matching * number of init(). */ if (aud_subsys.init_count == 0) { return PJ_SUCCESS; } --aud_subsys.init_count; for (i=0; i<aud_subsys.drv_cnt; ++i) { deinit_driver(i); } aud_subsys.pf = NULL; return PJ_SUCCESS; }
pjmedia_aud_unregister_factory(pjmedia_aud_dev_factory_create_func_ptr adf) { unsigned i, j; if (aud_subsys.init_count == 0) return PJMEDIA_EAUD_INIT; for (i=0; i<aud_subsys.drv_cnt; ++i) { struct driver *drv = &aud_subsys.drv[i]; if (drv->create == adf) { for (j = drv->start_idx; j < drv->start_idx + drv->dev_cnt; j++) { aud_subsys.dev_list[j] = (pj_uint32_t)PJMEDIA_AUD_INVALID_DEV; } deinit_driver(i); return PJ_SUCCESS; } } return PJMEDIA_EAUD_ERR; }
/* API: Shutdown the audio subsystem. */ PJ_DEF(pj_status_t) pjmedia_aud_subsys_shutdown(void) { unsigned i; /* Allow shutdown() to be called multiple times as long as there is matching * number of init(). */ if (aud_subsys.init_count == 0) { return PJ_SUCCESS; } --aud_subsys.init_count; if (aud_subsys.init_count == 0) { for (i=0; i<aud_subsys.drv_cnt; ++i) { deinit_driver(i); } pj_mutex_destroy(aud_subsys.dev_observer.lock); pj_pool_release(aud_subsys.dev_observer.pool); aud_subsys.pf = NULL; } return PJ_SUCCESS; }
/* API: Initialize the audio subsystem. */ PJ_DEF(pj_status_t) pjmedia_aud_subsys_init(pj_pool_factory *pf) { unsigned i; pj_status_t status; /* Allow init() to be called multiple times as long as there is matching * number of shutdown(). */ if (aud_subsys.init_count++ != 0) { return PJ_SUCCESS; } /* Register error subsystem */ status = pj_register_strerror(PJMEDIA_AUDIODEV_ERRNO_START, PJ_ERRNO_SPACE_SIZE, &pjmedia_audiodev_strerror); pj_assert(status == PJ_SUCCESS); /* Init */ aud_subsys.pf = pf; aud_subsys.drv_cnt = 0; aud_subsys.dev_cnt = 0; /* Register creation functions */ #if PJMEDIA_AUDIO_DEV_HAS_OPENSL aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_opensl_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_ANDROID_JNI aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_android_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_BB10 aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_bb10_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_ALSA aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_alsa_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_COREAUDIO aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_coreaudio_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_WMME aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_wmme_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_BDIMAD aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_bdimad_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_SYMB_VAS aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_symb_vas_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_SYMB_APS aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_aps_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_SYMB_MDA aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_symb_mda_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_NULL_AUDIO aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_null_audio_factory; #endif /* Initialize audio device observer objects */ pj_status_t st; aud_subsys.dev_observer.pool = pj_pool_create(pf, "aud_dev_observer_pool", 512, 512, NULL); if (!aud_subsys.dev_observer.pool) { return PJ_ENOMEM; } st = pj_mutex_create_simple(aud_subsys.dev_observer.pool, "aud_dev_observer_lock", &aud_subsys.dev_observer.lock); if (st != PJ_SUCCESS) { return st; } aud_subsys.dev_observer.cb = NULL; /* Initialize each factory and build the device ID list */ for (i=0; i<aud_subsys.drv_cnt; ++i) { status = init_driver(i, PJ_FALSE); if (status != PJ_SUCCESS) { deinit_driver(i); continue; } } return aud_subsys.dev_cnt ? PJ_SUCCESS : status; }