diff options
| -rw-r--r-- | pulsemix.c | 36 | 
1 files changed, 24 insertions, 12 deletions
@@ -86,6 +86,7 @@ struct pulseaudio_t {  	pa_mainloop *mainloop;  	pa_mainloop_api *mainloop_api;  	enum connectstate state; +	int success;  	struct sink_t *sink;  }; @@ -105,14 +106,16 @@ int xstrtol(const char *str, long *out)  	return 0;  } -static int pulse_async_wait(struct pulseaudio_t *pulse, pa_operation *op) +static void success_cb(pa_context UNUSED *c, int success, void *raw)  { -	int r = 0; +	struct pulseaudio_t *pulse = raw; +	pulse->success = success; +} +static void pulse_async_wait(struct pulseaudio_t *pulse, pa_operation *op) +{  	while (pa_operation_get_state(op) == PA_OPERATION_RUNNING) -		pa_mainloop_iterate(pulse->mainloop, 1, &r); -	 -	return r; +		pa_mainloop_iterate(pulse->mainloop, 1, NULL);  }  static void sink_get_volume(struct pulseaudio_t *pulse) @@ -122,15 +125,18 @@ static void sink_get_volume(struct pulseaudio_t *pulse)  static void sink_set_volume(struct pulseaudio_t *pulse, struct sink_t *sink, long v)  { -	int r;  	pa_cvolume *vol = pa_cvolume_set(&sink->volume, sink->volume.channels, -			(int)fmax((double)v * PA_VOLUME_NORM / 100, 0)); +			(int)fmax((double)(v + .5) * PA_VOLUME_NORM / 100, 0));  	pa_operation *op = pa_context_set_sink_volume_by_index(pulse->cxt, -			sink->idx, vol, NULL, NULL); -	r = pulse_async_wait(pulse, op); +			sink->idx, vol, success_cb, pulse); +	pulse_async_wait(pulse, op); -	if (r == 0) +	if (pulse->success)  		printf("%ld\n", v); +	else { +		int err = pa_context_errno(pulse->cxt); +		fprintf(stderr, "failed to set volume: %s\n", pa_strerror(err)); +	}  	pa_operation_unref(op);  } @@ -269,9 +275,15 @@ static void set_default_sink(struct pulseaudio_t *pulse, const char *sinkname)  		warnx("failed to get sink by name\n");  		return;  	} -  -	op = pa_context_set_default_sink(pulse->cxt, sinkname, NULL, pulse); + +	op = pa_context_set_default_sink(pulse->cxt, sinkname, success_cb, pulse);  	pulse_async_wait(pulse, op); + +	if (!pulse->success) { +		int err = pa_context_errno(pulse->cxt); +		fprintf(stderr, "failed to set default sink to %s: %s\n", sinkname, pa_strerror(err)); +	} +  	pa_operation_unref(op);  }  | 
