resamplers: no need to check that rates are different
authorRémi Denis-Courmont <remi@remlab.net>
Sat, 17 Nov 2012 20:23:26 +0000 (22:23 +0200)
committerRémi Denis-Courmont <remi@remlab.net>
Sat, 17 Nov 2012 20:24:33 +0000 (22:24 +0200)
In fact, the rates may be identical. Resampling might be used only to
compensate accidental drift. (We could also remove channel and format
checks.)

modules/audio_filter/resampler/speex.c
modules/audio_filter/resampler/src.c
modules/audio_filter/resampler/ugly.c

index c847f5b..774fc8f 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * speex.c : libspeex DSP resampler
  *****************************************************************************
- * Copyright © 2011 Rémi Denis-Courmont
+ * Copyright © 2011-2012 Rémi Denis-Courmont
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU Lesser General Public License as published by
@@ -34,6 +34,7 @@
     "Resampling quality (0 = worst and fastest, 10 = best and slowest).")
 
 static int Open (vlc_object_t *);
+static int OpenResampler (vlc_object_t *);
 static void Close (vlc_object_t *);
 
 vlc_module_begin ()
@@ -49,19 +50,17 @@ vlc_module_begin ()
 
     add_submodule ()
     set_capability ("audio resampler", 0)
-    set_callbacks (Open, Close)
+    set_callbacks (OpenResampler, Close)
 vlc_module_end ()
 
 static block_t *Resample (filter_t *, block_t *);
 
-static int Open (vlc_object_t *obj)
+static int OpenResampler (vlc_object_t *obj)
 {
     filter_t *filter = (filter_t *)obj;
 
-    /* Will change rate */
-    if (filter->fmt_in.audio.i_rate == filter->fmt_out.audio.i_rate
     /* Cannot convert format */
-     || filter->fmt_in.audio.i_format != filter->fmt_out.audio.i_format
+    if (filter->fmt_in.audio.i_format != filter->fmt_out.audio.i_format
     /* Cannot remix */
      || filter->fmt_in.audio.i_physical_channels
                                   != filter->fmt_out.audio.i_physical_channels
@@ -98,6 +97,16 @@ static int Open (vlc_object_t *obj)
     return VLC_SUCCESS;
 }
 
+static int Open (vlc_object_t *obj)
+{
+    filter_t *filter = (filter_t *)obj;
+
+    /* Will change rate */
+    if (filter->fmt_in.audio.i_rate == filter->fmt_out.audio.i_rate)
+        return VLC_EGENERIC;
+    return OpenResampler (obj);
+}
+
 static void Close (vlc_object_t *obj)
 {
     filter_t *filter = (filter_t *)obj;
index 9af5b29..b67be0e 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * src.c : Secret Rabbit Code (a.k.a. libsamplerate) resampler
  *****************************************************************************
- * Copyright (C) 2011 Rémi Denis-Courmont
+ * Copyright (C) 2011-2012 Rémi Denis-Courmont
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU Lesser General Public License as published by
@@ -51,6 +51,7 @@ static const char *const conv_type_texts[] = {
 };
 
 static int Open (vlc_object_t *);
+static int OpenResampler (vlc_object_t *);
 static void Close (vlc_object_t *);
 
 vlc_module_begin ()
@@ -66,7 +67,7 @@ vlc_module_begin ()
 
     add_submodule ()
     set_capability ("audio resampler", 50)
-    set_callbacks (Open, Close)
+    set_callbacks (OpenResampler, Close)
 vlc_module_end ()
 
 static block_t *Resample (filter_t *, block_t *);
@@ -75,6 +76,16 @@ static int Open (vlc_object_t *obj)
 {
     filter_t *filter = (filter_t *)obj;
 
+    /* Will change rate */
+    if (filter->fmt_in.audio.i_rate == filter->fmt_out.audio.i_rate)
+        return VLC_EGENERIC;
+    return OpenResampler (obj);
+}
+
+static int OpenResampler (vlc_object_t *obj)
+{
+    filter_t *filter = (filter_t *)obj;
+
     /* Only float->float */
     if (filter->fmt_in.audio.i_format != VLC_CODEC_FL32
      || filter->fmt_out.audio.i_format != VLC_CODEC_FL32
@@ -82,9 +93,7 @@ static int Open (vlc_object_t *obj)
      || filter->fmt_in.audio.i_physical_channels
                                   != filter->fmt_out.audio.i_physical_channels
      || filter->fmt_in.audio.i_original_channels
-                                  != filter->fmt_out.audio.i_original_channels
-    /* Different sample rate */
-     || filter->fmt_in.audio.i_rate == filter->fmt_out.audio.i_rate)
+                                  != filter->fmt_out.audio.i_original_channels)
         return VLC_EGENERIC;
 
     int type = var_InheritInteger (obj, "src-converter-type");
index 1e4041c..796c499 100644 (file)
@@ -1,5 +1,5 @@
 /*****************************************************************************
- * ugly.c : ugly resampler (changes pitch)
+ * ugly.c : zero-order hold "ugly" resampler
  *****************************************************************************
  * Copyright (C) 2002, 2006 VLC authors and VideoLAN
  * $Id$
@@ -37,7 +37,8 @@
 /*****************************************************************************
  * Local prototypes
  *****************************************************************************/
-static int  Create    ( vlc_object_t * );
+static int Create (vlc_object_t *);
+static int CreateResampler (vlc_object_t *);
 
 static block_t *DoWork( filter_t *, block_t * );
 
@@ -53,7 +54,7 @@ vlc_module_begin ()
 
     add_submodule()
     set_capability( "audio resampler", 2 )
-    set_callbacks( Create, NULL )
+    set_callbacks( CreateResampler, NULL )
 vlc_module_end ()
 
 /*****************************************************************************
@@ -63,8 +64,16 @@ static int Create( vlc_object_t *p_this )
 {
     filter_t * p_filter = (filter_t *)p_this;
 
-    if( p_filter->fmt_in.audio.i_rate == p_filter->fmt_out.audio.i_rate
-     || p_filter->fmt_in.audio.i_format != p_filter->fmt_out.audio.i_format
+    if( p_filter->fmt_in.audio.i_rate == p_filter->fmt_out.audio.i_rate )
+        return VLC_EGENERIC;
+    return CreateResampler( p_this );
+}
+
+static int CreateResampler( vlc_object_t *p_this )
+{
+    filter_t * p_filter = (filter_t *)p_this;
+
+    if( p_filter->fmt_in.audio.i_format != p_filter->fmt_out.audio.i_format
      || p_filter->fmt_in.audio.i_physical_channels
                                  != p_filter->fmt_out.audio.i_physical_channels
      || p_filter->fmt_in.audio.i_original_channels