diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 635b78334b..a9b297d505 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -543,6 +543,7 @@ enum HeaderFormat { RF64, RF64_WAV, MBWF, + FLAC, }; struct PeakData { diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index 5b7bbe457d..4ff286a1d7 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -380,6 +380,7 @@ setup_enum_writer () REGISTER_ENUM (RF64); REGISTER_ENUM (RF64_WAV); REGISTER_ENUM (MBWF); + REGISTER_ENUM (FLAC); REGISTER (_HeaderFormat); REGISTER_ENUM (AudioUnit); diff --git a/libs/ardour/luabindings.cc b/libs/ardour/luabindings.cc index 36c63a9269..899e98a7fe 100644 --- a/libs/ardour/luabindings.cc +++ b/libs/ardour/luabindings.cc @@ -1947,6 +1947,7 @@ LuaBindings::common (lua_State* L) .addConst ("RF64", ARDOUR::HeaderFormat(RF64)) .addConst ("RF64_WAV", ARDOUR::HeaderFormat(RF64_WAV)) .addConst ("MBWF", ARDOUR::HeaderFormat(MBWF)) + .addConst ("FLAC", ARDOUR::HeaderFormat(FLAC)) .endNamespace () .beginNamespace ("InsertMergePolicy") diff --git a/libs/ardour/sndfilesource.cc b/libs/ardour/sndfilesource.cc index df228cb69e..ac10f94ae1 100644 --- a/libs/ardour/sndfilesource.cc +++ b/libs/ardour/sndfilesource.cc @@ -133,6 +133,15 @@ SndFileSource::SndFileSource (Session& s, const string& path, const string& orig _flags = Flag (_flags & ~Broadcast); break; + case FLAC: + fmt = SF_FORMAT_FLAC; + if (sfmt == FormatFloat) { + sfmt = FormatInt24; + } + _flags = Flag (_flags & ~Broadcast); + _flags = Flag (_flags & ~Destructive); // XXX or force WAV if destructive? + break; + case AIFF: fmt = SF_FORMAT_AIFF; _flags = Flag (_flags & ~Broadcast); @@ -384,8 +393,8 @@ SndFileSource::open () } if ((_info.format & SF_FORMAT_TYPEMASK ) == SF_FORMAT_FLAC) { - assert (!writable()); - _sndfile = sf_open_fd (fd, SFM_READ, &_info, true); + assert (!destructive()); + _sndfile = sf_open_fd (fd, writable () ? SFM_WRITE : SFM_READ, &_info, true); } else { _sndfile = sf_open_fd (fd, writable() ? SFM_RDWR : SFM_READ, &_info, true); } diff --git a/libs/ardour/utils.cc b/libs/ardour/utils.cc index dd893f399d..96a1b8a2e4 100644 --- a/libs/ardour/utils.cc +++ b/libs/ardour/utils.cc @@ -568,6 +568,8 @@ ARDOUR::native_header_format_extension (HeaderFormat hf, const DataType& type) return ".aif"; case iXML: return ".ixml"; + case FLAC: + return ".flac"; case RF64: case RF64_WAV: case MBWF: