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