mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-02 05:28:48 +00:00
pulsesink: De-duplicate code to get the current sink input info
https://bugzilla.gnome.org/show_bug.cgi?id=590768
This commit is contained in:
parent
8f9fbfa992
commit
d379e237c1
1 changed files with 32 additions and 79 deletions
|
@ -2620,18 +2620,24 @@ gst_pulsesink_sink_input_info_cb (pa_context * c, const pa_sink_input_info * i,
|
||||||
if (i->index == pa_stream_get_index (pbuf->stream)) {
|
if (i->index == pa_stream_get_index (pbuf->stream)) {
|
||||||
psink->volume = pa_sw_volume_to_linear (pa_cvolume_max (&i->volume));
|
psink->volume = pa_sw_volume_to_linear (pa_cvolume_max (&i->volume));
|
||||||
psink->mute = i->mute;
|
psink->mute = i->mute;
|
||||||
|
|
||||||
|
if (psink->volume > MAX_VOLUME) {
|
||||||
|
GST_WARNING_OBJECT (psink, "Clipped volume from %f to %f", psink->volume,
|
||||||
|
MAX_VOLUME);
|
||||||
|
psink->volume = MAX_VOLUME;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
pa_threaded_mainloop_signal (mainloop, 0);
|
pa_threaded_mainloop_signal (mainloop, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gdouble
|
static void
|
||||||
gst_pulsesink_get_volume (GstPulseSink * psink)
|
gst_pulsesink_get_sink_input_info (GstPulseSink * psink, gdouble * volume,
|
||||||
|
gboolean * mute)
|
||||||
{
|
{
|
||||||
GstPulseRingBuffer *pbuf;
|
GstPulseRingBuffer *pbuf;
|
||||||
pa_operation *o = NULL;
|
pa_operation *o = NULL;
|
||||||
gdouble v = DEFAULT_VOLUME;
|
|
||||||
uint32_t idx;
|
uint32_t idx;
|
||||||
|
|
||||||
if (!mainloop)
|
if (!mainloop)
|
||||||
|
@ -2657,91 +2663,28 @@ gst_pulsesink_get_volume (GstPulseSink * psink)
|
||||||
}
|
}
|
||||||
|
|
||||||
unlock:
|
unlock:
|
||||||
v = psink->volume;
|
if (volume)
|
||||||
|
*volume = psink->volume;
|
||||||
|
if (mute)
|
||||||
|
*mute = psink->mute;
|
||||||
|
|
||||||
if (o)
|
if (o)
|
||||||
pa_operation_unref (o);
|
pa_operation_unref (o);
|
||||||
|
|
||||||
pa_threaded_mainloop_unlock (mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
|
|
||||||
if (v > MAX_VOLUME) {
|
return;
|
||||||
GST_WARNING_OBJECT (psink, "Clipped volume from %f to %f", v, MAX_VOLUME);
|
|
||||||
v = MAX_VOLUME;
|
|
||||||
}
|
|
||||||
|
|
||||||
return v;
|
|
||||||
|
|
||||||
/* ERRORS */
|
/* ERRORS */
|
||||||
no_mainloop:
|
no_mainloop:
|
||||||
{
|
{
|
||||||
v = psink->volume;
|
if (volume)
|
||||||
|
*volume = psink->volume;
|
||||||
|
if (mute)
|
||||||
|
*mute = psink->mute;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (psink, "we have no mainloop");
|
GST_DEBUG_OBJECT (psink, "we have no mainloop");
|
||||||
return v;
|
return;
|
||||||
}
|
|
||||||
no_buffer:
|
|
||||||
{
|
|
||||||
GST_DEBUG_OBJECT (psink, "we have no ringbuffer");
|
|
||||||
goto unlock;
|
|
||||||
}
|
|
||||||
no_index:
|
|
||||||
{
|
|
||||||
GST_DEBUG_OBJECT (psink, "we don't have a stream index");
|
|
||||||
goto unlock;
|
|
||||||
}
|
|
||||||
info_failed:
|
|
||||||
{
|
|
||||||
GST_ELEMENT_ERROR (psink, RESOURCE, FAILED,
|
|
||||||
("pa_context_get_sink_input_info() failed: %s",
|
|
||||||
pa_strerror (pa_context_errno (pbuf->context))), (NULL));
|
|
||||||
goto unlock;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_pulsesink_get_mute (GstPulseSink * psink)
|
|
||||||
{
|
|
||||||
GstPulseRingBuffer *pbuf;
|
|
||||||
pa_operation *o = NULL;
|
|
||||||
uint32_t idx;
|
|
||||||
gboolean mute = FALSE;
|
|
||||||
|
|
||||||
if (!mainloop)
|
|
||||||
goto no_mainloop;
|
|
||||||
|
|
||||||
pa_threaded_mainloop_lock (mainloop);
|
|
||||||
mute = psink->mute;
|
|
||||||
|
|
||||||
pbuf = GST_PULSERING_BUFFER_CAST (GST_AUDIO_BASE_SINK (psink)->ringbuffer);
|
|
||||||
if (pbuf == NULL || pbuf->stream == NULL)
|
|
||||||
goto no_buffer;
|
|
||||||
|
|
||||||
if ((idx = pa_stream_get_index (pbuf->stream)) == PA_INVALID_INDEX)
|
|
||||||
goto no_index;
|
|
||||||
|
|
||||||
if (!(o = pa_context_get_sink_input_info (pbuf->context, idx,
|
|
||||||
gst_pulsesink_sink_input_info_cb, pbuf)))
|
|
||||||
goto info_failed;
|
|
||||||
|
|
||||||
while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) {
|
|
||||||
pa_threaded_mainloop_wait (mainloop);
|
|
||||||
if (gst_pulsering_is_dead (psink, pbuf, TRUE))
|
|
||||||
goto unlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
unlock:
|
|
||||||
if (o)
|
|
||||||
pa_operation_unref (o);
|
|
||||||
|
|
||||||
pa_threaded_mainloop_unlock (mainloop);
|
|
||||||
|
|
||||||
return mute;
|
|
||||||
|
|
||||||
/* ERRORS */
|
|
||||||
no_mainloop:
|
|
||||||
{
|
|
||||||
mute = psink->mute;
|
|
||||||
GST_DEBUG_OBJECT (psink, "we have no mainloop");
|
|
||||||
return mute;
|
|
||||||
}
|
}
|
||||||
no_buffer:
|
no_buffer:
|
||||||
{
|
{
|
||||||
|
@ -2942,11 +2885,21 @@ gst_pulsesink_get_property (GObject * object,
|
||||||
g_value_take_string (value, gst_pulsesink_device_description (pulsesink));
|
g_value_take_string (value, gst_pulsesink_device_description (pulsesink));
|
||||||
break;
|
break;
|
||||||
case PROP_VOLUME:
|
case PROP_VOLUME:
|
||||||
g_value_set_double (value, gst_pulsesink_get_volume (pulsesink));
|
{
|
||||||
|
gdouble volume;
|
||||||
|
|
||||||
|
gst_pulsesink_get_sink_input_info (pulsesink, &volume, NULL);
|
||||||
|
g_value_set_double (value, volume);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case PROP_MUTE:
|
case PROP_MUTE:
|
||||||
g_value_set_boolean (value, gst_pulsesink_get_mute (pulsesink));
|
{
|
||||||
|
gboolean mute;
|
||||||
|
|
||||||
|
gst_pulsesink_get_sink_input_info (pulsesink, NULL, &mute);
|
||||||
|
g_value_set_boolean (value, mute);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case PROP_CLIENT_NAME:
|
case PROP_CLIENT_NAME:
|
||||||
g_value_set_string (value, pulsesink->client_name);
|
g_value_set_string (value, pulsesink->client_name);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue