summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2006-06-28 22:00:09 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2006-06-28 22:00:09 +0000
commit728835e5e7d7b5872a599d9faee1029317d8d43b (patch)
tree5e69f83bb89fece791ce196cdefc0c9baad02806 /libs
parentfdda19d3d45384fb4f158e4f1af18cc17009e478 (diff)
many fixes to audio file code, SMPTE offset now works correctly
git-svn-id: svn://localhost/ardour2/trunk@649 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/audiofilesource.h8
-rw-r--r--libs/ardour/ardour/destructive_filesource.h3
-rw-r--r--libs/ardour/ardour/sndfilesource.h5
-rw-r--r--libs/ardour/audio_diskstream.cc1
-rw-r--r--libs/ardour/audio_track.cc8
-rw-r--r--libs/ardour/audiofilesource.cc52
-rw-r--r--libs/ardour/po/el_GR.po38
-rw-r--r--libs/ardour/po/it_IT.po38
-rw-r--r--libs/ardour/po/ru_RU.po38
-rw-r--r--libs/ardour/session_time.cc1
-rw-r--r--libs/ardour/sndfilesource.cc94
-rw-r--r--libs/libsndfile/src/sndfile.c4
12 files changed, 159 insertions, 131 deletions
diff --git a/libs/ardour/ardour/audiofilesource.h b/libs/ardour/ardour/audiofilesource.h
index 9e7c6facae..36251c07ff 100644
--- a/libs/ardour/ardour/audiofilesource.h
+++ b/libs/ardour/ardour/audiofilesource.h
@@ -42,7 +42,7 @@ class AudioFileSource : public AudioSource {
Removable = 0x8,
RemovableIfEmpty = 0x10,
RemoveAtDestroy = 0x20,
- BuildPeaks = 0x40
+ NoPeakFile = 0x40
};
virtual ~AudioFileSource ();
@@ -62,7 +62,7 @@ class AudioFileSource : public AudioSource {
cannot.
*/
- static AudioFileSource* create (const string& path_plus_channel);
+ static AudioFileSource* create (const string& path_plus_channel, Flag flags = Flag (0));
static AudioFileSource* create (const XMLNode&);
static bool get_soundfile_info (string path, SoundFileInfo& _info, string& error);
@@ -97,7 +97,7 @@ class AudioFileSource : public AudioSource {
static void set_search_path (string);
static void set_header_position_offset (jack_nframes_t offset, bool negative);
- static sigc::signal<void,struct tm*, time_t> HeaderPositionOffsetChanged;
+ static sigc::signal<void> HeaderPositionOffsetChanged;
XMLNode& get_state ();
int set_state (const XMLNode&);
@@ -107,7 +107,7 @@ class AudioFileSource : public AudioSource {
to cause issues.
*/
- void handle_header_position_change (struct tm*, time_t tnow);
+ void handle_header_position_change ();
protected:
diff --git a/libs/ardour/ardour/destructive_filesource.h b/libs/ardour/ardour/destructive_filesource.h
index c92a0762ee..2d10528ac8 100644
--- a/libs/ardour/ardour/destructive_filesource.h
+++ b/libs/ardour/ardour/destructive_filesource.h
@@ -32,8 +32,7 @@ namespace ARDOUR {
class DestructiveFileSource : public SndFileSource {
public:
DestructiveFileSource (std::string path, SampleFormat samp_format, HeaderFormat hdr_format, jack_nframes_t rate,
- Flag flags = AudioFileSource::Flag (AudioFileSource::Writable|
- AudioFileSource::BuildPeaks));
+ Flag flags = AudioFileSource::Flag (AudioFileSource::Writable));
DestructiveFileSource (const XMLNode&);
~DestructiveFileSource ();
diff --git a/libs/ardour/ardour/sndfilesource.h b/libs/ardour/ardour/sndfilesource.h
index d146bb5793..5e3c1f621d 100644
--- a/libs/ardour/ardour/sndfilesource.h
+++ b/libs/ardour/ardour/sndfilesource.h
@@ -39,8 +39,7 @@ class SndFileSource : public AudioFileSource {
Flag flags = AudioFileSource::Flag (AudioFileSource::Writable|
AudioFileSource::Removable|
AudioFileSource::RemovableIfEmpty|
- AudioFileSource::CanRename|
- AudioFileSource::BuildPeaks));
+ AudioFileSource::CanRename));
/* constructor to be called for existing in-session files */
@@ -52,7 +51,7 @@ class SndFileSource : public AudioFileSource {
int update_header (jack_nframes_t when, struct tm&, time_t);
int flush_header ();
- static Flag default_in_session_flags();
+ void handle_smpte_offset_change (jack_nframes_t offset, bool negative);
protected:
void set_header_timeline_position ();
diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc
index 69f00efe68..96615fd077 100644
--- a/libs/ardour/audio_diskstream.cc
+++ b/libs/ardour/audio_diskstream.cc
@@ -1754,6 +1754,7 @@ AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_ca
srcs.push_back (s);
if ((fsrc = dynamic_cast<AudioFileSource *>(s)) != 0) {
+ cerr << "updating source after capture\n";
fsrc->update_header (capture_info.front()->start, when, twhen);
}
diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc
index ae24d3a577..74b7dd071c 100644
--- a/libs/ardour/audio_track.cc
+++ b/libs/ardour/audio_track.cc
@@ -94,14 +94,6 @@ AudioTrack::~AudioTrack ()
}
}
-#if 0
-void
-AudioTrack::handle_smpte_offset_change ()
-{
- diskstream
-}
-#endif
-
int
AudioTrack::deprecated_use_diskstream_connections ()
{
diff --git a/libs/ardour/audiofilesource.cc b/libs/ardour/audiofilesource.cc
index b22e27b727..0663f5f9b1 100644
--- a/libs/ardour/audiofilesource.cc
+++ b/libs/ardour/audiofilesource.cc
@@ -55,9 +55,9 @@ using namespace PBD;
string AudioFileSource::peak_dir = "";
string AudioFileSource::search_path;
-sigc::signal<void,struct tm*, time_t> AudioFileSource::HeaderPositionOffsetChanged;
-bool AudioFileSource::header_position_negative;
-uint64_t AudioFileSource::header_position_offset;
+sigc::signal<void> AudioFileSource::HeaderPositionOffsetChanged;
+bool AudioFileSource::header_position_negative;
+uint64_t AudioFileSource::header_position_offset;
char AudioFileSource::bwf_country_code[3] = "US";
char AudioFileSource::bwf_organization_code[4] = "LAS";
@@ -122,7 +122,6 @@ AudioFileSource::init (string pathstr, bool must_exist)
next_peak_clear_should_notify = false;
if (!find (pathstr, must_exist, is_new)) {
- cerr << "cannot find " << pathstr << " with me = " << must_exist << endl;
return -1;
}
@@ -211,16 +210,16 @@ AudioFileSource::create (const XMLNode& node)
#ifdef HAVE_COREAUDIO
AudioFileSource*
-AudioFileSource::create (const string& idstr)
+AudioFileSource::create (const string& idstr, Flag flags)
{
AudioFileSource* es = 0;
try {
- es = new CoreAudioSource (idstr, Flag(0x0));
+ es = new CoreAudioSource (idstr, flags);
}
catch (failed_constructor& err) {
- es = new SndFileSource (idstr, Flag(0x0));
+ es = new SndFileSource (idstr, flags);
}
return es;
@@ -229,9 +228,9 @@ AudioFileSource::create (const string& idstr)
#else
AudioFileSource*
-AudioFileSource::create (const string& idstr)
+AudioFileSource::create (const string& idstr, Flag flags)
{
- return new SndFileSource (idstr, Flag(0x0));
+ return new SndFileSource (idstr, flags);
}
#endif // HAVE_COREAUDIO
@@ -595,33 +594,28 @@ AudioFileSource::set_search_path (string p)
void
AudioFileSource::set_header_position_offset (jack_nframes_t offset, bool negative)
{
- time_t tnow;
-
- time (&tnow);
-
header_position_offset = offset;
header_position_negative = negative;
- HeaderPositionOffsetChanged (localtime (&tnow), tnow); /* EMIT SIGNAL */
-}
-void
-AudioFileSource::set_timeline_position (jack_nframes_t pos)
-{
- timeline_position = pos;
+ HeaderPositionOffsetChanged ();
}
-void
-AudioFileSource::handle_header_position_change (struct tm* now, time_t tnow)
+void
+AudioFileSource::handle_header_position_change ()
{
- /* don't do this if the file has never had its header flushed to disk yet */
-
- if (writable() && _timestamp) {
+ if (writable()) {
set_header_timeline_position ();
flush_header ();
}
}
void
+AudioFileSource::set_timeline_position (jack_nframes_t pos)
+{
+ timeline_position = pos;
+}
+
+void
AudioFileSource::set_allow_remove_if_empty (bool yn)
{
if (writable()) {
@@ -655,8 +649,14 @@ AudioFileSource::set_name (string newname, bool destructive)
bool
AudioFileSource::is_empty (string path)
{
- /* XXX fix me */
+ bool ret = false;
+ AudioFileSource* afs = create (path, NoPeakFile);
- return false;
+ if (afs) {
+ ret = (afs->length() == 0);
+ delete afs;
+ }
+
+ return ret;
}
diff --git a/libs/ardour/po/el_GR.po b/libs/ardour/po/el_GR.po
index fb235155f3..33c1bb6e85 100644
--- a/libs/ardour/po/el_GR.po
+++ b/libs/ardour/po/el_GR.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: libardour 0.664.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-06-21 15:09-0400\n"
+"POT-Creation-Date: 2006-06-27 13:00-0400\n"
"PO-Revision-Date: 2003-05-21 12:50+0500\n"
"Last-Translator: Muadibas\n"
"Language-Team: Hellenic(Greek)\n"
@@ -198,77 +198,77 @@ msgid "programming error: AudioTrack given state without diskstream!"
msgstr ""
"σφάλμα προγραμματισμού: εδόθη κατάσταση στην AudioTrack δίχως diskstream!"
-#: libs/ardour/audioengine.cc:150
+#: libs/ardour/audioengine.cc:144
msgid "cannot activate JACK client"
msgstr "Ο JACK δεν μπορεί να ενεργοποιηθεί"
-#: libs/ardour/audioengine.cc:401
+#: libs/ardour/audioengine.cc:395
msgid "register audio input port called before engine was started"
msgstr "η register audio input port εκλήθη πριν να εκκινηθεί η engine"
-#: libs/ardour/audioengine.cc:432
+#: libs/ardour/audioengine.cc:426
msgid "register audio output port called before engine was started"
msgstr "η register audio output port εκλήθη πρίν να εκκινηθεί η engine"
-#: libs/ardour/audioengine.cc:493
+#: libs/ardour/audioengine.cc:487
msgid "connect called before engine was started"
msgstr "η σύνδεση εκλήθη πριν να εκκινηθεί η engine"
-#: libs/ardour/audioengine.cc:509
+#: libs/ardour/audioengine.cc:503
msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
msgstr ""
-#: libs/ardour/audioengine.cc:522 libs/ardour/audioengine.cc:551
+#: libs/ardour/audioengine.cc:516 libs/ardour/audioengine.cc:545
msgid "disconnect called before engine was started"
msgstr "η αποσύνδεση εκλήθη πριν να εκκινηθεί η engine"
-#: libs/ardour/audioengine.cc:609
+#: libs/ardour/audioengine.cc:603
msgid "get_port_by_name() called before engine was started"
msgstr "η ρουτίνα get_port_by_name() εκλήθη πριν να εκκινηθεί η engine"
-#: libs/ardour/audioengine.cc:642
+#: libs/ardour/audioengine.cc:636
msgid "get_ports called before engine was started"
msgstr "η ρουτίνα get_ports εκλήθη πριν να εκκινηθεί η engine"
-#: libs/ardour/audioengine.cc:717
+#: libs/ardour/audioengine.cc:711
msgid "get_nth_physical called before engine was started"
msgstr "η ρουτίνα get_nth_physical εκλήθη πριν να εκκινηθεί η engine"
-#: libs/ardour/audioengine.cc:745
+#: libs/ardour/audioengine.cc:739
#, fuzzy
msgid "get_port_total_latency() called with no JACK client connection"
msgstr "η ρουτίνα get_port_total_latency() εκλήθη πριν να εκκινηθεί η engine"
-#: libs/ardour/audioengine.cc:751
+#: libs/ardour/audioengine.cc:745
msgid "get_port_total_latency() called before engine was started"
msgstr "η ρουτίνα get_port_total_latency() εκλήθη πριν να εκκινηθεί η engine"
-#: libs/ardour/audioengine.cc:875
+#: libs/ardour/audioengine.cc:869
msgid "Unable to connect to JACK server"
msgstr ""
-#: libs/ardour/audioengine.cc:878
+#: libs/ardour/audioengine.cc:872
msgid "Could not connect to JACK server as \"%1\""
msgstr ""
-#: libs/ardour/audioengine.cc:883
+#: libs/ardour/audioengine.cc:877
msgid "JACK server started"
msgstr ""
-#: libs/ardour/audioengine.cc:917
+#: libs/ardour/audioengine.cc:911
msgid "cannot shutdown connection to JACK"
msgstr ""
-#: libs/ardour/audioengine.cc:942
+#: libs/ardour/audioengine.cc:936
msgid "failed to connect to JACK"
msgstr ""
-#: libs/ardour/audioengine.cc:958
+#: libs/ardour/audioengine.cc:952
#, fuzzy
msgid "could not reregister %1"
msgstr "Σφάλμα: δεν μπόρεσα να γράψω %1"
-#: libs/ardour/audioengine.cc:1015
+#: libs/ardour/audioengine.cc:1009
msgid "could not reconnect %1 and %2 (err = %3)"
msgstr ""
diff --git a/libs/ardour/po/it_IT.po b/libs/ardour/po/it_IT.po
index 55368c2d5a..63089ea77f 100644
--- a/libs/ardour/po/it_IT.po
+++ b/libs/ardour/po/it_IT.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: libardour 0.664.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-06-21 15:09-0400\n"
+"POT-Creation-Date: 2006-06-27 13:00-0400\n"
"PO-Revision-Date: 2003-05-21 12:50+0500\n"
"Last-Translator: Filippo Pappalardo <filippo@email.it>\n"
"Language-Team: Italian\n"
@@ -183,88 +183,88 @@ msgstr ""
msgid "programming error: AudioTrack given state without diskstream!"
msgstr ""
-#: libs/ardour/audioengine.cc:150
+#: libs/ardour/audioengine.cc:144
msgid "cannot activate JACK client"
msgstr "impossibile attivare il client JACK"
-#: libs/ardour/audioengine.cc:401
+#: libs/ardour/audioengine.cc:395
msgid "register audio input port called before engine was started"
msgstr ""
"la richiesta di registrazione di una porta di entrata avvenuta prima "
"dell'avvio dell'applicazione"
-#: libs/ardour/audioengine.cc:432
+#: libs/ardour/audioengine.cc:426
msgid "register audio output port called before engine was started"
msgstr ""
"la richiesta di registrazione di una porta di uscita avvenuta prima "
"dell'avvio dell'applicazione"
-#: libs/ardour/audioengine.cc:493
+#: libs/ardour/audioengine.cc:487
msgid "connect called before engine was started"
msgstr "richiesta di connessione avvenuta prima dell'avvio dell'applicazione"
-#: libs/ardour/audioengine.cc:509
+#: libs/ardour/audioengine.cc:503
msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
msgstr ""
-#: libs/ardour/audioengine.cc:522 libs/ardour/audioengine.cc:551
+#: libs/ardour/audioengine.cc:516 libs/ardour/audioengine.cc:545
msgid "disconnect called before engine was started"
msgstr ""
"richiesta di disconnessione avvenuta prima dell'avvio dell'applicazione"
-#: libs/ardour/audioengine.cc:609
+#: libs/ardour/audioengine.cc:603
msgid "get_port_by_name() called before engine was started"
msgstr ""
"richiesta get_port_by_name() avvenuta prima dell'avvio dell'applicazione"
-#: libs/ardour/audioengine.cc:642
+#: libs/ardour/audioengine.cc:636
msgid "get_ports called before engine was started"
msgstr "richiesta di get_ports avvenuta prima dell'avvio dell'applicazione"
-#: libs/ardour/audioengine.cc:717
+#: libs/ardour/audioengine.cc:711
msgid "get_nth_physical called before engine was started"
msgstr ""
"richiesta di get_nth_physical avvenuta prima dell'avvio dell'applicazione"
-#: libs/ardour/audioengine.cc:745
+#: libs/ardour/audioengine.cc:739
#, fuzzy
msgid "get_port_total_latency() called with no JACK client connection"
msgstr ""
"richiesta di get_port_total_latency() avvenuta prima dell'avvio "
"dell'applicazione"
-#: libs/ardour/audioengine.cc:751
+#: libs/ardour/audioengine.cc:745
msgid "get_port_total_latency() called before engine was started"
msgstr ""
"richiesta di get_port_total_latency() avvenuta prima dell'avvio "
"dell'applicazione"
-#: libs/ardour/audioengine.cc:875
+#: libs/ardour/audioengine.cc:869
msgid "Unable to connect to JACK server"
msgstr ""
-#: libs/ardour/audioengine.cc:878
+#: libs/ardour/audioengine.cc:872
msgid "Could not connect to JACK server as \"%1\""
msgstr ""
-#: libs/ardour/audioengine.cc:883
+#: libs/ardour/audioengine.cc:877
msgid "JACK server started"
msgstr ""
-#: libs/ardour/audioengine.cc:917
+#: libs/ardour/audioengine.cc:911
msgid "cannot shutdown connection to JACK"
msgstr ""
-#: libs/ardour/audioengine.cc:942
+#: libs/ardour/audioengine.cc:936
msgid "failed to connect to JACK"
msgstr ""
-#: libs/ardour/audioengine.cc:958
+#: libs/ardour/audioengine.cc:952
#, fuzzy
msgid "could not reregister %1"
msgstr "Esportazione: impossibile scrivere dati sul file di output (%1)"
-#: libs/ardour/audioengine.cc:1015
+#: libs/ardour/audioengine.cc:1009
msgid "could not reconnect %1 and %2 (err = %3)"
msgstr ""
diff --git a/libs/ardour/po/ru_RU.po b/libs/ardour/po/ru_RU.po
index 922d304e2d..2ca30cba55 100644
--- a/libs/ardour/po/ru_RU.po
+++ b/libs/ardour/po/ru_RU.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: libardour 0.716.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-06-21 15:09-0400\n"
+"POT-Creation-Date: 2006-06-27 13:00-0400\n"
"PO-Revision-Date: 2004-03-31 00:55+0300\n"
"Last-Translator: Igor Blinov pitstop@nm.ru\n"
"Language-Team: Russian\n"
@@ -171,75 +171,75 @@ msgstr ""
msgid "programming error: AudioTrack given state without diskstream!"
msgstr ""
-#: libs/ardour/audioengine.cc:150
+#: libs/ardour/audioengine.cc:144
msgid "cannot activate JACK client"
msgstr " JACK "
-#: libs/ardour/audioengine.cc:401
+#: libs/ardour/audioengine.cc:395
msgid "register audio input port called before engine was started"
msgstr ""
-#: libs/ardour/audioengine.cc:432
+#: libs/ardour/audioengine.cc:426
msgid "register audio output port called before engine was started"
msgstr ""
-#: libs/ardour/audioengine.cc:493
+#: libs/ardour/audioengine.cc:487
msgid "connect called before engine was started"
msgstr ""
-#: libs/ardour/audioengine.cc:509
+#: libs/ardour/audioengine.cc:503
msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
msgstr ""
-#: libs/ardour/audioengine.cc:522 libs/ardour/audioengine.cc:551
+#: libs/ardour/audioengine.cc:516 libs/ardour/audioengine.cc:545
msgid "disconnect called before engine was started"
msgstr ""
-#: libs/ardour/audioengine.cc:609
+#: libs/ardour/audioengine.cc:603
msgid "get_port_by_name() called before engine was started"
msgstr ""
-#: libs/ardour/audioengine.cc:642
+#: libs/ardour/audioengine.cc:636
msgid "get_ports called before engine was started"
msgstr ""
-#: libs/ardour/audioengine.cc:717
+#: libs/ardour/audioengine.cc:711
msgid "get_nth_physical called before engine was started"
msgstr ""
-#: libs/ardour/audioengine.cc:745
+#: libs/ardour/audioengine.cc:739
msgid "get_port_total_latency() called with no JACK client connection"
msgstr ""
-#: libs/ardour/audioengine.cc:751
+#: libs/ardour/audioengine.cc:745
msgid "get_port_total_latency() called before engine was started"
msgstr ""
-#: libs/ardour/audioengine.cc:875
+#: libs/ardour/audioengine.cc:869
msgid "Unable to connect to JACK server"
msgstr ""
-#: libs/ardour/audioengine.cc:878
+#: libs/ardour/audioengine.cc:872
msgid "Could not connect to JACK server as \"%1\""
msgstr ""
-#: libs/ardour/audioengine.cc:883
+#: libs/ardour/audioengine.cc:877
msgid "JACK server started"
msgstr ""
-#: libs/ardour/audioengine.cc:917
+#: libs/ardour/audioengine.cc:911
msgid "cannot shutdown connection to JACK"
msgstr ""
-#: libs/ardour/audioengine.cc:942
+#: libs/ardour/audioengine.cc:936
msgid "failed to connect to JACK"
msgstr ""
-#: libs/ardour/audioengine.cc:958
+#: libs/ardour/audioengine.cc:952
msgid "could not reregister %1"
msgstr ""
-#: libs/ardour/audioengine.cc:1015
+#: libs/ardour/audioengine.cc:1009
msgid "could not reconnect %1 and %2 (err = %3)"
msgstr ""
diff --git a/libs/ardour/session_time.cc b/libs/ardour/session_time.cc
index 07b702618e..0e52c926fe 100644
--- a/libs/ardour/session_time.cc
+++ b/libs/ardour/session_time.cc
@@ -109,7 +109,6 @@ Session::set_smpte_offset_negative (bool neg)
SMPTEOffsetChanged (); /* EMIT SIGNAL */
}
-
void
Session::smpte_to_sample( SMPTE::Time& smpte, jack_nframes_t& sample, bool use_offset, bool use_subframes ) const
{
diff --git a/libs/ardour/sndfilesource.cc b/libs/ardour/sndfilesource.cc
index 24a70f636b..443a24e3c2 100644
--- a/libs/ardour/sndfilesource.cc
+++ b/libs/ardour/sndfilesource.cc
@@ -55,6 +55,7 @@ SndFileSource::SndFileSource (const XMLNode& node)
}
SndFileSource::SndFileSource (string idstr, Flag flags)
+ /* files created this way are never writable or removable */
: AudioFileSource (idstr, Flag (flags & ~(Writable|Removable|RemovableIfEmpty|RemoveAtDestroy)))
{
init (idstr);
@@ -63,7 +64,7 @@ SndFileSource::SndFileSource (string idstr, Flag flags)
throw failed_constructor ();
}
- if (_build_peakfiles) {
+ if (!(_flags & NoPeakFile) && _build_peakfiles) {
if (initialize_peakfile (false, _path)) {
sf_close (sf);
sf = 0;
@@ -170,9 +171,10 @@ SndFileSource::SndFileSource (string idstr, SampleFormat sfmt, HeaderFormat hf,
delete _broadcast_info;
_broadcast_info = 0;
}
+
}
- if (_build_peakfiles) {
+ if (!(_flags & NoPeakFile) && _build_peakfiles) {
if (initialize_peakfile (true, _path)) {
sf_close (sf);
sf = 0;
@@ -180,12 +182,6 @@ SndFileSource::SndFileSource (string idstr, SampleFormat sfmt, HeaderFormat hf,
}
}
- /* since SndFileSource's constructed with this constructor can be writable, make sure we update if the header info changes */
-
- if (writable()) {
- HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioFileSource::handle_header_position_change));
- }
-
AudioSourceCreated (this); /* EMIT SIGNAL */
}
@@ -235,34 +231,56 @@ SndFileSource::open ()
_length = _info.frames;
+
+ _broadcast_info = (SF_BROADCAST_INFO*) calloc (1, sizeof (SF_BROADCAST_INFO));
+
+ /* lookup broadcast info */
+
+ if (sf_command (sf, SFC_GET_BROADCAST_INFO, _broadcast_info, sizeof (*_broadcast_info)) != SF_TRUE) {
+
+ /* if the file has data but no broadcast info, then clearly, there is no broadcast info */
+
+ if (_length) {
+ free (_broadcast_info);
+ _broadcast_info = 0;
+ _flags = Flag (_flags & ~Broadcast);
+ }
+
+ } else {
+
+ /* XXX 64 bit alert: when JACK switches to a 64 bit frame count, this needs to use the high bits
+ of the time reference.
+ */
+
+ 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;
}
-void
-SndFileSource::close ()
+SndFileSource::~SndFileSource ()
{
+ GoingAway (this); /* EMIT SIGNAL */
+
if (sf) {
sf_close (sf);
sf = 0;
}
-}
-
-SndFileSource::~SndFileSource ()
-{
- GoingAway (this); /* EMIT SIGNAL */
-
- close ();
if (interleave_buf) {
delete [] interleave_buf;
}
if (_broadcast_info) {
- delete [] _broadcast_info;
+ free (_broadcast_info);
}
}
@@ -404,27 +422,38 @@ SndFileSource::write_unlocked (Sample *data, jack_nframes_t cnt, char * workbuf)
int
SndFileSource::update_header (jack_nframes_t when, struct tm& now, time_t tnow)
{
- /* allow derived classes to override how this is done */
-
set_timeline_position (when);
if (_flags & Broadcast) {
- /* this will flush the header implicitly */
- return setup_broadcast_info (when, now, tnow);
- } else {
- return flush_header ();
- }
+ if (setup_broadcast_info (when, now, tnow)) {
+ return -1;
+ }
+ }
+
+ return flush_header ();
}
int
SndFileSource::flush_header ()
{
+ if (!writable() || (sf == 0)) {
+ return -1;
+ }
+
return (sf_command (sf, SFC_UPDATE_HEADER_NOW, 0, 0) != SF_TRUE);
}
int
SndFileSource::setup_broadcast_info (jack_nframes_t when, struct tm& now, time_t tnow)
{
+ if (!writable()) {
+ return -1;
+ }
+
+ if (!(_flags & Broadcast)) {
+ return 0;
+ }
+
/* random code is 9 digits */
int random_code = random() % 999999999;
@@ -452,12 +481,10 @@ SndFileSource::setup_broadcast_info (jack_nframes_t when, struct tm& now, time_t
set_header_timeline_position ();
- /* note that libsndfile flushes the header to disk when resetting the broadcast info */
-
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;
_flags = Flag (_flags & ~Broadcast);
- delete _broadcast_info;
+ free (_broadcast_info);
_broadcast_info = 0;
return -1;
}
@@ -470,6 +497,10 @@ SndFileSource::set_header_timeline_position ()
{
uint64_t pos;
+ if (!(_flags & Broadcast)) {
+ return;
+ }
+
_broadcast_info->time_reference_high = 0;
if (header_position_negative) {
@@ -491,6 +522,13 @@ SndFileSource::set_header_timeline_position ()
_broadcast_info->time_reference_high = (pos >> 32);
_broadcast_info->time_reference_low = (pos & 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;
+ _flags = Flag (_flags & ~Broadcast);
+ free (_broadcast_info);
+ _broadcast_info = 0;
+ }
}
jack_nframes_t
diff --git a/libs/libsndfile/src/sndfile.c b/libs/libsndfile/src/sndfile.c
index b627c88ffe..47b74cfd7f 100644
--- a/libs/libsndfile/src/sndfile.c
+++ b/libs/libsndfile/src/sndfile.c
@@ -1087,7 +1087,7 @@ sf_command (SNDFILE *sndfile, int command, void *data, int datasize)
broadcast_info_copy (psf->broadcast_info, data) ;
broadcast_add_coding_history (psf->broadcast_info, psf->sf.channels, psf->sf.samplerate) ;
- if (psf->write_header)
+ if (psf->auto_header && psf->write_header)
psf->write_header (psf, SF_TRUE) ;
return SF_TRUE ;
@@ -1210,7 +1210,7 @@ sf_seek (SNDFILE *sndfile, sf_count_t offset, int whence)
if (psf->error)
return PSF_SEEK_ERROR ;
-#ifdef ECDL_ORIGINAL#
+#ifdef ECDL_ORIGINAL
if (seek_from_start < 0 || seek_from_start > psf->sf.frames)
{ psf->error = SFE_BAD_SEEK ;
return PSF_SEEK_ERROR ;