-#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;
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;
}
return 0;
}
- int64_t ret = (uint32_t) info->time_reference_high;
+ if (info->time_reference_high & 0x80000000) {
+ return 0;
+ }
+
+ int64_t ret = (uint32_t) (info->time_reference_high & 0x7fffffff);
ret <<= 32;
- ret |= (uint32_t) info->time_reference_low;
+ ret |= (uint32_t) (info->time_reference_low & 0xffffffff);
return ret;
}