diff options
author | Robin Gareus <robin@gareus.org> | 2015-03-22 16:01:40 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2015-03-22 16:12:40 +0100 |
commit | fbe673d9c7da1b0fe3966b5161c2bccca68aa4ea (patch) | |
tree | 6ec37b24e7ab6c789f92b812eacabd415f9f65f1 /libs/ardour/sndfileimportable.cc | |
parent | 39e5f7b94b6b4fe08fabae648c1e5133fd624482 (diff) |
fix #6208, negative broadcast timestamps
Diffstat (limited to 'libs/ardour/sndfileimportable.cc')
-rw-r--r-- | libs/ardour/sndfileimportable.cc | 30 |
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; } |