void CPulseAEStream::SetVolume(float volume) { if (!m_Initialized) return; if (!pa_threaded_mainloop_in_thread(m_MainLoop)) pa_threaded_mainloop_lock(m_MainLoop); if (volume > 0.f) { m_Volume = volume; pa_volume_t paVolume = pa_sw_volume_from_linear((double)(m_Volume * m_MaxVolume)); pa_cvolume_set(&m_ChVolume, m_SampleSpec.channels, paVolume); } else pa_cvolume_mute(&m_ChVolume,m_SampleSpec.channels); pa_operation *op = pa_context_set_sink_input_volume(m_Context, pa_stream_get_index(m_Stream), &m_ChVolume, NULL, NULL); if (op == NULL) CLog::Log(LOGERROR, "PulseAudio: Failed to set volume"); else pa_operation_unref(op); if (!pa_threaded_mainloop_in_thread(m_MainLoop)) pa_threaded_mainloop_unlock(m_MainLoop); }
GstPulseMixerCtrl * gst_pulsemixer_ctrl_new (GObject * object, const gchar * server, const gchar * device, GstPulseMixerType type) { GstPulseMixerCtrl *c = NULL; c = g_new (GstPulseMixerCtrl, 1); c->object = g_object_ref (object); c->tracklist = NULL; c->server = g_strdup (server); c->device = g_strdup (device); c->mainloop = NULL; c->context = NULL; c->track = NULL; c->ignore_queries = c->outstandig_queries = 0; pa_cvolume_mute (&c->volume, PA_CHANNELS_MAX); pa_channel_map_init (&c->channel_map); c->muted = 0; c->index = PA_INVALID_INDEX; c->type = type; c->name = NULL; c->description = NULL; c->time_event = NULL; c->update_volume = c->update_mute = FALSE; if (!(gst_pulsemixer_ctrl_open (c))) { gst_pulsemixer_ctrl_free (c); return NULL; } return c; }
void CAESinkPULSE::SetVolume(float volume) { if (m_IsAllocated && !m_passthrough) { pa_threaded_mainloop_lock(m_MainLoop); // clamp possibly too large / low values float per_cent_volume = std::max(0.0f, std::min(volume, 1.0f)); if (m_volume_needs_update) { m_volume_needs_update = false; pa_volume_t n_vol = pa_cvolume_avg(&m_Volume); n_vol = std::min(n_vol, PA_VOLUME_NORM); per_cent_volume = (float) n_vol / PA_VOLUME_NORM; // only update internal volume pa_threaded_mainloop_unlock(m_MainLoop); g_application.SetVolume(per_cent_volume, false); return; } pa_volume_t pavolume = per_cent_volume * PA_VOLUME_NORM; unsigned int sink_input_idx = pa_stream_get_index(m_Stream); if ( pavolume <= 0 ) pa_cvolume_mute(&m_Volume, m_Channels); else pa_cvolume_set(&m_Volume, m_Channels, pavolume); pa_operation *op = pa_context_set_sink_input_volume(m_Context, sink_input_idx, &m_Volume, NULL, NULL); if (op == NULL) CLog::Log(LOGERROR, "PulseAudio: Failed to set volume"); else pa_operation_unref(op); pa_threaded_mainloop_unlock(m_MainLoop); } }