X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsndfilesource.cc;h=b35d36a71333664e49b0992c51f737df24196f3a;hb=e666c8e98fb95a69afae8818f22c25094adae7eb;hp=e53496434372e4b8edade139bd7b1c02ca9bf5d3;hpb=997e4b1f9cd7ccfc704b7c035051da7f60d831e7;p=ardour.git diff --git a/libs/ardour/sndfilesource.cc b/libs/ardour/sndfilesource.cc index e534964343..b35d36a713 100644 --- a/libs/ardour/sndfilesource.cc +++ b/libs/ardour/sndfilesource.cc @@ -17,17 +17,21 @@ */ +#include #include #include +#include #include #include #include #include + #include #include #include +#include #include "i18n.h" @@ -43,6 +47,7 @@ const AudioFileSource::Flag SndFileSource::default_writable_flags = AudioFileSou AudioFileSource::Removable| AudioFileSource::RemovableIfEmpty| AudioFileSource::CanRename); + SndFileSource::SndFileSource (Session& s, const XMLNode& node) : AudioFileSource (s, node) { @@ -136,44 +141,22 @@ SndFileSource::SndFileSource (Session& s, ustring path, SampleFormat sfmt, Heade if (writable() && (_flags & Broadcast)) { - _broadcast_info = new SF_BROADCAST_INFO; - memset (_broadcast_info, 0, sizeof (*_broadcast_info)); - - snprintf (_broadcast_info->description, sizeof (_broadcast_info->description), "BWF %s", _name.c_str()); - - struct utsname utsinfo; - - if (uname (&utsinfo)) { - error << string_compose(_("FileSource: cannot get host information for BWF header (%1)"), strerror(errno)) << endmsg; - return; + if (!_broadcast_info) { + _broadcast_info = new BroadcastInfo; } - - snprintf (_broadcast_info->originator, sizeof (_broadcast_info->originator), "ardour:%s:%s:%s:%s:%s)", - Glib::get_real_name().c_str(), - utsinfo.nodename, - utsinfo.sysname, - utsinfo.release, - utsinfo.version); - - _broadcast_info->version = 1; - _broadcast_info->time_reference_low = 0; - _broadcast_info->time_reference_high = 0; - - /* XXX do something about this field */ - - snprintf (_broadcast_info->umid, sizeof (_broadcast_info->umid), "%s", "fnord"); - - /* coding history is added by libsndfile */ - if (sf_command (sf, SFC_SET_BROADCAST_INFO, _broadcast_info, sizeof (_broadcast_info)) != SF_TRUE) { - char errbuf[256]; - sf_error_str (0, errbuf, sizeof (errbuf) - 1); - error << string_compose (_("cannot set broadcast info for audio file %1 (%2); dropping broadcast info for this file"), _path, errbuf) << endmsg; + _broadcast_info->set_from_session (s, header_position_offset); + _broadcast_info->set_description (string_compose ("BWF %1", _name)); + + if (!_broadcast_info->write_to_file (sf)) { + error << string_compose (_("cannot set broadcast info for audio file %1 (%2); dropping broadcast info for this file"), + _path, _broadcast_info->get_error()) + << endmsg; _flags = Flag (_flags & ~Broadcast); delete _broadcast_info; _broadcast_info = 0; - } - } + } + } } void @@ -238,14 +221,15 @@ SndFileSource::open () _length = _info.frames; - _broadcast_info = new SF_BROADCAST_INFO; - memset (_broadcast_info, 0, sizeof (*_broadcast_info)); + if (!_broadcast_info) { + _broadcast_info = new BroadcastInfo; + } - bool timecode_info_exists; + bool bwf_info_exists = _broadcast_info->load_from_file (sf); - set_timeline_position (get_timecode_info (sf, _broadcast_info, timecode_info_exists)); + set_timeline_position (bwf_info_exists ? _broadcast_info->get_time_reference() : header_position_offset); - if (_length != 0 && !timecode_info_exists) { + if (_length != 0 && !bwf_info_exists) { delete _broadcast_info; _broadcast_info = 0; _flags = Flag (_flags & ~Broadcast); @@ -275,13 +259,8 @@ SndFileSource::~SndFileSource () touch_peakfile (); } - if (_broadcast_info) { - delete _broadcast_info; - } - - if (xfade_buf) { - delete [] xfade_buf; - } + delete _broadcast_info; + delete [] xfade_buf; } float @@ -333,7 +312,12 @@ SndFileSource::read_unlocked (Sample *dst, nframes_t start, nframes_t cnt) const if (_info.channels == 1) { nframes_t ret = sf_read_float (sf, dst, file_cnt); - _read_data_count = cnt * sizeof(float); + _read_data_count = ret * sizeof(float); + if (ret != file_cnt) { + char errbuf[256]; + sf_error_str (0, errbuf, sizeof (errbuf) - 1); + cerr << string_compose(_("SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5)"), start, file_cnt, _name.substr (1), errbuf, _length) << endl; + } return ret; } } @@ -397,7 +381,7 @@ SndFileSource::nondestructive_write_unlocked (Sample *data, nframes_t cnt) } _write_data_count = cnt; - + return cnt; } @@ -529,39 +513,20 @@ SndFileSource::setup_broadcast_info (nframes_t when, struct tm& now, time_t tnow return 0; } - /* random code is 9 digits */ - - int random_code = random() % 999999999; - - snprintf (_broadcast_info->originator_reference, sizeof (_broadcast_info->originator_reference), "%2s%3s%12s%02d%02d%02d%9d", - Config->get_bwf_country_code().c_str(), - Config->get_bwf_organization_code().c_str(), - bwf_serial_number, - now.tm_hour, - now.tm_min, - now.tm_sec, - random_code); + _broadcast_info->set_originator_ref (); + _broadcast_info->set_origination_time (&now); - snprintf (_broadcast_info->origination_date, sizeof (_broadcast_info->origination_date), "%4d-%02d-%02d", - 1900 + now.tm_year, - now.tm_mon, - now.tm_mday); - - snprintf (_broadcast_info->origination_time, sizeof (_broadcast_info->origination_time), "%02d:%02d:%02d", - now.tm_hour, - now.tm_min, - now.tm_sec); - /* now update header position taking header offset into account */ set_header_timeline_position (); - 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; + if (!_broadcast_info->write_to_file (sf)) { + error << string_compose (_("cannot set broadcast info for audio file %1 (%2); dropping broadcast info for this file"), + _path, _broadcast_info->get_error()) + << endmsg; _flags = Flag (_flags & ~Broadcast); delete _broadcast_info; _broadcast_info = 0; - return -1; } return 0; @@ -574,11 +539,12 @@ SndFileSource::set_header_timeline_position () return; } - _broadcast_info->time_reference_high = (timeline_position >> 32); - _broadcast_info->time_reference_low = (timeline_position & 0xffffffff); + _broadcast_info->set_time_reference (timeline_position); - 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; + if (!_broadcast_info->write_to_file (sf)) { + error << string_compose (_("cannot set broadcast info for audio file %1 (%2); dropping broadcast info for this file"), + _path, _broadcast_info->get_error()) + << endmsg; _flags = Flag (_flags & ~Broadcast); delete _broadcast_info; _broadcast_info = 0; @@ -811,13 +777,8 @@ SndFileSource::setup_standard_crossfades (nframes_t rate) xfade_frames = (nframes_t) floor ((Config->get_destructive_xfade_msecs () / 1000.0) * rate); - if (out_coefficient) { - delete [] out_coefficient; - } - - if (in_coefficient) { - delete [] in_coefficient; - } + delete [] out_coefficient; + delete [] in_coefficient; out_coefficient = new gain_t[xfade_frames]; in_coefficient = new gain_t[xfade_frames]; @@ -842,8 +803,7 @@ SndFileSource::get_soundfile_info (const ustring& path, SoundFileInfo& info, str { SNDFILE *sf; SF_INFO sf_info; - SF_BROADCAST_INFO binfo; - bool timecode_exists; + BroadcastInfo binfo; sf_info.format = 0; // libsndfile says to clear this before sf_open(). @@ -860,37 +820,13 @@ SndFileSource::get_soundfile_info (const ustring& path, SoundFileInfo& info, str sndfile_major_format(sf_info.format), sndfile_minor_format(sf_info.format)); - memset (&binfo, 0, sizeof (binfo)); - info.timecode = get_timecode_info (sf, &binfo, timecode_exists); + info.timecode = binfo.load_from_file (sf) ? binfo.get_time_reference() : 0; - if (!timecode_exists) { - info.timecode = 0; - } - sf_close (sf); return true; } -int64_t -SndFileSource::get_timecode_info (SNDFILE* sf, SF_BROADCAST_INFO* binfo, bool& exists) -{ - if (sf_command (sf, SFC_GET_BROADCAST_INFO, binfo, sizeof (*binfo)) != SF_TRUE) { - exists = false; - return (header_position_offset); - } - - /* XXX 64 bit alert: when JACK switches to a 64 bit frame count, this needs to use the high bits - of the time reference. - */ - - exists = true; - int64_t ret = (uint32_t) binfo->time_reference_high; - ret <<= 32; - ret |= (uint32_t) binfo->time_reference_low; - return ret; -} - bool SndFileSource::one_of_several_channels () const {