提交 7d6bf872 编写于 作者: M Michael Hoang 提交者: jp9000

linux-alsa: Add ability to specify a custom PCM

Closes jp9000/obs-studio#599
上级 108a4aa4
......@@ -64,6 +64,8 @@ struct alsa_data {
};
static const char * alsa_get_name(void *);
static bool alsa_devices_changed(obs_properties_t *props,
obs_property_t *p, obs_data_t *settings);
static obs_properties_t * alsa_get_properties(void *);
static void * alsa_create(obs_data_t *, obs_source_t *);
static void alsa_destroy(void *);
......@@ -119,7 +121,12 @@ void * alsa_create(obs_data_t *settings, obs_source_t *source)
data->listen_thread = 0;
data->reopen_thread = 0;
data->device = bstrdup(obs_data_get_string(settings, "device_id"));
const char *device = obs_data_get_string(settings, "device_id");
if (strcmp(device, "__custom__") == 0)
device = obs_data_get_string(settings, "custom_pcm");
data->device = bstrdup(device);
data->rate = obs_data_get_int(settings, "rate");
if (os_event_init(&data->abort_event, OS_EVENT_TYPE_MANUAL) != 0) {
......@@ -179,6 +186,10 @@ void alsa_update(void *vptr, obs_data_t *settings)
bool reset = false;
device = obs_data_get_string(settings, "device_id");
if (strcmp(device, "__custom__") == 0)
device = obs_data_get_string(settings, "custom_pcm");
if (strcmp(data->device, device) != 0) {
bfree(data->device);
data->device = bstrdup(device);
......@@ -215,9 +226,28 @@ const char * alsa_get_name(void *unused)
void alsa_get_defaults(obs_data_t *settings)
{
obs_data_set_default_string(settings, "device_id", "default");
obs_data_set_default_string(settings, "custom_pcm", "default");
obs_data_set_default_int(settings, "rate", 44100);
}
static bool alsa_devices_changed(obs_properties_t *props,
obs_property_t *p, obs_data_t *settings)
{
UNUSED_PARAMETER(p);
bool visible = false;
const char *device_id = obs_data_get_string(settings, "device_id");
if (strcmp(device_id, "__custom__") == 0)
visible = true;
obs_property_t *custom_pcm = obs_properties_get(props, "custom_pcm");
obs_property_set_visible(custom_pcm, visible);
obs_property_modified(custom_pcm, settings);
return true;
}
obs_properties_t * alsa_get_properties(void *unused)
{
void **hints;
......@@ -240,10 +270,15 @@ obs_properties_t * alsa_get_properties(void *unused)
obs_property_list_add_string(devices, "Default", "default");
obs_properties_add_text(props, "custom_pcm",
obs_module_text("PCM"), OBS_TEXT_DEFAULT);
rate = obs_properties_add_list(props, "rate",
obs_module_text("Rate"), OBS_COMBO_TYPE_LIST,
OBS_COMBO_FORMAT_INT);
obs_property_set_modified_callback(devices, alsa_devices_changed);
obs_property_list_add_int(rate, "32000 Hz", 32000);
obs_property_list_add_int(rate, "44100 Hz", 44100);
obs_property_list_add_int(rate, "48000 Hz", 48000);
......@@ -277,6 +312,8 @@ obs_properties_t * alsa_get_properties(void *unused)
obs_property_list_add_string(devices, descr, name);
obs_property_list_add_string(devices, "Custom", "__custom__");
next:
if (name != NULL)
free(name), name = NULL;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册