static void gst_pulsesrc_set_stream_volume (GstPulseSrc * pulsesrc, gdouble volume) { pa_cvolume v; pa_operation *o = NULL; if (!pulsesrc->mainloop) goto no_mainloop; if (!pulsesrc->source_output_idx) goto no_index; pa_threaded_mainloop_lock (pulsesrc->mainloop); GST_DEBUG_OBJECT (pulsesrc, "setting volume to %f", volume); gst_pulse_cvolume_from_linear (&v, pulsesrc->sample_spec.channels, volume); if (!(o = pa_context_set_source_output_volume (pulsesrc->context, pulsesrc->source_output_idx, &v, NULL, NULL))) goto volume_failed; /* We don't really care about the result of this call */ unlock: if (o) pa_operation_unref (o); pa_threaded_mainloop_unlock (pulsesrc->mainloop); return; /* ERRORS */ no_mainloop: { pulsesrc->volume = volume; pulsesrc->volume_set = TRUE; GST_DEBUG_OBJECT (pulsesrc, "we have no mainloop"); return; } no_index: { pulsesrc->volume = volume; pulsesrc->volume_set = TRUE; GST_DEBUG_OBJECT (pulsesrc, "we don't have a stream index"); return; } volume_failed: { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("pa_stream_set_source_output_volume() failed: %s", pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); goto unlock; } }
static int qpa_ctl_in (HWVoiceIn *hw, int cmd, ...) { PAVoiceIn *pa = (PAVoiceIn *) hw; pa_operation *op; pa_cvolume v; paaudio *g = pa->g; #ifdef PA_CHECK_VERSION pa_cvolume_init (&v); #endif switch (cmd) { case VOICE_VOLUME: { SWVoiceIn *sw; va_list ap; va_start (ap, cmd); sw = va_arg (ap, SWVoiceIn *); va_end (ap); v.channels = 2; v.values[0] = ((PA_VOLUME_NORM - PA_VOLUME_MUTED) * sw->vol.l) / UINT32_MAX; v.values[1] = ((PA_VOLUME_NORM - PA_VOLUME_MUTED) * sw->vol.r) / UINT32_MAX; pa_threaded_mainloop_lock (g->mainloop); op = pa_context_set_source_output_volume (g->context, pa_stream_get_index (pa->stream), &v, NULL, NULL); if (!op) { qpa_logerr (pa_context_errno (g->context), "set_source_output_volume() failed\n"); } else { pa_operation_unref(op); } op = pa_context_set_source_output_mute (g->context, pa_stream_get_index (pa->stream), sw->vol.mute, NULL, NULL); if (!op) { qpa_logerr (pa_context_errno (g->context), "set_source_output_mute() failed\n"); } else { pa_operation_unref (op); } pa_threaded_mainloop_unlock (g->mainloop); } } return 0; }
void pulseaudio_volume(menu_info_item_t* mii, int inc) { g_debug("pulseaudio_volume(%s, %i)", mii->name, inc); /* increment/decrement in 2% steps */ pa_cvolume* volume; if(inc < 0) volume = pa_cvolume_dec(mii->volume, -inc * PA_VOLUME_NORM / 50); else if(inc > 0) { int volume_max = mii->menu_info->menu_infos->settings.volume_max; if(volume_max > 0) volume = pa_cvolume_inc_clamp(mii->volume, inc * PA_VOLUME_NORM / 50, PA_VOLUME_NORM * volume_max / 100); else volume = pa_cvolume_inc(mii->volume, inc * PA_VOLUME_NORM / 50); } else return; pa_operation* o = NULL; switch(mii->menu_info->type) { case MENU_SERVER: case MENU_MODULE: /* nothing to do here */ break; case MENU_SINK: o = pa_context_set_sink_volume_by_index(context, mii->index, volume, pulseaudio_set_volume_success_cb, mii); break; case MENU_SOURCE: o = pa_context_set_source_volume_by_index(context, mii->index, volume, pulseaudio_set_volume_success_cb, mii); break; case MENU_INPUT: o = pa_context_set_sink_input_volume(context, mii->index, volume, pulseaudio_set_volume_success_cb, mii); break; case MENU_OUTPUT: o = pa_context_set_source_output_volume(context, mii->index, volume, pulseaudio_set_volume_success_cb, mii); break; } if(o) pa_operation_unref(o); }
void backend_volume_setall(context_t *c, backend_entry_type type, uint32_t idx, int *v, int chnum) { pa_cvolume volume; volume.channels = chnum; for(int i = 0; i < chnum; ++i) { volume.values[i] = v[i]; } switch(type) { case SINK: pa_context_set_sink_volume_by_index(c->context, idx, &volume, NULL, NULL); break; case SINK_INPUT: pa_context_set_sink_input_volume(c->context, idx, &volume, NULL, NULL); break; case SOURCE: pa_context_set_source_volume_by_index(c->context, idx, &volume, NULL, NULL); break; case SOURCE_OUTPUT: pa_context_set_source_output_volume(c->context, idx, &volume, NULL, NULL); break; default: break; } }