diff options
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; } |