output/pulse: implement methods enable()/disable()
Don't connect to PulseAudio before MPD has daemonized.
This commit is contained in:
		| @@ -53,6 +53,9 @@ pulse_output_set_mixer(struct pulse_output *po, struct pulse_mixer *pm) | |||||||
|  |  | ||||||
| 	po->mixer = pm; | 	po->mixer = pm; | ||||||
|  |  | ||||||
|  | 	if (po->mainloop == NULL) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
| 	pa_threaded_mainloop_lock(po->mainloop); | 	pa_threaded_mainloop_lock(po->mainloop); | ||||||
|  |  | ||||||
| 	if (po->context != NULL && | 	if (po->context != NULL && | ||||||
| @@ -259,7 +262,8 @@ pulse_output_delete_context(struct pulse_output *po) | |||||||
|  |  | ||||||
| static void * | static void * | ||||||
| pulse_output_init(G_GNUC_UNUSED const struct audio_format *audio_format, | pulse_output_init(G_GNUC_UNUSED const struct audio_format *audio_format, | ||||||
| 		  const struct config_param *param, GError **error_r) | 		  const struct config_param *param, | ||||||
|  | 		  G_GNUC_UNUSED GError **error_r) | ||||||
| { | { | ||||||
| 	struct pulse_output *po; | 	struct pulse_output *po; | ||||||
|  |  | ||||||
| @@ -270,6 +274,29 @@ pulse_output_init(G_GNUC_UNUSED const struct audio_format *audio_format, | |||||||
| 	po->server = config_get_block_string(param, "server", NULL); | 	po->server = config_get_block_string(param, "server", NULL); | ||||||
| 	po->sink = config_get_block_string(param, "sink", NULL); | 	po->sink = config_get_block_string(param, "sink", NULL); | ||||||
|  |  | ||||||
|  | 	po->mainloop = NULL; | ||||||
|  | 	po->context = NULL; | ||||||
|  | 	po->stream = NULL; | ||||||
|  |  | ||||||
|  | 	return po; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | pulse_output_finish(void *data) | ||||||
|  | { | ||||||
|  | 	struct pulse_output *po = data; | ||||||
|  |  | ||||||
|  | 	g_free(po); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static bool | ||||||
|  | pulse_output_enable(void *data, GError **error_r) | ||||||
|  | { | ||||||
|  | 	struct pulse_output *po = data; | ||||||
|  |  | ||||||
|  | 	assert(po->mainloop == NULL); | ||||||
|  | 	assert(po->context == NULL); | ||||||
|  |  | ||||||
| 	/* create the libpulse mainloop and start the thread */ | 	/* create the libpulse mainloop and start the thread */ | ||||||
|  |  | ||||||
| 	po->mainloop = pa_threaded_mainloop_new(); | 	po->mainloop = pa_threaded_mainloop_new(); | ||||||
| @@ -278,7 +305,7 @@ pulse_output_init(G_GNUC_UNUSED const struct audio_format *audio_format, | |||||||
|  |  | ||||||
| 		g_set_error(error_r, pulse_output_quark(), 0, | 		g_set_error(error_r, pulse_output_quark(), 0, | ||||||
| 			    "pa_threaded_mainloop_new() has failed"); | 			    "pa_threaded_mainloop_new() has failed"); | ||||||
| 		return NULL; | 		return false; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	pa_threaded_mainloop_lock(po->mainloop); | 	pa_threaded_mainloop_lock(po->mainloop); | ||||||
| @@ -304,18 +331,16 @@ pulse_output_init(G_GNUC_UNUSED const struct audio_format *audio_format, | |||||||
| 		pa_threaded_mainloop_stop(po->mainloop); | 		pa_threaded_mainloop_stop(po->mainloop); | ||||||
| 		pa_threaded_mainloop_free(po->mainloop); | 		pa_threaded_mainloop_free(po->mainloop); | ||||||
| 		g_free(po); | 		g_free(po); | ||||||
| 		return NULL; | 		return false; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	pa_threaded_mainloop_unlock(po->mainloop); | 	pa_threaded_mainloop_unlock(po->mainloop); | ||||||
|  |  | ||||||
| 	po->stream = NULL; | 	return true; | ||||||
|  |  | ||||||
| 	return po; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void | ||||||
| pulse_output_finish(void *data) | pulse_output_disable(void *data) | ||||||
| { | { | ||||||
| 	struct pulse_output *po = data; | 	struct pulse_output *po = data; | ||||||
|  |  | ||||||
| @@ -323,8 +348,7 @@ pulse_output_finish(void *data) | |||||||
| 	if (po->context != NULL) | 	if (po->context != NULL) | ||||||
| 		pulse_output_delete_context(po); | 		pulse_output_delete_context(po); | ||||||
| 	pa_threaded_mainloop_free(po->mainloop); | 	pa_threaded_mainloop_free(po->mainloop); | ||||||
|  | 	po->mainloop = NULL; | ||||||
| 	g_free(po); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -786,6 +810,8 @@ const struct audio_output_plugin pulse_output_plugin = { | |||||||
| 	.test_default_device = pulse_output_test_default_device, | 	.test_default_device = pulse_output_test_default_device, | ||||||
| 	.init = pulse_output_init, | 	.init = pulse_output_init, | ||||||
| 	.finish = pulse_output_finish, | 	.finish = pulse_output_finish, | ||||||
|  | 	.enable = pulse_output_enable, | ||||||
|  | 	.disable = pulse_output_disable, | ||||||
| 	.open = pulse_output_open, | 	.open = pulse_output_open, | ||||||
| 	.play = pulse_output_play, | 	.play = pulse_output_play, | ||||||
| 	.cancel = pulse_output_cancel, | 	.cancel = pulse_output_cancel, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann