diff options
author | Sebastian Dröge <slomo@circular-chaos.org> | 2007-01-16 08:29:11 +0000 |
---|---|---|
committer | Stefan Kost <ensonic@users.sourceforge.net> | 2007-01-16 08:29:11 +0000 |
commit | 703a0d00d8b3548cc8dcdea1b645133d035a9734 (patch) | |
tree | c3cecee141c982ca670e6b40a81b81eb6e37ccf0 /gst/audiofx | |
parent | 36dfafcda96f1fe13bfd26cb18b5770bbf1d1de6 (diff) |
gst/audiofx/audiopanorama.c: Use a function array for process methods, add more docs and define the startindex of enums.
Original commit message from CVS:
Patch by: Sebastian Dröge <slomo circular-chaos org>
* gst/audiofx/audiopanorama.c: (gst_audio_panorama_class_init),
(gst_audio_panorama_set_process_function):
Use a function array for process methods, add more docs and define the
startindex of enums.
Diffstat (limited to 'gst/audiofx')
-rw-r--r-- | gst/audiofx/audiopanorama.c | 90 |
1 files changed, 40 insertions, 50 deletions
diff --git a/gst/audiofx/audiopanorama.c b/gst/audiofx/audiopanorama.c index c0d76952..9f8ac005 100644 --- a/gst/audiofx/audiopanorama.c +++ b/gst/audiofx/audiopanorama.c @@ -73,8 +73,9 @@ enum enum { - METHOD_PSYCHOACOUSTIC, - METHOD_SIMPLE + METHOD_PSYCHOACOUSTIC = 0, + METHOD_SIMPLE, + NUM_METHODS }; #define GST_TYPE_AUDIO_PANORAMA_METHOD (gst_audio_panorama_method_get_type ()) @@ -163,6 +164,27 @@ static void gst_audio_panorama_transform_s2s_float_simple (GstAudioPanorama * static GstFlowReturn gst_audio_panorama_transform (GstBaseTransform * base, GstBuffer * inbuf, GstBuffer * outbuf); + +/* Table with processing functions: [channels][format][method] */ +static GstAudioPanoramaProcessFunc panorama_process_functions[2][2][2] = { + { + {(GstAudioPanoramaProcessFunc) gst_audio_panorama_transform_m2s_int, + (GstAudioPanoramaProcessFunc) + gst_audio_panorama_transform_m2s_int_simple}, + {(GstAudioPanoramaProcessFunc) gst_audio_panorama_transform_m2s_float, + (GstAudioPanoramaProcessFunc) + gst_audio_panorama_transform_m2s_float_simple} + }, + { + {(GstAudioPanoramaProcessFunc) gst_audio_panorama_transform_s2s_int, + (GstAudioPanoramaProcessFunc) + gst_audio_panorama_transform_s2s_int_simple}, + {(GstAudioPanoramaProcessFunc) gst_audio_panorama_transform_s2s_float, + (GstAudioPanoramaProcessFunc) + gst_audio_panorama_transform_s2s_float_simple} + } +}; + /* GObject vmethod implementations */ static void @@ -194,7 +216,8 @@ gst_audio_panorama_class_init (GstAudioPanoramaClass * klass) * GstAudioPanorama:method * * Panning method: psychoacoustic mode keeps the same perceived loudness, - * while simple mode just controls the volume of one channel. + * while simple mode just controls the volume of one channel. It's merely + * a matter of taste which method should be chosen. * * Since: 0.10.6 **/ @@ -230,57 +253,24 @@ gst_audio_panorama_init (GstAudioPanorama * filter, static gboolean gst_audio_panorama_set_process_function (GstAudioPanorama * filter) { - gboolean ret; + gint channel_index, format_index, method_index; /* set processing function */ - switch (filter->channels) { - case 1: - if (!filter->format_float) { - if (filter->method == METHOD_SIMPLE) { - filter->process = (GstAudioPanoramaProcessFunc) - gst_audio_panorama_transform_m2s_int_simple; - } else { - filter->process = (GstAudioPanoramaProcessFunc) - gst_audio_panorama_transform_m2s_int; - } - } else { - if (filter->method == METHOD_SIMPLE) { - filter->process = (GstAudioPanoramaProcessFunc) - gst_audio_panorama_transform_m2s_float_simple; - } else { - filter->process = (GstAudioPanoramaProcessFunc) - gst_audio_panorama_transform_m2s_float; - } - } - ret = TRUE; - break; - case 2: - if (!filter->format_float) { - if (filter->method == METHOD_SIMPLE) { - filter->process = (GstAudioPanoramaProcessFunc) - gst_audio_panorama_transform_s2s_int_simple; - } else { - filter->process = (GstAudioPanoramaProcessFunc) - gst_audio_panorama_transform_s2s_int; - } - } else { - if (filter->method == METHOD_SIMPLE) { - filter->process = (GstAudioPanoramaProcessFunc) - gst_audio_panorama_transform_s2s_float_simple; - } else { - filter->process = (GstAudioPanoramaProcessFunc) - gst_audio_panorama_transform_s2s_float; - } - } - ret = TRUE; - break; - default: - ret = FALSE; - filter->process = NULL; - break; + channel_index = filter->channels - 1; + if (channel_index > 1 || channel_index < 0) { + filter->process = NULL; + return FALSE; } - return ret; + format_index = (filter->format_float) ? 1 : 0; + + method_index = filter->method; + if (method_index >= NUM_METHODS || method_index < 0) + method_index = METHOD_PSYCHOACOUSTIC; + + filter->process = + panorama_process_functions[channel_index][format_index][method_index]; + return TRUE; } static void |