[beast/devel: 20/28] FLAC: fail if flac_error_callback gets called in loader (or channels == 0)



commit 67f4586d85aac1e4439fa5dbff1d1dd1e6186128
Author: Stefan Westerfeld <stefan space twc de>
Date:   Mon Mar 25 19:44:25 2013 +0100

    FLAC: fail if flac_error_callback gets called in loader (or channels == 0)

 bse/bseloader-flac.cc |   31 +++++++++++++++++++++++--------
 1 files changed, 23 insertions(+), 8 deletions(-)
---
diff --git a/bse/bseloader-flac.cc b/bse/bseloader-flac.cc
index 4729b76..5ee2f60 100644
--- a/bse/bseloader-flac.cc
+++ b/bse/bseloader-flac.cc
@@ -10,13 +10,6 @@
 
 namespace {
 
-static void
-flac_error_callback (const FLAC__StreamDecoder     *decoder,
-                     FLAC__StreamDecoderErrorStatus status,
-                     void                          *client_data)
-{
-}
-
 static FLAC__StreamDecoderWriteStatus
 flac_write_callback (const FLAC__StreamDecoder  *decoder,
                      const FLAC__Frame          *frame,
@@ -31,6 +24,20 @@ struct FileInfo
   BseWaveFileInfo wfi;
   BseWaveDsc      wdsc;
 
+  // pass error status from flac callback to caller
+  bool                              error_occurred;
+  FLAC__StreamDecoderErrorStatus    error_status;
+
+  static void
+  flac_error_callback (const FLAC__StreamDecoder     *decoder,
+                       FLAC__StreamDecoderErrorStatus status,
+                       void                          *client_data)
+  {
+    FileInfo *fi = static_cast<FileInfo *> (client_data);
+    fi->error_occurred = true;
+    fi->error_status = status;
+  }
+
   FileInfo (const gchar  *file_name,
             BseErrorType *error_p)
   {
@@ -46,7 +53,9 @@ struct FileInfo
         *error_p = BSE_ERROR_INTERNAL;  // should not happen
         return;
       }
-    int r = FLAC__stream_decoder_init_file (decoder, file_name, flac_write_callback, NULL, 
flac_error_callback, NULL);
+
+    error_occurred = false;
+    int r = FLAC__stream_decoder_init_file (decoder, file_name, flac_write_callback, NULL, 
flac_error_callback, this);
     if (r != 0)
       {
         *error_p = gsl_error_from_errno (errno, BSE_ERROR_FILE_OPEN_FAILED);
@@ -59,6 +68,12 @@ struct FileInfo
       mdok = FLAC__stream_decoder_process_single (decoder);
     } while (FLAC__stream_decoder_get_channels (decoder) == 0 && mdok);
 
+    if (error_occurred || FLAC__stream_decoder_get_channels (decoder) == 0)
+      {
+        *error_p = BSE_ERROR_IO;
+        return;
+      }
+
     /* allocate and fill BseWaveFileInfo */
     wfi.n_waves = 1;
     wfi.waves = (typeof (wfi.waves)) g_malloc0 (sizeof (wfi.waves[0]) * wfi.n_waves);


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