mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-21 09:53:47 +00:00
alsa: fix negotiation
Don't assume the format is a string because now it is a list of string in the template. Chain up to the parent class implementation of get_caps.
This commit is contained in:
parent
ea9bc40bf9
commit
3254e79f04
2 changed files with 62 additions and 37 deletions
|
@ -101,40 +101,18 @@ static const struct
|
||||||
32, 32, SND_PCM_FORMAT_S32, SND_PCM_FORMAT_U32}
|
32, 32, SND_PCM_FORMAT_S32, SND_PCM_FORMAT_U32}
|
||||||
};
|
};
|
||||||
|
|
||||||
static GstCaps *
|
static void
|
||||||
gst_alsa_detect_formats (GstObject * obj, snd_pcm_hw_params_t * hw_params,
|
add_format (const gchar * str, GstStructure * s, snd_pcm_format_mask_t * mask,
|
||||||
GstCaps * in_caps)
|
GstCaps * caps)
|
||||||
{
|
{
|
||||||
snd_pcm_format_mask_t *mask;
|
|
||||||
GstStructure *s;
|
|
||||||
GstCaps *caps;
|
|
||||||
gint i;
|
|
||||||
|
|
||||||
snd_pcm_format_mask_malloc (&mask);
|
|
||||||
snd_pcm_hw_params_get_format_mask (hw_params, mask);
|
|
||||||
|
|
||||||
caps = gst_caps_new_empty ();
|
|
||||||
|
|
||||||
for (i = 0; i < gst_caps_get_size (in_caps); ++i) {
|
|
||||||
GstStructure *scopy;
|
GstStructure *scopy;
|
||||||
const gchar *str;
|
|
||||||
GstAudioFormat format;
|
GstAudioFormat format;
|
||||||
const GstAudioFormatInfo *finfo;
|
const GstAudioFormatInfo *finfo;
|
||||||
gint w, width = 0, depth = 0;
|
gint w, width = 0, depth = 0;
|
||||||
|
|
||||||
s = gst_caps_get_structure (in_caps, i);
|
|
||||||
if (!gst_structure_has_name (s, "audio/x-raw")) {
|
|
||||||
GST_WARNING_OBJECT (obj, "skipping non-raw format");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
str = gst_structure_get_string (s, "format");
|
|
||||||
if (str == NULL)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
format = gst_audio_format_from_string (str);
|
format = gst_audio_format_from_string (str);
|
||||||
if (format == GST_AUDIO_FORMAT_UNKNOWN)
|
if (format == GST_AUDIO_FORMAT_UNKNOWN)
|
||||||
continue;
|
return;
|
||||||
|
|
||||||
finfo = gst_audio_format_get_info (format);
|
finfo = gst_audio_format_get_info (format);
|
||||||
|
|
||||||
|
@ -145,7 +123,7 @@ gst_alsa_detect_formats (GstObject * obj, snd_pcm_hw_params_t * hw_params,
|
||||||
if (pcmformats[w].width == width && pcmformats[w].depth == depth)
|
if (pcmformats[w].width == width && pcmformats[w].depth == depth)
|
||||||
break;
|
break;
|
||||||
if (w == G_N_ELEMENTS (pcmformats))
|
if (w == G_N_ELEMENTS (pcmformats))
|
||||||
continue; /* Unknown format */
|
return; /* Unknown format */
|
||||||
|
|
||||||
if (snd_pcm_format_mask_test (mask, pcmformats[w].sformat) &&
|
if (snd_pcm_format_mask_test (mask, pcmformats[w].sformat) &&
|
||||||
snd_pcm_format_mask_test (mask, pcmformats[w].uformat)) {
|
snd_pcm_format_mask_test (mask, pcmformats[w].uformat)) {
|
||||||
|
@ -164,6 +142,51 @@ gst_alsa_detect_formats (GstObject * obj, snd_pcm_hw_params_t * hw_params,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static GstCaps *
|
||||||
|
gst_alsa_detect_formats (GstObject * obj, snd_pcm_hw_params_t * hw_params,
|
||||||
|
GstCaps * in_caps)
|
||||||
|
{
|
||||||
|
snd_pcm_format_mask_t *mask;
|
||||||
|
GstStructure *s;
|
||||||
|
GstCaps *caps;
|
||||||
|
gint i;
|
||||||
|
|
||||||
|
snd_pcm_format_mask_malloc (&mask);
|
||||||
|
snd_pcm_hw_params_get_format_mask (hw_params, mask);
|
||||||
|
|
||||||
|
caps = gst_caps_new_empty ();
|
||||||
|
|
||||||
|
for (i = 0; i < gst_caps_get_size (in_caps); ++i) {
|
||||||
|
const GValue *format;
|
||||||
|
|
||||||
|
s = gst_caps_get_structure (in_caps, i);
|
||||||
|
if (!gst_structure_has_name (s, "audio/x-raw")) {
|
||||||
|
GST_WARNING_OBJECT (obj, "skipping non-raw format");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
format = gst_structure_get_value (s, "format");
|
||||||
|
if (format == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (GST_VALUE_HOLDS_LIST (format)) {
|
||||||
|
gint i, len;
|
||||||
|
|
||||||
|
len = gst_value_list_get_size (format);
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
const GValue *val;
|
||||||
|
|
||||||
|
val = gst_value_list_get_value (format, i);
|
||||||
|
if (G_VALUE_HOLDS_STRING (val))
|
||||||
|
add_format (g_value_get_string (val), s, mask, caps);
|
||||||
|
}
|
||||||
|
} else if (G_VALUE_HOLDS_STRING (format)) {
|
||||||
|
add_format (g_value_get_string (format), s, mask, caps);
|
||||||
|
} else
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
snd_pcm_format_mask_free (mask);
|
snd_pcm_format_mask_free (mask);
|
||||||
gst_caps_unref (in_caps);
|
gst_caps_unref (in_caps);
|
||||||
return caps;
|
return caps;
|
||||||
|
|
|
@ -397,7 +397,7 @@ gst_alsasrc_getcaps (GstBaseSrc * bsrc, GstCaps * filter)
|
||||||
|
|
||||||
if (src->handle == NULL) {
|
if (src->handle == NULL) {
|
||||||
GST_DEBUG_OBJECT (src, "device not open, using template caps");
|
GST_DEBUG_OBJECT (src, "device not open, using template caps");
|
||||||
return NULL; /* base class will get template caps for us */
|
return GST_BASE_SRC_CLASS (parent_class)->get_caps (bsrc, filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (src->cached_caps) {
|
if (src->cached_caps) {
|
||||||
|
@ -414,6 +414,8 @@ gst_alsasrc_getcaps (GstBaseSrc * bsrc, GstCaps * filter)
|
||||||
g_return_val_if_fail (pad_template != NULL, NULL);
|
g_return_val_if_fail (pad_template != NULL, NULL);
|
||||||
|
|
||||||
templ_caps = gst_pad_template_get_caps (pad_template);
|
templ_caps = gst_pad_template_get_caps (pad_template);
|
||||||
|
GST_INFO_OBJECT (src, "template caps %" GST_PTR_FORMAT, templ_caps);
|
||||||
|
|
||||||
caps = gst_alsa_probe_supported_formats (GST_OBJECT (src), src->handle,
|
caps = gst_alsa_probe_supported_formats (GST_OBJECT (src), src->handle,
|
||||||
templ_caps);
|
templ_caps);
|
||||||
gst_caps_unref (templ_caps);
|
gst_caps_unref (templ_caps);
|
||||||
|
|
Loading…
Reference in a new issue