linux-pulseaudio: Get correct default device
Closes jp9000/obs-studio#1030
This commit is contained in:
committed by
jp9000
parent
2c58185af3
commit
b1ada2f975
@@ -33,6 +33,7 @@ struct pulse_data {
|
||||
|
||||
/* user settings */
|
||||
char *device;
|
||||
bool input;
|
||||
|
||||
/* server info */
|
||||
enum speaker_layout speakers;
|
||||
@@ -164,11 +165,30 @@ static void pulse_server_info(pa_context *c, const pa_server_info *i,
|
||||
void *userdata)
|
||||
{
|
||||
UNUSED_PARAMETER(c);
|
||||
UNUSED_PARAMETER(userdata);
|
||||
PULSE_DATA(userdata);
|
||||
|
||||
blog(LOG_INFO, "Server name: '%s %s'",
|
||||
i->server_name, i->server_version);
|
||||
|
||||
if (data->device && strcmp("default", data->device) == 0) {
|
||||
if (data->input) {
|
||||
bfree(data->device);
|
||||
data->device = bstrdup(i->default_source_name);
|
||||
|
||||
blog(LOG_DEBUG, "Default input device: '%s'", data->device);
|
||||
} else {
|
||||
char *monitor = bzalloc(strlen(i->default_sink_name) + 9);
|
||||
strcat(monitor, i->default_sink_name);
|
||||
strcat(monitor, ".monitor");
|
||||
|
||||
bfree(data->device);
|
||||
data->device = bstrdup(monitor);
|
||||
|
||||
blog(LOG_DEBUG, "Default output device: '%s'", data->device);
|
||||
bfree(monitor);
|
||||
}
|
||||
}
|
||||
|
||||
pulse_signal(0);
|
||||
}
|
||||
|
||||
@@ -374,6 +394,12 @@ static obs_properties_t *pulse_properties(bool input)
|
||||
pulse_get_sink_info_list(pulse_output_info, (void *) devices);
|
||||
pulse_unref();
|
||||
|
||||
size_t count = obs_property_list_item_count(devices);
|
||||
|
||||
if (count > 0)
|
||||
obs_property_list_insert_string(devices, 0,
|
||||
obs_module_text("Default"), "default");
|
||||
|
||||
return props;
|
||||
}
|
||||
|
||||
@@ -391,61 +417,12 @@ static obs_properties_t *pulse_output_properties(void *unused)
|
||||
return pulse_properties(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Server info callback
|
||||
*/
|
||||
static void pulse_input_device(pa_context *c, const pa_server_info *i,
|
||||
void *userdata)
|
||||
{
|
||||
UNUSED_PARAMETER(c);
|
||||
obs_data_t *settings = (obs_data_t*) userdata;
|
||||
|
||||
obs_data_set_default_string(settings, "device_id",
|
||||
i->default_source_name);
|
||||
blog(LOG_DEBUG, "Default input device: '%s'", i->default_source_name);
|
||||
|
||||
pulse_signal(0);
|
||||
}
|
||||
|
||||
static void pulse_output_device(pa_context *c, const pa_server_info *i,
|
||||
void *userdata)
|
||||
{
|
||||
UNUSED_PARAMETER(c);
|
||||
obs_data_t *settings = (obs_data_t*) userdata;
|
||||
|
||||
char *monitor = bzalloc(strlen(i->default_sink_name) + 9);
|
||||
strcat(monitor, i->default_sink_name);
|
||||
strcat(monitor, ".monitor");
|
||||
|
||||
obs_data_set_default_string(settings, "device_id", monitor);
|
||||
blog(LOG_DEBUG, "Default output device: '%s'", monitor);
|
||||
bfree(monitor);
|
||||
|
||||
pulse_signal(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get plugin defaults
|
||||
*/
|
||||
static void pulse_defaults(obs_data_t *settings, bool input)
|
||||
static void pulse_defaults(obs_data_t *settings)
|
||||
{
|
||||
pulse_init();
|
||||
|
||||
pa_server_info_cb_t cb = (input)
|
||||
? pulse_input_device : pulse_output_device;
|
||||
pulse_get_server_info(cb, (void *) settings);
|
||||
|
||||
pulse_unref();
|
||||
}
|
||||
|
||||
static void pulse_input_defaults(obs_data_t *settings)
|
||||
{
|
||||
return pulse_defaults(settings, true);
|
||||
}
|
||||
|
||||
static void pulse_output_defaults(obs_data_t *settings)
|
||||
{
|
||||
return pulse_defaults(settings, false);
|
||||
obs_data_set_default_string(settings, "device_id", "default");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -510,10 +487,11 @@ static void pulse_update(void *vptr, obs_data_t *settings)
|
||||
/**
|
||||
* Create the plugin object
|
||||
*/
|
||||
static void *pulse_create(obs_data_t *settings, obs_source_t *source)
|
||||
static void *pulse_create(obs_data_t *settings, obs_source_t *source, bool input)
|
||||
{
|
||||
struct pulse_data *data = bzalloc(sizeof(struct pulse_data));
|
||||
|
||||
data->input = input;
|
||||
data->source = source;
|
||||
|
||||
pulse_init();
|
||||
@@ -522,16 +500,26 @@ static void *pulse_create(obs_data_t *settings, obs_source_t *source)
|
||||
return data;
|
||||
}
|
||||
|
||||
static void *pulse_input_create(obs_data_t *settings, obs_source_t *source)
|
||||
{
|
||||
return pulse_create(settings, source, true);
|
||||
}
|
||||
|
||||
static void *pulse_output_create(obs_data_t *settings, obs_source_t *source)
|
||||
{
|
||||
return pulse_create(settings, source, false);
|
||||
}
|
||||
|
||||
struct obs_source_info pulse_input_capture = {
|
||||
.id = "pulse_input_capture",
|
||||
.type = OBS_SOURCE_TYPE_INPUT,
|
||||
.output_flags = OBS_SOURCE_AUDIO |
|
||||
OBS_SOURCE_DO_NOT_DUPLICATE,
|
||||
.get_name = pulse_input_getname,
|
||||
.create = pulse_create,
|
||||
.create = pulse_input_create,
|
||||
.destroy = pulse_destroy,
|
||||
.update = pulse_update,
|
||||
.get_defaults = pulse_input_defaults,
|
||||
.get_defaults = pulse_defaults,
|
||||
.get_properties = pulse_input_properties
|
||||
};
|
||||
|
||||
@@ -542,9 +530,9 @@ struct obs_source_info pulse_output_capture = {
|
||||
OBS_SOURCE_DO_NOT_DUPLICATE |
|
||||
OBS_SOURCE_DO_NOT_SELF_MONITOR,
|
||||
.get_name = pulse_output_getname,
|
||||
.create = pulse_create,
|
||||
.create = pulse_output_create,
|
||||
.destroy = pulse_destroy,
|
||||
.update = pulse_update,
|
||||
.get_defaults = pulse_output_defaults,
|
||||
.get_defaults = pulse_defaults,
|
||||
.get_properties = pulse_output_properties
|
||||
};
|
||||
|
Reference in New Issue
Block a user