diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2006-07-10 20:12:48 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2006-07-10 20:12:48 +0000 |
commit | c3b4df9867c727bd59d36b52911f9ebe2efea0c0 (patch) | |
tree | 50e1d1d788c6f3a4dadf59ec341d9a05b3ca0a4f /libs/ardour | |
parent | 26843b34fdd62e6f80630868c5eb3f8fee0c17f1 (diff) |
BWF offset changes from Ben Loftis, hacked by hand into current svn
git-svn-id: svn://localhost/ardour2/trunk@674 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour')
-rw-r--r-- | libs/ardour/ardour/audiofilesource.h | 5 | ||||
-rw-r--r-- | libs/ardour/ardour/destructive_filesource.h | 2 | ||||
-rw-r--r-- | libs/ardour/ardour/sndfilesource.h | 2 | ||||
-rw-r--r-- | libs/ardour/audiofilesource.cc | 17 | ||||
-rw-r--r-- | libs/ardour/destructive_filesource.cc | 21 | ||||
-rw-r--r-- | libs/ardour/location.cc | 4 | ||||
-rw-r--r-- | libs/ardour/session_time.cc | 5 | ||||
-rw-r--r-- | libs/ardour/sndfilesource.cc | 41 |
8 files changed, 37 insertions, 60 deletions
diff --git a/libs/ardour/ardour/audiofilesource.h b/libs/ardour/ardour/audiofilesource.h index 36251c07ff..47c304f86e 100644 --- a/libs/ardour/ardour/audiofilesource.h +++ b/libs/ardour/ardour/audiofilesource.h @@ -95,7 +95,7 @@ class AudioFileSource : public AudioSource { static void set_bwf_serial_number (int); static void set_search_path (string); - static void set_header_position_offset (jack_nframes_t offset, bool negative); + static void set_header_position_offset (jack_nframes_t offset ); static sigc::signal<void> HeaderPositionOffsetChanged; @@ -107,7 +107,7 @@ class AudioFileSource : public AudioSource { to cause issues. */ - void handle_header_position_change (); + virtual void handle_header_position_change () {} protected: @@ -141,7 +141,6 @@ class AudioFileSource : public AudioSource { static char bwf_serial_number[13]; static uint64_t header_position_offset; - static bool header_position_negative; virtual void set_timeline_position (jack_nframes_t pos); virtual void set_header_timeline_position () = 0; diff --git a/libs/ardour/ardour/destructive_filesource.h b/libs/ardour/ardour/destructive_filesource.h index 2d10528ac8..947367f754 100644 --- a/libs/ardour/ardour/destructive_filesource.h +++ b/libs/ardour/ardour/destructive_filesource.h @@ -49,6 +49,8 @@ class DestructiveFileSource : public SndFileSource { protected: jack_nframes_t write_unlocked (Sample *src, jack_nframes_t cnt, char * workbuf); + virtual void handle_header_position_change (); + private: static jack_nframes_t xfade_frames; static gain_t* out_coefficient; diff --git a/libs/ardour/ardour/sndfilesource.h b/libs/ardour/ardour/sndfilesource.h index 5e3c1f621d..fe90085048 100644 --- a/libs/ardour/ardour/sndfilesource.h +++ b/libs/ardour/ardour/sndfilesource.h @@ -51,8 +51,6 @@ class SndFileSource : public AudioFileSource { int update_header (jack_nframes_t when, struct tm&, time_t); int flush_header (); - void handle_smpte_offset_change (jack_nframes_t offset, bool negative); - protected: void set_header_timeline_position (); diff --git a/libs/ardour/audiofilesource.cc b/libs/ardour/audiofilesource.cc index c094e1af97..ac5569bb24 100644 --- a/libs/ardour/audiofilesource.cc +++ b/libs/ardour/audiofilesource.cc @@ -56,8 +56,7 @@ string AudioFileSource::peak_dir = ""; string AudioFileSource::search_path; sigc::signal<void> AudioFileSource::HeaderPositionOffsetChanged; -bool AudioFileSource::header_position_negative; -uint64_t AudioFileSource::header_position_offset; +uint64_t AudioFileSource::header_position_offset = 0; char AudioFileSource::bwf_country_code[3] = "US"; char AudioFileSource::bwf_organization_code[4] = "LAS"; @@ -592,25 +591,13 @@ AudioFileSource::set_search_path (string p) } void -AudioFileSource::set_header_position_offset (jack_nframes_t offset, bool negative) +AudioFileSource::set_header_position_offset (jack_nframes_t offset) { header_position_offset = offset; - header_position_negative = negative; HeaderPositionOffsetChanged (); } -void -AudioFileSource::handle_header_position_change () -{ - cerr << _path << " handling header position change " << writable() << endl; - - if (writable()) { - set_header_timeline_position (); - flush_header (); - } -} - void AudioFileSource::set_timeline_position (jack_nframes_t pos) { diff --git a/libs/ardour/destructive_filesource.cc b/libs/ardour/destructive_filesource.cc index cce757509a..15ff259283 100644 --- a/libs/ardour/destructive_filesource.cc +++ b/libs/ardour/destructive_filesource.cc @@ -75,6 +75,9 @@ DestructiveFileSource::DestructiveFileSource (string path, SampleFormat samp_for _capture_start = false; _capture_end = false; file_pos = 0; + + timeline_position = header_position_offset; + AudioFileSource::HeaderPositionOffsetChanged.connect (mem_fun (*this, &DestructiveFileSource::handle_header_position_change)); } DestructiveFileSource::DestructiveFileSource (const XMLNode& node) @@ -85,6 +88,9 @@ DestructiveFileSource::DestructiveFileSource (const XMLNode& node) _capture_start = false; _capture_end = false; file_pos = 0; + + timeline_position = header_position_offset; + AudioFileSource::HeaderPositionOffsetChanged.connect (mem_fun (*this, &DestructiveFileSource::handle_header_position_change)); } DestructiveFileSource::~DestructiveFileSource() @@ -366,8 +372,19 @@ DestructiveFileSource::get_state () } void +DestructiveFileSource::handle_header_position_change () +{ + if ( _length != 0 ) { + error << string_compose(_("Filesource: start time is already set for existing file (%1): Cannot change start time."), _path ) << endmsg; + //in the future, pop up a dialog here that allows user to regenerate file with new start offset + } else if (writable()) { + timeline_position = header_position_offset; + set_header_timeline_position (); //this will get flushed if/when the file is recorded to + } +} + +void DestructiveFileSource::set_timeline_position (jack_nframes_t pos) { - /* destructive tracks always start at where our reference frame zero is */ - timeline_position = 0; + //destructive track timeline postion does not change except at instantion or when header_position_offset (session start) changes } diff --git a/libs/ardour/location.cc b/libs/ardour/location.cc index b2af52284e..6af87c58f3 100644 --- a/libs/ardour/location.cc +++ b/libs/ardour/location.cc @@ -30,6 +30,7 @@ #include <pbd/xml++.h> #include <ardour/location.h> +#include <ardour/audiofilesource.h> #include "i18n.h" @@ -71,6 +72,9 @@ Location::set_start (jack_nframes_t s) _start = s; _end = s; start_changed(this); /* EMIT SIGNAL */ + if ( is_start() ) { + AudioFileSource::set_header_position_offset ( s ); + } } return 0; } diff --git a/libs/ardour/session_time.cc b/libs/ardour/session_time.cc index 0e52c926fe..bd2c992ff5 100644 --- a/libs/ardour/session_time.cc +++ b/libs/ardour/session_time.cc @@ -32,7 +32,6 @@ #include <ardour/audioengine.h> #include <ardour/session.h> #include <ardour/tempo.h> -#include <ardour/audiofilesource.h> #include "i18n.h" @@ -93,8 +92,6 @@ Session::set_smpte_offset (jack_nframes_t off) _smpte_offset = off; last_smpte_valid = false; - AudioFileSource::set_header_position_offset (_smpte_offset, _smpte_offset_negative); - SMPTEOffsetChanged (); /* EMIT SIGNAL */ } @@ -104,8 +101,6 @@ Session::set_smpte_offset_negative (bool neg) _smpte_offset_negative = neg; last_smpte_valid = false; - AudioFileSource::set_header_position_offset (_smpte_offset, _smpte_offset_negative); - SMPTEOffsetChanged (); /* EMIT SIGNAL */ } diff --git a/libs/ardour/sndfilesource.cc b/libs/ardour/sndfilesource.cc index 1374d9bd31..b3ce33a2e6 100644 --- a/libs/ardour/sndfilesource.cc +++ b/libs/ardour/sndfilesource.cc @@ -156,6 +156,8 @@ SndFileSource::SndFileSource (string idstr, SampleFormat sfmt, HeaderFormat hf, utsinfo.version); _broadcast_info->version = 1; + _broadcast_info->time_reference_low = 0; + _broadcast_info->time_reference_high = 0; /* XXX do something about this field */ @@ -183,6 +185,7 @@ SndFileSource::SndFileSource (string idstr, SampleFormat sfmt, HeaderFormat hf, } AudioSourceCreated (this); /* EMIT SIGNAL */ + } void @@ -241,6 +244,7 @@ SndFileSource::open () /* if the file has data but no broadcast info, then clearly, there is no broadcast info */ if (_length) { + error << "SndFileSource: file has no broadcast info" << endmsg; free (_broadcast_info); _broadcast_info = 0; _flags = Flag (_flags & ~Broadcast); @@ -254,15 +258,11 @@ SndFileSource::open () of the time reference. */ - set_timeline_position (_broadcast_info->time_reference_low); + set_timeline_position ( _broadcast_info->time_reference_low ); } if (writable()) { sf_command (sf, SFC_SET_UPDATE_HEADER_AUTO, 0, SF_FALSE); - - /* update header if header offset info changes */ - - AudioFileSource::HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioFileSource::handle_header_position_change)); } return 0; @@ -474,7 +474,7 @@ SndFileSource::setup_broadcast_info (jack_nframes_t when, struct tm& now, time_t now.tm_mon, now.tm_mday); - snprintf (_broadcast_info->origination_time, sizeof (_broadcast_info->origination_time), "%02d-%02d-%02d", + snprintf (_broadcast_info->origination_time, sizeof (_broadcast_info->origination_time), "%02d:%02d:%02d", now.tm_hour, now.tm_min, now.tm_sec); @@ -497,37 +497,12 @@ SndFileSource::setup_broadcast_info (jack_nframes_t when, struct tm& now, time_t void SndFileSource::set_header_timeline_position () { - uint64_t pos; - if (!(_flags & Broadcast)) { return; } - cerr << "timeline pos = " << timeline_position << " offset = " << header_position_offset << endl; - - _broadcast_info->time_reference_high = 0; - - if (header_position_negative) { - - if (ULONG_LONG_MAX - header_position_offset < timeline_position) { - pos = ULONG_LONG_MAX; // impossible - } else { - pos = timeline_position + header_position_offset; - } - - } else { - - if (timeline_position < header_position_offset) { - pos = 0; - } else { - pos = timeline_position - header_position_offset; - } - } - - _broadcast_info->time_reference_high = (pos >> 32); - _broadcast_info->time_reference_low = (pos & 0xffffffff); - - cerr << "set binfo pos to " << _broadcast_info->time_reference_high << " + " << _broadcast_info->time_reference_low << endl; + _broadcast_info->time_reference_high = (timeline_position >> 32); + _broadcast_info->time_reference_low = (timeline_position & 0xffffffff); if (sf_command (sf, SFC_SET_BROADCAST_INFO, _broadcast_info, sizeof (*_broadcast_info)) != SF_TRUE) { error << string_compose (_("cannot set broadcast info for audio file %1; Dropping broadcast info for this file"), _path) << endmsg; |