Esempio n. 1
0
void pulse_set_default_sink_volume(struct pulseaudio_t *pulse, pa_volume_t volume) {
    pa_operation *op;

    pa_cvolume_set(&(pulse->cvolume), 2, volume);

    op = pa_context_set_sink_volume_by_name(pulse->cxt, pulse->default_sink, &(pulse->cvolume), NULL, pulse);
    pulse_async_wait(pulse, op);
    pa_operation_unref(op);
}
Esempio n. 2
0
static void set_volume(struct audio_service *service, int new_volume, void *user_data)
{
	pa_cvolume volume;
	pa_operation *op;

	service->new_volume = new_volume;

	pa_cvolume_set(&volume, 1, (service->new_volume * (double) (PA_VOLUME_NORM / 100)));
	op = pa_context_set_sink_volume_by_name(service->context, service->default_sink_name, &volume, set_volume_success_cb, user_data);
	pa_operation_unref(op);
}
Esempio n. 3
0
static void change_sink_volume_callback(pa_context *c, const pa_sink_info *i,
					int is_last, void *userdata)
{
	pa_operation *o;
	pa_cvolume cv;
	int v;
	int j;

	if (is_last < 0) {
		fprintf(stderr, "Failed to get sink information: %s\n",
			pa_strerror(pa_context_errno(c)));
		return;
	}

	if (is_last)
		return;

	cv = i->volume;
	v = (intptr_t)userdata / 100.0 * PA_VOLUME_NORM;
	for (j = 0; j < cv.channels; j++) {
		if (v < 0 && cv.values[j] < -v)
			cv.values[j] = PA_VOLUME_MUTED;
		else if (v > 0 && cv.values[j] + v > PA_VOLUME_NORM)
			cv.values[j] = PA_VOLUME_NORM;
		else
			cv.values[j] += v;
	}

	o = pa_context_set_sink_volume_by_name(c, i->name, &cv, simple_callback,
					       NULL);
	if (!o) {
		fprintf(stderr, "Operation failed: %s\n",
			pa_strerror(pa_context_errno(c)));
		return;
	}
	pa_operation_unref(o);

	show_volume_notification(volume_pct_from_cv(&cv), i->mute);
}
Esempio n. 4
0
static int pulse_write_integer(snd_ctl_ext_t * ext, snd_ctl_ext_key_t key,
			       long *value)
{
	snd_ctl_pulse_t *ctl = ext->private_data;
	int err = 0, i;
	pa_operation *o;
	pa_cvolume *vol = NULL;

	assert(ctl);

	if (!ctl->p || !ctl->p->mainloop)
		return -EBADFD;

	pa_threaded_mainloop_lock(ctl->p->mainloop);

	err = pulse_check_connection(ctl->p);
	if (err < 0)
		goto finish;

	err = pulse_update_volume(ctl);
	if (err < 0)
		goto finish;

	switch (key) {
	case 0:
		vol = &ctl->source_volume;
		break;
	case 1:
		if (!!ctl->source_muted == !*value)
			goto finish;
		ctl->source_muted = !*value;
		break;
	case 2:
		vol = &ctl->sink_volume;
		break;
	case 3:
		if (!!ctl->sink_muted == !*value)
			goto finish;
		ctl->sink_muted = !*value;
		break;
	default:
		err = -EINVAL;
		goto finish;
	}

	if (vol) {
		for (i = 0; i < vol->channels; i++)
			if (value[i] != vol->values[i])
				break;

		if (i == vol->channels)
			goto finish;

		for (i = 0; i < vol->channels; i++)
			vol->values[i] = value[i];

		if (key == 0)
			o = pa_context_set_source_volume_by_name(ctl->p->
								 context,
								 ctl->
								 source,
								 vol,
								 pulse_context_success_cb,
								 ctl->p);
		else
			o = pa_context_set_sink_volume_by_name(ctl->p->
							       context,
							       ctl->sink,
							       vol,
							       pulse_context_success_cb,
							       ctl->p);
	} else {
		if (key == 1)
			o = pa_context_set_source_mute_by_name(ctl->p->
							       context,
							       ctl->source,
							       ctl->
							       source_muted,
							       pulse_context_success_cb,
							       ctl->p);
		else
			o = pa_context_set_sink_mute_by_name(ctl->p->
							     context,
							     ctl->sink,
							     ctl->
							     sink_muted,
							     pulse_context_success_cb,
							     ctl->p);
	}

	if (!o) {
		err = -EIO;
		goto finish;
	}

	err = pulse_wait_operation(ctl->p, o);
	pa_operation_unref(o);

	if (err < 0)
		goto finish;

	err = 1;

      finish:
	pa_threaded_mainloop_unlock(ctl->p->mainloop);

	return err;
}