summaryrefslogtreecommitdiff
path: root/libs/ardour/sndfileimportable.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-03-22 16:01:40 +0100
committerRobin Gareus <robin@gareus.org>2015-03-22 16:12:40 +0100
commitfbe673d9c7da1b0fe3966b5161c2bccca68aa4ea (patch)
tree6ec37b24e7ab6c789f92b812eacabd415f9f65f1 /libs/ardour/sndfileimportable.cc
parent39e5f7b94b6b4fe08fabae648c1e5133fd624482 (diff)
fix #6208, negative broadcast timestamps
Diffstat (limited to 'libs/ardour/sndfileimportable.cc')
-rw-r--r--libs/ardour/sndfileimportable.cc30
1 files changed, 27 insertions, 3 deletions
diff --git a/libs/ardour/sndfileimportable.cc b/libs/ardour/sndfileimportable.cc
index ceb88eddc9..2c55886502 100644
--- a/libs/ardour/sndfileimportable.cc
+++ b/libs/ardour/sndfileimportable.cc
@@ -1,8 +1,10 @@
-#include "ardour/sndfileimportable.h"
#include <sndfile.h>
#include <iostream>
#include <cstring>
+#include "pbd/error.h"
+#include "ardour/sndfileimportable.h"
+
using namespace ARDOUR;
using namespace std;
@@ -15,10 +17,32 @@ SndFileImportableSource::get_timecode_info (SNDFILE* sf, SF_BROADCAST_INFO* binf
return 0;
}
+ /* see http://tracker.ardour.org/view.php?id=6208
+ * 0xffffffff 0xfffc5680
+ * seems to be a bug in Presonus Capture (which generated the file)
+ *
+ * still since framepos_t is a signed int, ignore files that could
+ * lead to negative timestamps for now.
+ */
+
+ if (binfo->time_reference_high & 0x80000000) {
+ char tmp[64];
+ snprintf(tmp, sizeof(tmp), "%x%08x", binfo->time_reference_high, binfo->time_reference_low);
+ PBD::warning << "Invalid Timestamp " << tmp << endmsg;
+ exists = false;
+ return 0;
+ }
+
exists = true;
- int64_t ret = (uint32_t) binfo->time_reference_high;
+ /* libsndfile reads eactly 4 bytes for high and low, but
+ * uses "unsigned int" which may or may not be 32 bit little
+ * endian.
+ */
+ int64_t ret = (uint32_t) (binfo->time_reference_high & 0x7fffffff);
ret <<= 32;
- ret |= (uint32_t) binfo->time_reference_low;
+ ret |= (uint32_t) (binfo->time_reference_low & 0xffffffff);
+
+ assert(ret >= 0);
return ret;
}