Beispiel #1
0
static void mm_sourceinfo_cb(pa_context *context, const pa_source_info *info, int is_last, void *user_data)
{
	struct luna_service_req_data *req = user_data;
	struct audio_service *service = req->user_data;
	pa_source_port_info *builtin_mic = NULL, *headset = NULL;
	pa_source_port_info *preferred = NULL;
	const char *name_to_set = NULL;
	const char *value_to_set = NULL;
	int i;
	pa_operation *op;

	if (info->monitor_of_sink != PA_INVALID_INDEX)
		return;  /* Not the right source */

	for (i = 0; i < info->n_ports; i++) {
		if (!strcmp(info->ports[i]->name, "input-builtin_mic"))
			builtin_mic = info->ports[i];
		if (!strcmp(info->ports[i]->name, "input-wired_headset") &&
				info->ports[i]->available != PA_PORT_AVAILABLE_NO)
			headset = info->ports[i];
	}

	if (is_last && !builtin_mic) {
		finish_set_call_mode(false, user_data);
		return;
	}

	if (!builtin_mic)
		return; /* Not the right source */

	preferred = headset ? headset : builtin_mic;

	if (preferred && preferred != info->active_port) {
		name_to_set = info->name;
		value_to_set = preferred->name;
	}

	if (!!info->mute != !!service->mic_mute)
		name_to_set = info->name;

	if (name_to_set) {
		op = pa_context_set_source_mute_by_name(service->context, name_to_set, value_to_set, mm_set_source_mute_cb, req);
		pa_operation_unref(op);
	}
	else {
		finish_set_mic_mute(false, req);
	}
}
Beispiel #2
0
static void source_toggle_mute_callback(pa_context *c, const pa_source_info *i,
					int is_last, void *userdata)
{
	pa_operation *o;

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

	if (is_last)
		return;

	o = pa_context_set_source_mute_by_name(c, i->name, !i->mute,
					     simple_callback, NULL);
	if (!o) {
		fprintf(stderr, "Operation failed: %s\n",
			pa_strerror(pa_context_errno(c)));
		return;
	}
	pa_operation_unref(o);
}
Beispiel #3
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;
}