diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2006-06-28 22:00:09 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2006-06-28 22:00:09 +0000 |
commit | 728835e5e7d7b5872a599d9faee1029317d8d43b (patch) | |
tree | 5e69f83bb89fece791ce196cdefc0c9baad02806 /libs | |
parent | fdda19d3d45384fb4f158e4f1af18cc17009e478 (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.h | 8 | ||||
-rw-r--r-- | libs/ardour/ardour/destructive_filesource.h | 3 | ||||
-rw-r--r-- | libs/ardour/ardour/sndfilesource.h | 5 | ||||
-rw-r--r-- | libs/ardour/audio_diskstream.cc | 1 | ||||
-rw-r--r-- | libs/ardour/audio_track.cc | 8 | ||||
-rw-r--r-- | libs/ardour/audiofilesource.cc | 52 | ||||
-rw-r--r-- | libs/ardour/po/el_GR.po | 38 | ||||
-rw-r--r-- | libs/ardour/po/it_IT.po | 38 | ||||
-rw-r--r-- | libs/ardour/po/ru_RU.po | 38 | ||||
-rw-r--r-- | libs/ardour/session_time.cc | 1 | ||||
-rw-r--r-- | libs/ardour/sndfilesource.cc | 94 | ||||
-rw-r--r-- | libs/libsndfile/src/sndfile.c | 4 |
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 ; |