[beast/devel: 20/28] FLAC: fail if flac_error_callback gets called in loader (or channels == 0)
- From: Tim Janik <timj src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [beast/devel: 20/28] FLAC: fail if flac_error_callback gets called in loader (or channels == 0)
- Date: Sat, 4 May 2013 03:53:54 +0000 (UTC)
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]