OSB-WASAPI插件obs_module_load函数
2024-03-21
29
0
obs_module_load是OBS插件模块必须实现的函数,其对应于结构体obs_module中load函数指针:
bool (*load)(void); //函数名必须为obs_module_load
WASAPI的插件函数代码如下:
bool obs_module_load(void)
{
/* MS says 20348, but process filtering seems to work earlier */
struct win_version_info ver;
get_win_ver(&ver);
struct win_version_info minimum;
minimum.major = 10;
minimum.minor = 0;
minimum.build = 19041;
minimum.revis = 0;
const bool process_filter_supported = win_version_compare(&ver, &minimum) >= 0;
RegisterWASAPIInput();
RegisterWASAPIDeviceOutput();
if (process_filter_supported)
RegisterWASAPIProcessOutput();
notify = new WASAPINotify();
notify->AddDefaultDeviceChangedCallback(obs_current_module(), default_device_changed_callback);
return true;
}
第一部分是获取系统的版本号,用于判断是否支持process_filter,关于这个特性,本人也暂未研究。反正就是WIN10新系统中的一个新特性。
第二部分是使用RegisterWASAPIInput函数注册OBS源,这是音频的CAPTURE类型,即麦克风。
void RegisterWASAPIInput()
{
obs_source_info info = {};
info.id = "wasapi_input_capture";
info.type = OBS_SOURCE_TYPE_INPUT;
info.output_flags = OBS_SOURCE_AUDIO | OBS_SOURCE_DO_NOT_DUPLICATE;
info.get_name = GetWASAPIInputName;
info.create = CreateWASAPIInput;
info.destroy = DestroyWASAPISource;
info.update = UpdateWASAPISource;
info.activate = ActivateWASAPISource;
info.deactivate = DeactivateWASAPISource;
info.get_defaults = GetWASAPIDefaultsInput;
info.get_properties = GetWASAPIPropertiesInput;
info.icon_type = OBS_ICON_TYPE_AUDIO_INPUT;
obs_register_source(&info);
}
OBS源其实是一个结构体,也可认为是一个对象,该对象有一些属性和相关的回调函数。
属性如id,类型之类,函数为OBS应用使用时,需要支持的一些回调函数。
第三部分是使用RegisterWASAPIDeviceOutput注册设备输出,即扬声器。
void RegisterWASAPIDeviceOutput()
{
obs_source_info info = {};
info.id = "wasapi_output_capture";
info.type = OBS_SOURCE_TYPE_INPUT;
info.output_flags = OBS_SOURCE_AUDIO | OBS_SOURCE_DO_NOT_DUPLICATE |
OBS_SOURCE_DO_NOT_SELF_MONITOR;
info.get_name = GetWASAPIDeviceOutputName;
info.create = CreateWASAPIDeviceOutput;
info.destroy = DestroyWASAPISource;
info.update = UpdateWASAPISource;
info.activate = ActivateWASAPISource;
info.deactivate = DeactivateWASAPISource;
info.get_defaults = GetWASAPIDefaultsDeviceOutput;
info.get_properties = GetWASAPIPropertiesDeviceOutput;
info.icon_type = OBS_ICON_TYPE_AUDIO_OUTPUT;
obs_register_source(&info);
}
第四部分是如果支持process filtering,则注册相应的OBS源:
void RegisterWASAPIProcessOutput()
{
obs_source_info info = {};
info.id = "wasapi_process_output_capture";
info.type = OBS_SOURCE_TYPE_INPUT;
info.output_flags = OBS_SOURCE_AUDIO | OBS_SOURCE_DO_NOT_DUPLICATE |
OBS_SOURCE_DO_NOT_SELF_MONITOR;
info.get_name = GetWASAPIProcessOutputName;
info.create = CreateWASAPIProcessOutput;
info.destroy = DestroyWASAPISource;
info.update = UpdateWASAPISource;
info.activate = ActivateWASAPISource;
info.deactivate = DeactivateWASAPISource;
info.get_defaults = GetWASAPIDefaultsProcessOutput;
info.get_properties = GetWASAPIPropertiesProcessOutput;
info.icon_type = OBS_ICON_TYPE_PROCESS_AUDIO_OUTPUT;
obs_register_source(&info);
}
最后是当音频设备发生变化时,注册回调通知设备发生变化。比如某个麦克风插入电脑了,从电脑中移除了之类。
notify = new WASAPINotify();
notify->AddDefaultDeviceChangedCallback(obs_current_module(), default_device_changed_callback);