summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2006-07-10 20:12:48 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2006-07-10 20:12:48 +0000
commitc3b4df9867c727bd59d36b52911f9ebe2efea0c0 (patch)
tree50e1d1d788c6f3a4dadf59ec341d9a05b3ca0a4f /libs/ardour
parent26843b34fdd62e6f80630868c5eb3f8fee0c17f1 (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.h5
-rw-r--r--libs/ardour/ardour/destructive_filesource.h2
-rw-r--r--libs/ardour/ardour/sndfilesource.h2
-rw-r--r--libs/ardour/audiofilesource.cc17
-rw-r--r--libs/ardour/destructive_filesource.cc21
-rw-r--r--libs/ardour/location.cc4
-rw-r--r--libs/ardour/session_time.cc5
-rw-r--r--libs/ardour/sndfilesource.cc41
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;