diff options
Diffstat (limited to 'ext/sndfile/gstsf.c')
-rw-r--r-- | ext/sndfile/gstsf.c | 153 |
1 files changed, 78 insertions, 75 deletions
diff --git a/ext/sndfile/gstsf.c b/ext/sndfile/gstsf.c index e71b18884..a8f1c61bc 100644 --- a/ext/sndfile/gstsf.c +++ b/ext/sndfile/gstsf.c @@ -27,79 +27,86 @@ #include "gstsf.h" +/* sf formats */ -GType -gst_sf_major_types_get_type (void) +GstCaps * +gst_sf_create_audio_template_caps (void) { - static GType sf_major_types_type = 0; - static GEnumValue *sf_major_types = NULL; - - if (!sf_major_types_type) { - SF_FORMAT_INFO format_info; - int k, count; - - sf_command (NULL, SFC_GET_FORMAT_MAJOR_COUNT, &count, sizeof (int)); - - sf_major_types = g_new0 (GEnumValue, count + 1); - - for (k = 0; k < count; k++) { - format_info.format = k; - sf_command (NULL, SFC_GET_FORMAT_MAJOR, &format_info, - sizeof (format_info)); - sf_major_types[k].value = format_info.format; - sf_major_types[k].value_name = g_strdup (format_info.name); - sf_major_types[k].value_nick = g_strdup (format_info.extension); - - /* Irritatingly enough, there exist major_types with the same extension. Let's - just hope that sndfile gives us the list in alphabetical order, as it - currently does. */ - if (k > 0 - && strcmp (sf_major_types[k].value_nick, - sf_major_types[k - 1].value_nick) == 0) { - g_free ((gchar *) sf_major_types[k].value_nick); - sf_major_types[k].value_nick = - g_strconcat (sf_major_types[k - 1].value_nick, "-", - sf_major_types[k].value_name, NULL); - g_strcanon ((gchar *) sf_major_types[k].value_nick, - G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-", '-'); - } + GstCaps *caps = gst_caps_new_empty (); + SF_FORMAT_INFO format_info; + const gchar *fmt; + gint k, count; + + sf_command (NULL, SFC_GET_FORMAT_MAJOR_COUNT, &count, sizeof (gint)); + + for (k = 0; k < count; k++) { + format_info.format = k; + sf_command (NULL, SFC_GET_FORMAT_MAJOR, &format_info, sizeof (format_info)); + + switch (format_info.format) { + case SF_FORMAT_AIFF: /* Apple/SGI AIFF format */ + fmt = "audio/x-aiff"; + break; + case SF_FORMAT_AU: /* Sun/NeXT AU format */ + fmt = "audio/x-au"; + break; + case SF_FORMAT_FLAC: /* FLAC lossless file format */ + fmt = "audio/x-flac"; + break; + case SF_FORMAT_IRCAM: /* Berkeley/IRCAM/CARL */ + fmt = "audio/x-ircam"; + break; + case SF_FORMAT_NIST: /* Sphere NIST format. */ + fmt = "audio/x-nist"; + break; + case SF_FORMAT_OGG: /* Xiph OGG container */ + fmt = "audio/ogg"; + break; + case SF_FORMAT_PAF: /* Ensoniq PARIS file format. */ + fmt = "audio/x-paris"; + break; + case SF_FORMAT_RAW: /* RAW PCM data. */ + fmt = "audio/x-raw"; + break; + case SF_FORMAT_SDS: /* Midi Sample Dump Standard */ + fmt = "audio/x-sds"; + break; + case SF_FORMAT_SVX: /* Amiga IFF / SVX8 / SV16 format. */ + fmt = "audio/x-svx"; + break; + case SF_FORMAT_VOC: /* VOC files. */ + fmt = "audio/x-voc"; + break; + case SF_FORMAT_WAV: /* Microsoft WAV format */ + case SF_FORMAT_WAVEX: /* MS WAVE with WAVEFORMATEX */ + fmt = "audio/x-wav"; + break; + case SF_FORMAT_W64: /* Sonic Foundry's 64 bit RIFF/WAV */ + fmt = "audio/x-w64"; + break; + case SF_FORMAT_XI: /* Fasttracker 2 Extended Instrument */ + fmt = "audio/x-xi"; + break; + case SF_FORMAT_RF64: /* RF64 WAV file */ + case SF_FORMAT_MAT4: /* Matlab (tm) V4.2 / GNU Octave 2.0 */ + case SF_FORMAT_MAT5: /* Matlab (tm) V5.0 / GNU Octave 2.1 */ + case SF_FORMAT_PVF: /* Portable Voice Format */ + case SF_FORMAT_HTK: /* HMM Tool Kit format */ + case SF_FORMAT_AVR: /* Audio Visual Research */ + case SF_FORMAT_SD2: /* Sound Designer 2 */ + case SF_FORMAT_CAF: /* Core Audio File format */ + case SF_FORMAT_WVE: /* Psion WVE format */ + case SF_FORMAT_MPC2K: /* Akai MPC 2000 sampler */ + default: + fmt = NULL; + GST_WARNING ("format 0x%x: '%s' is not mapped", format_info.format, + format_info.name); } - - sf_major_types_type = - g_enum_register_static ("GstSndfileMajorTypes", sf_major_types); - } - return sf_major_types_type; -} - -GType -gst_sf_minor_types_get_type (void) -{ - static GType sf_minor_types_type = 0; - static GEnumValue *sf_minor_types = NULL; - - if (!sf_minor_types_type) { - SF_FORMAT_INFO format_info; - int k, count; - - sf_command (NULL, SFC_GET_FORMAT_SUBTYPE_COUNT, &count, sizeof (int)); - - sf_minor_types = g_new0 (GEnumValue, count + 1); - - for (k = 0; k < count; k++) { - format_info.format = k; - sf_command (NULL, SFC_GET_FORMAT_SUBTYPE, &format_info, - sizeof (format_info)); - sf_minor_types[k].value = format_info.format; - sf_minor_types[k].value_name = g_strdup (format_info.name); - sf_minor_types[k].value_nick = g_ascii_strdown (format_info.name, -1); - g_strcanon ((gchar *) sf_minor_types[k].value_nick, - G_CSET_a_2_z G_CSET_DIGITS "-", '-'); + if (fmt != NULL) { + gst_caps_append_structure (caps, gst_structure_new_empty (fmt)); } - - sf_minor_types_type = - g_enum_register_static ("GstSndfileMinorTypes", sf_minor_types); } - return sf_minor_types_type; + return gst_caps_simplify (caps); } static gboolean @@ -112,12 +119,8 @@ plugin_init (GstPlugin * plugin) bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif /* ENABLE_NLS */ - if (!gst_element_register (plugin, "sfsink", GST_RANK_NONE, - gst_sf_sink_get_type ())) - return FALSE; - - if (!gst_element_register (plugin, "sfsrc", GST_RANK_NONE, - gst_sf_src_get_type ())) + if (!gst_element_register (plugin, "sfdec", GST_RANK_MARGINAL, + gst_sf_dec_get_type ())) return FALSE; return TRUE; @@ -126,5 +129,5 @@ plugin_init (GstPlugin * plugin) GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, sndfile, - "use libsndfile to read and write audio from and to files", + "use libsndfile to read and write various audio formats", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) |