Browse Source

linux-pulseaudio: Get correct default device

Closes jp9000/obs-studio#1030
Alexandre Vicenzi 8 years ago
parent
commit
b1ada2f975
1 changed files with 45 additions and 57 deletions
  1. 45 57
      plugins/linux-pulseaudio/pulse-input.c

+ 45 - 57
plugins/linux-pulseaudio/pulse-input.c

@@ -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
 };