mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-02 13:38:48 +00:00
pulsesrc: De-duplicate code to get the current source output info
https://bugzilla.gnome.org/show_bug.cgi?id=590768
This commit is contained in:
parent
c3642e3ecf
commit
d56f4718c2
1 changed files with 35 additions and 75 deletions
|
@ -445,17 +445,23 @@ gst_pulsesrc_source_output_info_cb (pa_context * c,
|
||||||
if (i->index == psrc->source_output_idx) {
|
if (i->index == psrc->source_output_idx) {
|
||||||
psrc->volume = pa_sw_volume_to_linear (pa_cvolume_max (&i->volume));
|
psrc->volume = pa_sw_volume_to_linear (pa_cvolume_max (&i->volume));
|
||||||
psrc->mute = i->mute;
|
psrc->mute = i->mute;
|
||||||
|
|
||||||
|
if (G_UNLIKELY (psrc->volume > MAX_VOLUME)) {
|
||||||
|
GST_WARNING_OBJECT (psrc, "Clipped volume from %f to %f",
|
||||||
|
psrc->volume, MAX_VOLUME);
|
||||||
|
psrc->volume = MAX_VOLUME;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
pa_threaded_mainloop_signal (psrc->mainloop, 0);
|
pa_threaded_mainloop_signal (psrc->mainloop, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gdouble
|
static void
|
||||||
gst_pulsesrc_get_stream_volume (GstPulseSrc * pulsesrc)
|
gst_pulsesrc_get_source_output_info (GstPulseSrc * pulsesrc, gdouble * volume,
|
||||||
|
gboolean * mute)
|
||||||
{
|
{
|
||||||
pa_operation *o = NULL;
|
pa_operation *o = NULL;
|
||||||
gdouble v;
|
|
||||||
|
|
||||||
if (!pulsesrc->mainloop)
|
if (!pulsesrc->mainloop)
|
||||||
goto no_mainloop;
|
goto no_mainloop;
|
||||||
|
@ -477,90 +483,37 @@ gst_pulsesrc_get_stream_volume (GstPulseSrc * pulsesrc)
|
||||||
}
|
}
|
||||||
|
|
||||||
unlock:
|
unlock:
|
||||||
v = pulsesrc->volume;
|
|
||||||
|
if (volume)
|
||||||
|
*volume = pulsesrc->volume;
|
||||||
|
if (mute)
|
||||||
|
*mute = pulsesrc->mute;
|
||||||
|
|
||||||
if (o)
|
if (o)
|
||||||
pa_operation_unref (o);
|
pa_operation_unref (o);
|
||||||
|
|
||||||
pa_threaded_mainloop_unlock (pulsesrc->mainloop);
|
pa_threaded_mainloop_unlock (pulsesrc->mainloop);
|
||||||
|
|
||||||
if (v > MAX_VOLUME) {
|
return;
|
||||||
GST_WARNING_OBJECT (pulsesrc, "Clipped volume from %f to %f", v,
|
|
||||||
MAX_VOLUME);
|
|
||||||
v = MAX_VOLUME;
|
|
||||||
}
|
|
||||||
|
|
||||||
return v;
|
|
||||||
|
|
||||||
/* ERRORS */
|
/* ERRORS */
|
||||||
no_mainloop:
|
no_mainloop:
|
||||||
{
|
{
|
||||||
v = pulsesrc->volume;
|
|
||||||
GST_DEBUG_OBJECT (pulsesrc, "we have no mainloop");
|
GST_DEBUG_OBJECT (pulsesrc, "we have no mainloop");
|
||||||
return v;
|
if (volume)
|
||||||
|
*volume = pulsesrc->volume;
|
||||||
|
if (mute)
|
||||||
|
*mute = pulsesrc->mute;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
no_index:
|
no_index:
|
||||||
{
|
{
|
||||||
v = pulsesrc->volume;
|
|
||||||
GST_DEBUG_OBJECT (pulsesrc, "we don't have a stream index");
|
GST_DEBUG_OBJECT (pulsesrc, "we don't have a stream index");
|
||||||
return v;
|
if (volume)
|
||||||
}
|
*volume = pulsesrc->volume;
|
||||||
info_failed:
|
if (mute)
|
||||||
{
|
*mute = pulsesrc->mute;
|
||||||
GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED,
|
return;
|
||||||
("pa_context_get_source_output_info() failed: %s",
|
|
||||||
pa_strerror (pa_context_errno (pulsesrc->context))), (NULL));
|
|
||||||
goto unlock;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_pulsesrc_get_stream_mute (GstPulseSrc * pulsesrc)
|
|
||||||
{
|
|
||||||
pa_operation *o = NULL;
|
|
||||||
gboolean mute;
|
|
||||||
|
|
||||||
if (!pulsesrc->mainloop)
|
|
||||||
goto no_mainloop;
|
|
||||||
|
|
||||||
if (pulsesrc->source_output_idx == PA_INVALID_INDEX)
|
|
||||||
goto no_index;
|
|
||||||
|
|
||||||
pa_threaded_mainloop_lock (pulsesrc->mainloop);
|
|
||||||
|
|
||||||
if (!(o = pa_context_get_source_output_info (pulsesrc->context,
|
|
||||||
pulsesrc->source_output_idx, gst_pulsesrc_source_output_info_cb,
|
|
||||||
pulsesrc)))
|
|
||||||
goto info_failed;
|
|
||||||
|
|
||||||
while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) {
|
|
||||||
pa_threaded_mainloop_wait (pulsesrc->mainloop);
|
|
||||||
if (gst_pulsesrc_is_dead (pulsesrc, TRUE))
|
|
||||||
goto unlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
unlock:
|
|
||||||
mute = pulsesrc->mute;
|
|
||||||
|
|
||||||
if (o)
|
|
||||||
pa_operation_unref (o);
|
|
||||||
|
|
||||||
pa_threaded_mainloop_unlock (pulsesrc->mainloop);
|
|
||||||
|
|
||||||
return mute;
|
|
||||||
|
|
||||||
/* ERRORS */
|
|
||||||
no_mainloop:
|
|
||||||
{
|
|
||||||
mute = pulsesrc->mute;
|
|
||||||
GST_DEBUG_OBJECT (pulsesrc, "we have no mainloop");
|
|
||||||
return mute;
|
|
||||||
}
|
|
||||||
no_index:
|
|
||||||
{
|
|
||||||
mute = pulsesrc->mute;
|
|
||||||
GST_DEBUG_OBJECT (pulsesrc, "we don't have a stream index");
|
|
||||||
return mute;
|
|
||||||
}
|
}
|
||||||
info_failed:
|
info_failed:
|
||||||
{
|
{
|
||||||
|
@ -680,7 +633,6 @@ mute_failed:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_pulsesrc_set_stream_device (GstPulseSrc * pulsesrc, const gchar * device)
|
gst_pulsesrc_set_stream_device (GstPulseSrc * pulsesrc, const gchar * device)
|
||||||
{
|
{
|
||||||
|
@ -804,11 +756,19 @@ gst_pulsesrc_get_property (GObject * object,
|
||||||
g_value_set_uint (value, pulsesrc->source_output_idx);
|
g_value_set_uint (value, pulsesrc->source_output_idx);
|
||||||
break;
|
break;
|
||||||
case PROP_VOLUME:
|
case PROP_VOLUME:
|
||||||
g_value_set_double (value, gst_pulsesrc_get_stream_volume (pulsesrc));
|
{
|
||||||
|
gdouble volume;
|
||||||
|
gst_pulsesrc_get_source_output_info (pulsesrc, &volume, NULL);
|
||||||
|
g_value_set_double (value, volume);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case PROP_MUTE:
|
case PROP_MUTE:
|
||||||
g_value_set_boolean (value, gst_pulsesrc_get_stream_mute (pulsesrc));
|
{
|
||||||
|
gboolean mute;
|
||||||
|
gst_pulsesrc_get_source_output_info (pulsesrc, NULL, &mute);
|
||||||
|
g_value_set_boolean (value, mute);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue