diff --git a/sys/oss4/oss4-audio.c b/sys/oss4/oss4-audio.c index 297ea7ff3e..45a1ecc627 100644 --- a/sys/oss4/oss4-audio.c +++ b/sys/oss4/oss4-audio.c @@ -73,6 +73,16 @@ static const struct GST_U8, AFMT_U8, "audio/x-raw-int", 8, 8, 0, FALSE} }; +/* formats we assume the OSS4 layer can always handle and convert internally */ +#define CONVERTIBLE_FORMATS ( \ + AFMT_MU_LAW | AFMT_A_LAW | \ + AFMT_S32_LE | AFMT_S32_BE | \ + AFMT_S24_LE | AFMT_S24_BE | \ + AFMT_S24_PACKED | \ + AFMT_S16_LE | AFMT_S16_BE | \ + AFMT_U16_LE | AFMT_U16_BE | \ + AFMT_S8 | AFMT_U8 ) + static gboolean gst_oss4_append_format_to_caps (gint fmt, GstCaps * caps) { @@ -411,6 +421,7 @@ gst_oss4_audio_probe_caps (GstObject * obj, int fd) oss_audioinfo ai = { 0, }; gboolean output; GstCaps *caps; + int nonnative_formats = 0; int formats, i; output = GST_IS_OSS4_SINK (obj); @@ -427,9 +438,22 @@ gst_oss4_audio_probe_caps (GstObject * obj, int fd) caps = gst_caps_new_empty (); + /* first list all the formats natively supported */ for (i = 0; i < G_N_ELEMENTS (fmt_map); ++i) { if ((formats & fmt_map[i].oss_fmt)) { gst_oss4_append_format_to_caps (fmt_map[i].oss_fmt, caps); + } else if ((fmt_map[i].oss_fmt & CONVERTIBLE_FORMATS)) { + nonnative_formats |= fmt_map[i].oss_fmt; + } + } + + GST_LOG_OBJECT (obj, "adding non-native %s formats : 0x%08x", + (output) ? "out" : "in", nonnative_formats); + + /* now append non-native formats for which conversion would be needed */ + for (i = 0; i < G_N_ELEMENTS (fmt_map); ++i) { + if ((nonnative_formats & fmt_map[i].oss_fmt)) { + gst_oss4_append_format_to_caps (fmt_map[i].oss_fmt, caps); } }