r4075 - trunk/bse



Author: stw
Date: 2006-11-13 19:06:22 -0500 (Mon, 13 Nov 2006)
New Revision: 4075

Modified:
   trunk/bse/ChangeLog
   trunk/bse/bsedatahandle-resample.cc
   trunk/bse/bseresampler.cc
   trunk/bse/bseresampler.hh
Log:
Tue Nov 14 01:02:45 2006  Stefan Westerfeld  <stefan space twc de>

	* bseresampler.[hc]*: Added Resampler2::find_precision_for_bits to the
	API, and an precision enum -> string conversion function.

	* bsedatahandle-resample.cc: Use find_precision_for_bits.


Modified: trunk/bse/ChangeLog
===================================================================
--- trunk/bse/ChangeLog	2006-11-13 19:13:04 UTC (rev 4074)
+++ trunk/bse/ChangeLog	2006-11-14 00:06:22 UTC (rev 4075)
@@ -1,3 +1,10 @@
+Tue Nov 14 01:02:45 2006  Stefan Westerfeld  <stefan space twc de>
+
+	* bseresampler.[hc]*: Added Resampler2::find_precision_for_bits to the
+	API, and an precision enum -> string conversion function.
+
+	* bsedatahandle-resample.cc: Use find_precision_for_bits.
+
 Mon Nov 13 20:05:53 2006  Stefan Westerfeld  <stefan space twc de>
 
 	* bseresamplerimpl.hh: Removed unnecessary delay. The stream delay for

Modified: trunk/bse/bsedatahandle-resample.cc
===================================================================
--- trunk/bse/bsedatahandle-resample.cc	2006-11-13 19:13:04 UTC (rev 4074)
+++ trunk/bse/bsedatahandle-resample.cc	2006-11-14 00:06:22 UTC (rev 4075)
@@ -167,8 +167,7 @@
     m_pcm_frame = -2;
     m_pcm_data.resize (m_frame_size);
 
-    /* FIXME: Resampler2::find_precision_for_bits (...) */
-    BseResampler2Precision precision = static_cast<BseResampler2Precision> (m_precision_bits);
+    BseResampler2Precision precision = Resampler2::find_precision_for_bits (m_precision_bits);
     for (guint i = 0; i < setup->n_channels; i++)
       {
 	Resampler2 *resampler = Resampler2::create (mode(), precision);

Modified: trunk/bse/bseresampler.cc
===================================================================
--- trunk/bse/bseresampler.cc	2006-11-13 19:13:04 UTC (rev 4074)
+++ trunk/bse/bseresampler.cc	2006-11-14 00:06:22 UTC (rev 4075)
@@ -33,6 +33,41 @@
 Resampler2::~Resampler2()
 {}
 
+BseResampler2Precision
+Resampler2::find_precision_for_bits (guint bits)
+{
+  if (bits <= 1)
+    return BSE_RESAMPLER2_PREC_LINEAR;
+  if (bits <= 8)
+    return BSE_RESAMPLER2_PREC_48DB;
+  if (bits <= 12)
+    return BSE_RESAMPLER2_PREC_72DB;
+  if (bits <= 16)
+    return BSE_RESAMPLER2_PREC_96DB;
+  if (bits <= 20)
+    return BSE_RESAMPLER2_PREC_120DB;
+
+  /* thats the best precision we can deliver (and by the way also close to
+   * the best precision possible with floats anyway)
+   */
+  return BSE_RESAMPLER2_PREC_144DB;
+}
+
+const char *
+Resampler2::precision_name (BseResampler2Precision precision)
+{
+  switch (precision)
+  {
+  case BSE_RESAMPLER2_PREC_LINEAR:  return "linear interpolation";
+  case BSE_RESAMPLER2_PREC_48DB:    return "8 bit (48dB)";
+  case BSE_RESAMPLER2_PREC_72DB:    return "12 bit (72dB)";
+  case BSE_RESAMPLER2_PREC_96DB:    return "16 bit (96dB)";
+  case BSE_RESAMPLER2_PREC_120DB:   return "20 bit (120dB)";
+  case BSE_RESAMPLER2_PREC_144DB:   return "24 bit (144dB)";
+  default:			    return "unknown precision enum value";
+  }
+}
+
 /* --- coefficient sets for Resampler2 --- */
 /* halfband FIR filter for factor 2 resampling, created with octave
  *
@@ -311,3 +346,15 @@
 {
   return reinterpret_cast<Bse::Resampler::Resampler2 *> (resampler)->delay();
 }
+
+BseResampler2Precision
+bse_resampler2_find_precision_for_bits (guint bits)
+{
+  return Bse::Resampler::Resampler2::find_precision_for_bits (bits);
+}
+
+const char*
+bse_resampler2_precision_name (BseResampler2Precision precision)
+{
+  return Bse::Resampler::Resampler2::precision_name (precision);
+}

Modified: trunk/bse/bseresampler.hh
===================================================================
--- trunk/bse/bseresampler.hh	2006-11-13 19:13:04 UTC (rev 4074)
+++ trunk/bse/bseresampler.hh	2006-11-14 00:06:22 UTC (rev 4075)
@@ -51,6 +51,10 @@
 guint	       bse_resampler2_order         (BseResampler2         *resampler);
 double	       bse_resampler2_delay         (BseResampler2         *resampler);
 
+/* precision <-> bits conversion */
+BseResampler2Precision	bse_resampler2_find_precision_for_bits (guint		       bits);
+const char*		bse_resampler2_precision_name	       (BseResampler2Precision precision);
+
 G_END_DECLS
 
 #ifdef __cplusplus
@@ -67,9 +71,17 @@
   /**
    * creates a resampler instance fulfilling a given specification
    */
-  static  Resampler2* create (BseResampler2Mode      mode,
-			      BseResampler2Precision precision);
+  static Resampler2* create (BseResampler2Mode      mode,
+			     BseResampler2Precision precision);
   /**
+   * finds a precision which is appropriate for at least the specified number of bits
+   */
+  static BseResampler2Precision find_precision_for_bits (guint bits);
+  /**
+   * returns a human-readable name for a given precision
+   */
+  static const char  *precision_name (BseResampler2Precision precision);
+  /**
    * virtual destructor for abstract class
    */
   virtual	      ~Resampler2();




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]