changeset 23868:ff9758331d78

audiowrite: add support for Quality option on Ogg Vorbis files (bug #51704) * audioread.cc (Faudiowrite): Add support and input validation for Quality option, scaled to be compatible with Matlab.
author Mike Miller <mtmiller@octave.org>
date Thu, 10 Aug 2017 11:30:10 -0700
parents 4f68899f9e5b
children b3d59e080eae
files libinterp/dldfcn/audioread.cc
diffstat 1 files changed, 12 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/dldfcn/audioread.cc	Thu Aug 10 09:31:38 2017 -0700
+++ b/libinterp/dldfcn/audioread.cc	Thu Aug 10 11:30:10 2017 -0700
@@ -344,8 +344,8 @@
   std::string title = "";
   std::string artist = "";
   std::string comment = "";
-  // FIXME: Quality is currently unused?
-  // float quality = 0.75;
+  double quality = 0.75;
+
   for (int i = 3; i < nargin; i += 2)
     {
       if (i >= nargin - 1)
@@ -379,11 +379,15 @@
         warning_with_id ("Octave:audiowrite:unused-parameter",
                          "audiowrite: 'BitRate' accepted for Matlab "
                          "compatibility, but is ignored");
-      // FIXME: Quality is currently unused?
       else if (keyword == "quality")
-        warning_with_id ("Octave:audiowrite:unused-parameter",
-                         "audiowrite: ignoring 'Quality' option, "
-                         "not yet unimplemented");
+        {
+          double value = value_arg.xdouble_value ("audiowrite: Quality value must be a scalar");
+
+          if (octave::math::isnan (value) || value < 0 || value > 100)
+            error ("audiowrite: Quality must be a number between 0 and 100");
+
+          quality = value / 100;
+        }
       else if (keyword == "title")
         title = value_arg.string_value ();
       else if (keyword == "artist")
@@ -403,6 +407,8 @@
 
   frame.add_fcn (safe_close, file);
 
+  sf_command (file, SFC_SET_VBR_ENCODING_QUALITY, &quality, sizeof (quality));
+
   if (title != "")
     sf_set_string (file, SF_STR_TITLE, title.c_str ());