remove all duplicated _id members from children of PBD::Stateful.

Sources now know about Session.
rearrange session directory heirarchy. remove tape_dir stuff. 
NSD allows absolute/relative paths to be typed straight into the text entry.
Session history reloaded after all 3rd party registrations done.
Editor restores its ID; other objects still need this.
use g_mkdir_with_parents() instead of mkdir()
one example of using g_file_test() instead of access.




git-svn-id: svn://localhost/ardour2/trunk@908 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis
2006-09-07 15:07:14 +00:00
parent babf75d871
commit f2c8ae66c0
50 changed files with 349 additions and 306 deletions

View File

@@ -61,8 +61,6 @@ class AudioDiskstream : public Diskstream
AudioDiskstream (Session &, const XMLNode&);
~AudioDiskstream();
const PBD::ID& id() const { return _id; }
float playback_buffer_load() const;
float capture_buffer_load() const;

View File

@@ -75,7 +75,7 @@ class AudioFileSource : public AudioSource {
int move_to_trash (const string trash_dir_name);
static bool is_empty (string path);
static bool is_empty (Session&, string path);
void mark_streaming_write_completed ();
void mark_take (string);
@@ -104,16 +104,16 @@ class AudioFileSource : public AudioSource {
/* constructor to be called for existing external-to-session files */
AudioFileSource (std::string path, Flag flags);
AudioFileSource (Session&, std::string path, Flag flags);
/* constructor to be called for new in-session files */
AudioFileSource (std::string path, Flag flags,
AudioFileSource (Session&, std::string path, Flag flags,
SampleFormat samp_format, HeaderFormat hdr_format);
/* constructor to be called for existing in-session files */
AudioFileSource (const XMLNode&);
AudioFileSource (Session&, const XMLNode&);
int init (string idstr, bool must_exist);

View File

@@ -111,6 +111,8 @@ class AudioPlaylist : public ARDOUR::Playlist
bool region_changed (Change, boost::shared_ptr<Region>);
void crossfade_changed (Change);
void add_crossfade (Crossfade&);
void source_offset_changed (boost::shared_ptr<AudioRegion> region);
};
} /* namespace ARDOUR */

View File

@@ -187,6 +187,7 @@ class AudioRegion : public Region
void recompute_at_end ();
void envelope_changed (Change);
void source_offset_changed ();
void source_deleted (boost::shared_ptr<Source>);

View File

@@ -47,8 +47,8 @@ const jack_nframes_t frames_per_peak = 256;
class AudioSource : public Source
{
public:
AudioSource (string name);
AudioSource (const XMLNode&);
AudioSource (Session&, string name);
AudioSource (Session&, const XMLNode&);
virtual ~AudioSource ();
/* one could argue that this should belong to Source, but other data types

View File

@@ -159,8 +159,6 @@ struct ControlEvent {
XMLNode &get_state(void);
int set_state (const XMLNode &s);
PBD::ID id() { return _id; }
void set_max_xval (double);
double get_max_xval() const { return max_xval; }
@@ -189,7 +187,7 @@ struct ControlEvent {
static sigc::signal<void, AutomationList*> AutomationListCreated;
protected:
PBD::ID _id;
struct State : public ARDOUR::StateManager::State {
AutomationEventList events;

View File

@@ -31,12 +31,12 @@ namespace ARDOUR {
class DestructiveFileSource : public SndFileSource {
public:
DestructiveFileSource (std::string path, SampleFormat samp_format, HeaderFormat hdr_format, jack_nframes_t rate,
DestructiveFileSource (Session&, std::string path, SampleFormat samp_format, HeaderFormat hdr_format, jack_nframes_t rate,
Flag flags = AudioFileSource::Flag (AudioFileSource::Writable));
DestructiveFileSource (std::string path, Flag flags);
DestructiveFileSource (Session&, std::string path, Flag flags);
DestructiveFileSource (const XMLNode&);
DestructiveFileSource (Session&, const XMLNode&);
~DestructiveFileSource ();
jack_nframes_t last_capture_start_frame() const;

View File

@@ -92,7 +92,6 @@ class IO;
bool destructive() const { return _flags & Destructive; }
virtual void set_destructive (bool yn);
const PBD::ID& id() const { return _id; }
bool hidden() const { return _flags & Hidden; }
bool recordable() const { return _flags & Recordable; }
bool reversed() const { return _actual_speed < 0.0f; }
@@ -244,7 +243,6 @@ class IO;
ARDOUR::Session& _session;
ARDOUR::IO* _io;
uint32_t _n_channels;
PBD::ID _id;
Playlist* _playlist;
mutable gint _record_enabled;

View File

@@ -253,8 +253,6 @@ public:
void start_pan_touch (uint32_t which);
void end_pan_touch (uint32_t which);
const PBD::ID& id() const { return _id; }
void defer_pan_reset ();
void allow_pan_reset ();
@@ -282,7 +280,6 @@ public:
string _name;
Connection* _input_connection;
Connection* _output_connection;
PBD::ID _id;
bool no_panner_reset;
XMLNode* deferred_state;
DataType _default_type;

View File

@@ -121,10 +121,7 @@ class Location : public sigc::trackable, public PBD::StatefulDestructible
XMLNode& get_state (void);
int set_state (const XMLNode&);
PBD::ID id() { return _id; }
private:
PBD::ID _id;
string _name;
jack_nframes_t _start;
jack_nframes_t _end;
@@ -150,7 +147,6 @@ class Locations : public StateManager, public PBD::StatefulDestructible
XMLNode& get_state (void);
int set_state (const XMLNode&);
PBD::ID id() { return _id; }
Location *get_location_by_id(PBD::ID);
Location* auto_loop_location () const;
@@ -204,8 +200,6 @@ class Locations : public StateManager, public PBD::StatefulDestructible
Change restore_state (StateManager::State&);
StateManager::State* state_factory (std::string why) const;
PBD::ID _id;
};
} // namespace ARDOUR

View File

@@ -78,7 +78,6 @@ class Playlist : public StateManager, public PBD::StatefulDestructible {
EditMode get_edit_mode() const { return _edit_mode; }
void set_edit_mode (EditMode);
PBD::ID id() { return _id; }
/* Editing operations */
void add_region (boost::shared_ptr<Region>, jack_nframes_t position, float times = 1, bool with_save = true);
@@ -275,8 +274,6 @@ class Playlist : public StateManager, public PBD::StatefulDestructible {
void unset_freeze_child (Playlist*);
void timestamp_layer_op (boost::shared_ptr<Region>);
PBD::ID _id;
};
} /* namespace ARDOUR */

View File

@@ -35,7 +35,6 @@ class XMLNode;
namespace ARDOUR {
class Playlist;
class Source;
enum RegionEditState {
EditChangesNothing = 0,
@@ -95,8 +94,6 @@ class Region : public PBD::StatefulDestructible, public StateManager, public boo
virtual ~Region();
const PBD::ID& id() const { return _id; }
/* Note: changing the name of a Region does not constitute an edit */
string name() const { return _name; }
@@ -243,7 +240,6 @@ class Region : public PBD::StatefulDestructible, public StateManager, public boo
mutable RegionEditState _first_edit;
int _frozen;
Glib::Mutex lock;
PBD::ID _id;
ARDOUR::Playlist* _playlist;
mutable uint32_t _read_data_count; // modified in read()
Change pending_changed;

View File

@@ -255,12 +255,13 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
bool dirty() const { return _state_of_the_state & Dirty; }
sigc::signal<void> DirtyChanged;
std::string sound_dir () const;
std::string tape_dir () const;
std::string sound_dir (bool with_path = true) const;
std::string peak_dir () const;
std::string dead_sound_dir () const;
std::string automation_dir () const;
string peak_path_from_audio_path (string) const;
static string suffixed_search_path (std::string suffix, bool data);
static string control_protocol_path ();
static string template_path ();
@@ -268,7 +269,6 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
static void get_template_list (list<string>&);
static string change_audio_path_by_name (string oldpath, string oldname, string newname, bool destructive);
static string peak_path_from_audio_path (string);
string audio_path_from_name (string, uint32_t nchans, uint32_t chan, bool destructive);
void process (jack_nframes_t nframes);
@@ -1696,9 +1696,10 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
uint32_t _total_free_4k_blocks;
Glib::Mutex space_lock;
static const char* old_sound_dir_name;
static const char* sound_dir_name;
static const char* tape_dir_name;
static const char* dead_sound_dir_name;
static const char* interchange_dir_name;
static const char* peak_dir_name;
string discover_best_sound_dir (bool destructive = false);

View File

@@ -31,11 +31,11 @@ class SndFileSource : public AudioFileSource {
public:
/* constructor to be called for existing external-to-session files */
SndFileSource (std::string path, Flag flags);
SndFileSource (Session&, std::string path, Flag flags);
/* constructor to be called for new in-session files */
SndFileSource (std::string path, SampleFormat samp_format, HeaderFormat hdr_format, jack_nframes_t rate,
SndFileSource (Session&, std::string path, SampleFormat samp_format, HeaderFormat hdr_format, jack_nframes_t rate,
Flag flags = AudioFileSource::Flag (AudioFileSource::Writable|
AudioFileSource::Removable|
AudioFileSource::RemovableIfEmpty|
@@ -43,7 +43,7 @@ class SndFileSource : public AudioFileSource {
/* constructor to be called for existing in-session files */
SndFileSource (const XMLNode&);
SndFileSource (Session&, const XMLNode&);
~SndFileSource ();

View File

@@ -31,18 +31,18 @@
namespace ARDOUR {
class Session;
class Source : public PBD::StatefulDestructible, public sigc::trackable
{
public:
Source (std::string name);
Source (const XMLNode&);
Source (Session&, std::string name);
Source (Session&, const XMLNode&);
virtual ~Source ();
std::string name() const { return _name; }
int set_name (std::string str, bool destructive);
const PBD::ID& id() const { return _id; }
time_t timestamp() const { return _timestamp; }
void stamp (time_t when) { _timestamp = when; }
@@ -51,11 +51,11 @@ class Source : public PBD::StatefulDestructible, public sigc::trackable
protected:
Session& _session;
string _name;
time_t _timestamp;
private:
PBD::ID _id;
};
}

View File

@@ -13,15 +13,17 @@ class XMLNode;
namespace ARDOUR {
class Session;
class SourceFactory {
public:
static sigc::signal<void,boost::shared_ptr<Source> > SourceCreated;
static boost::shared_ptr<Source> create (const XMLNode& node);
static boost::shared_ptr<Source> create (Session&, const XMLNode& node);
// MIDI sources will have to be hacked in here somehow
static boost::shared_ptr<Source> createReadable (std::string idstr, AudioFileSource::Flag flags, bool announce = true);
static boost::shared_ptr<Source> createWritable (std::string name, bool destructive, jack_nframes_t rate, bool announce = true);
static boost::shared_ptr<Source> createReadable (Session&, std::string idstr, AudioFileSource::Flag flags, bool announce = true);
static boost::shared_ptr<Source> createWritable (Session&, std::string name, bool destructive, jack_nframes_t rate, bool announce = true);
};
}

View File

@@ -242,7 +242,6 @@ class TempoMap : public StateManager, public PBD::StatefulDestructible
XMLNode& get_state (void);
int set_state (const XMLNode&);
PBD::ID id() { return _id; }
void dump (std::ostream&) const;
void clear ();
@@ -320,8 +319,6 @@ class TempoMap : public StateManager, public PBD::StatefulDestructible
void save_state (std::string why);
PBD::ID _id;
};
}; /* namespace ARDOUR */

View File

@@ -1939,7 +1939,7 @@ AudioDiskstream::use_new_write_source (uint32_t n)
if (chan.write_source) {
if (AudioFileSource::is_empty (chan.write_source->path())) {
if (AudioFileSource::is_empty (_session, chan.write_source->path())) {
chan.write_source->mark_for_remove ();
chan.write_source.reset ();
} else {
@@ -2176,7 +2176,7 @@ AudioDiskstream::use_pending_capture_data (XMLNode& node)
}
try {
fs = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createWritable (prop->value(), false, _session.frame_rate()));
fs = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createWritable (_session, prop->value(), false, _session.frame_rate()));
}
catch (failed_constructor& err) {

View File

@@ -897,3 +897,4 @@ AudioPlaylist::crossfades_at (jack_nframes_t frame, Crossfades& clist)
}
}
}

View File

@@ -63,8 +63,8 @@ char AudioFileSource::bwf_country_code[3] = "US";
char AudioFileSource::bwf_organization_code[4] = "LAS";
char AudioFileSource::bwf_serial_number[13] = "000000000000";
AudioFileSource::AudioFileSource (string idstr, Flag flags)
: AudioSource (idstr), _flags (flags)
AudioFileSource::AudioFileSource (Session& s, string idstr, Flag flags)
: AudioSource (s, idstr), _flags (flags)
{
/* constructor used for existing external to session files. file must exist already */
@@ -74,8 +74,8 @@ AudioFileSource::AudioFileSource (string idstr, Flag flags)
}
AudioFileSource::AudioFileSource (std::string path, Flag flags, SampleFormat samp_format, HeaderFormat hdr_format)
: AudioSource (path), _flags (flags)
AudioFileSource::AudioFileSource (Session& s, std::string path, Flag flags, SampleFormat samp_format, HeaderFormat hdr_format)
: AudioSource (s, path), _flags (flags)
{
/* constructor used for new internal-to-session files. file cannot exist */
@@ -84,8 +84,8 @@ AudioFileSource::AudioFileSource (std::string path, Flag flags, SampleFormat sam
}
}
AudioFileSource::AudioFileSource (const XMLNode& node)
: AudioSource (node), _flags (Flag (Writable|CanRename))
AudioFileSource::AudioFileSource (Session& s, const XMLNode& node)
: AudioSource (s, node), _flags (Flag (Writable|CanRename))
{
/* constructor used for existing internal-to-session files. file must exist */
@@ -109,7 +109,7 @@ AudioFileSource::~AudioFileSource ()
bool
AudioFileSource::removable () const
{
return (_flags & Removable) && ((_flags & RemoveAtDestroy) || ((_flags & RemovableIfEmpty) && is_empty (_path)));
return (_flags & Removable) && ((_flags & RemoveAtDestroy) || ((_flags & RemovableIfEmpty) && is_empty (_session, _path)));
}
int
@@ -135,7 +135,7 @@ AudioFileSource::init (string pathstr, bool must_exist)
string
AudioFileSource::peak_path (string audio_path)
{
return Session::peak_path_from_audio_path (audio_path);
return _session.peak_path_from_audio_path (audio_path);
}
string
@@ -552,10 +552,10 @@ AudioFileSource::set_name (string newname, bool destructive)
}
bool
AudioFileSource::is_empty (string path)
AudioFileSource::is_empty (Session& s, string path)
{
bool ret = false;
boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createReadable (path, NoPeakFile, false));
boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createReadable (s, path, NoPeakFile, false));
if (afs) {
ret = (afs->length() == 0);

View File

@@ -50,7 +50,7 @@ AudioFilter::make_new_sources (boost::shared_ptr<AudioRegion> region, SourceList
}
try {
nsrcs.push_back (boost::dynamic_pointer_cast<AudioSource> (SourceFactory::createWritable (path, false, session.frame_rate())));
nsrcs.push_back (boost::dynamic_pointer_cast<AudioSource> (SourceFactory::createWritable (session, path, false, session.frame_rate())));
}
catch (failed_constructor& err) {

View File

@@ -38,7 +38,7 @@
#include <ardour/dB.h>
#include <ardour/playlist.h>
#include <ardour/audiofilter.h>
#include <ardour/audiosource.h>
#include <ardour/audiofilesource.h>
#include "i18n.h"
#include <locale.h>
@@ -76,6 +76,11 @@ AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, jack_nframes_t sta
master_sources.push_back (src);
src->GoingAway.connect (bind (mem_fun (*this, &AudioRegion::source_deleted), src));
boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (src);
if (afs) {
afs->HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioRegion::source_offset_changed));
}
_scale_amplitude = 1.0;
set_default_fades ();
@@ -98,6 +103,11 @@ AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, jack_nframes_t sta
master_sources.push_back (src);
src->GoingAway.connect (bind (mem_fun (*this, &AudioRegion::source_deleted), src));
boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (src);
if (afs) {
afs->HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioRegion::source_offset_changed));
}
_scale_amplitude = 1.0;
set_default_fades ();
@@ -119,6 +129,11 @@ AudioRegion::AudioRegion (SourceList& srcs, jack_nframes_t start, jack_nframes_t
sources.push_back (*i);
master_sources.push_back (*i);
(*i)->GoingAway.connect (bind (mem_fun (*this, &AudioRegion::source_deleted), (*i)));
boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> ((*i));
if (afs) {
afs->HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioRegion::source_offset_changed));
}
}
_scale_amplitude = 1.0;
@@ -144,7 +159,17 @@ AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other, jack_nfram
for (SourceList::const_iterator i= other->sources.begin(); i != other->sources.end(); ++i) {
sources.push_back (*i);
(*i)->GoingAway.connect (bind (mem_fun (*this, &AudioRegion::source_deleted), *i));
unique_srcs.insert (*i);
pair<set<boost::shared_ptr<AudioSource> >::iterator,bool> result;
result = unique_srcs.insert (*i);
if (result.second) {
boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (*i);
if (afs) {
afs->HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioRegion::source_offset_changed));
}
}
}
for (SourceList::const_iterator i = other->master_sources.begin(); i != other->master_sources.end(); ++i) {
@@ -199,7 +224,16 @@ AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other)
for (SourceList::const_iterator i = other->sources.begin(); i != other->sources.end(); ++i) {
sources.push_back (*i);
(*i)->GoingAway.connect (bind (mem_fun (*this, &AudioRegion::source_deleted), *i));
unique_srcs.insert (*i);
pair<set<boost::shared_ptr<AudioSource> >::iterator,bool> result;
result = unique_srcs.insert (*i);
if (result.second) {
boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (*i);
if (afs) {
afs->HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioRegion::source_offset_changed));
}
}
}
for (SourceList::const_iterator i = other->master_sources.begin(); i != other->master_sources.end(); ++i) {
@@ -230,6 +264,11 @@ AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, const XMLNode& nod
master_sources.push_back (src);
src->GoingAway.connect (bind (mem_fun (*this, &AudioRegion::source_deleted), src));
boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (src);
if (afs) {
afs->HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioRegion::source_offset_changed));
}
set_default_fades ();
if (set_state (node)) {
@@ -252,7 +291,16 @@ AudioRegion::AudioRegion (SourceList& srcs, const XMLNode& node)
for (SourceList::iterator i=srcs.begin(); i != srcs.end(); ++i) {
sources.push_back (*i);
(*i)->GoingAway.connect (bind (mem_fun (*this, &AudioRegion::source_deleted), *i));
unique_srcs.insert (*i);
pair<set<boost::shared_ptr<AudioSource> >::iterator,bool> result;
result = unique_srcs.insert (*i);
if (result.second) {
boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (*i);
if (afs) {
afs->HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioRegion::source_offset_changed));
}
}
}
for (SourceList::iterator i = srcs.begin(); i != srcs.end(); ++i) {
@@ -1324,6 +1372,12 @@ AudioRegion::speed_mismatch (float sr) const
return fsr != sr;
}
void
AudioRegion::source_offset_changed ()
{
set_position (source()->natural_position() + start(), this);
}
extern "C" {
int region_read_peaks_from_c (void *arg, uint32_t npeaks, uint32_t start, uint32_t cnt, intptr_t data, uint32_t n_chan, double samples_per_unit)

View File

@@ -50,8 +50,8 @@ int AudioSource::peak_request_pipe[2];
bool AudioSource::_build_missing_peakfiles = false;
bool AudioSource::_build_peakfiles = false;
AudioSource::AudioSource (string name)
: Source (name)
AudioSource::AudioSource (Session& s, string name)
: Source (s, name)
{
if (pending_peak_sources_lock == 0) {
pending_peak_sources_lock = new Glib::Mutex;
@@ -63,8 +63,8 @@ AudioSource::AudioSource (string name)
_write_data_count = 0;
}
AudioSource::AudioSource (const XMLNode& node)
: Source (node)
AudioSource::AudioSource (Session& s, const XMLNode& node)
: Source (s, node)
{
if (pending_peak_sources_lock == 0) {
pending_peak_sources_lock = new Glib::Mutex;

View File

@@ -68,21 +68,21 @@ gain_t* DestructiveFileSource::out_coefficient = 0;
gain_t* DestructiveFileSource::in_coefficient = 0;
jack_nframes_t DestructiveFileSource::xfade_frames = 64;
DestructiveFileSource::DestructiveFileSource (string path, SampleFormat samp_format, HeaderFormat hdr_format, jack_nframes_t rate, Flag flags)
: SndFileSource (path, samp_format, hdr_format, rate, flags)
DestructiveFileSource::DestructiveFileSource (Session& s, string path, SampleFormat samp_format, HeaderFormat hdr_format, jack_nframes_t rate, Flag flags)
: SndFileSource (s, path, samp_format, hdr_format, rate, flags)
{
init ();
}
DestructiveFileSource::DestructiveFileSource (string path, Flag flags)
: SndFileSource (path, flags)
DestructiveFileSource::DestructiveFileSource (Session& s, string path, Flag flags)
: SndFileSource (s, path, flags)
{
init ();
}
DestructiveFileSource::DestructiveFileSource (const XMLNode& node)
: SndFileSource (node)
DestructiveFileSource::DestructiveFileSource (Session& s, const XMLNode& node)
: SndFileSource (s, node)
{
init ();
}

View File

@@ -372,7 +372,9 @@ ARDOUR::get_user_ardour_path ()
/* create it if necessary */
mkdir (path.c_str (), 0755);
if (g_mkdir_with_parents (path.c_str (), 0755)) {
throw exception ();
}
return path;
}

View File

@@ -138,7 +138,7 @@ Session::import_audiofile (import_status& status)
} while ( !goodfile);
try {
newfiles[n] = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createWritable (buf, false, frame_rate()));
newfiles[n] = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createWritable (*this, buf, false, frame_rate()));
}
catch (failed_constructor& err) {

View File

@@ -22,6 +22,7 @@
#include <algorithm>
#include <unistd.h>
#include <locale.h>
#include <errno.h>
#include <sigc++/bind.h>
@@ -2426,8 +2427,8 @@ IO::load_automation (const string& path)
fullpath += path;
in.open (fullpath.c_str());
if (!in) {
error << string_compose(_("%1: cannot open automation event file \"%2\""), _name, fullpath) << endmsg;
return -1;
error << string_compose(_("%1: cannot open automation event file \"%2\" (%2)"), _name, fullpath, strerror (errno)) << endmsg;
return -1;
}
}

View File

@@ -81,13 +81,18 @@ Location::set_start (jack_nframes_t s)
{
if (is_mark()) {
if (_start != s) {
_start = s;
_end = s;
start_changed(this); /* EMIT SIGNAL */
if ( is_start() ) {
Session::StartTimeChanged (); /* EMIT SIGNAL */
AudioFileSource::set_header_position_offset ( s );
}
if ( is_end() ) {
Session::EndTimeChanged (); /* EMIT SIGNAL */
}

View File

@@ -1080,7 +1080,7 @@ Panner::save () const
ofstream out (automation_path.c_str());
if (!out) {
error << string_compose (_("cannot open pan automation file \"%1\" for saving (%s)"), automation_path, strerror (errno))
error << string_compose (_("cannot open pan automation file \"%1\" for saving (%2)"), automation_path, strerror (errno))
<< endmsg;
return -1;
}

View File

@@ -224,13 +224,13 @@ Plugin::save_preset (string name, string domain)
free(lrdf_add_preset(source.c_str(), name.c_str(), unique_id(), &defaults));
string path = string_compose("%1/.%2", envvar, domain);
if (mkdir(path.c_str(), 0775) && errno != EEXIST) {
if (g_mkdir_with_parents (path.c_str(), 0775)) {
warning << string_compose(_("Could not create %1. Preset not saved. (%2)"), path, strerror(errno)) << endmsg;
return false;
}
path += "/rdf";
if (mkdir(path.c_str(), 0775) && errno != EEXIST) {
if (g_mkdir_with_parents (path.c_str(), 0775)) {
warning << string_compose(_("Could not create %1. Preset not saved. (%2)"), path, strerror(errno)) << endmsg;
return false;
}

View File

@@ -81,10 +81,11 @@ using boost::shared_ptr;
const char* Session::_template_suffix = X_(".template");
const char* Session::_statefile_suffix = X_(".ardour");
const char* Session::_pending_suffix = X_(".pending");
const char* Session::sound_dir_name = X_("sounds");
const char* Session::tape_dir_name = X_("tapes");
const char* Session::old_sound_dir_name = X_("sounds");
const char* Session::sound_dir_name = X_("audiofiles");
const char* Session::peak_dir_name = X_("peaks");
const char* Session::dead_sound_dir_name = X_("dead_sounds");
const char* Session::interchange_dir_name = X_("interchange");
Session::compute_peak_t Session::compute_peak = 0;
Session::apply_gain_to_buffer_t Session::apply_gain_to_buffer = 0;
@@ -2799,17 +2800,11 @@ Session::source_by_id (const PBD::ID& id)
}
string
Session::peak_path_from_audio_path (string audio_path)
Session::peak_path_from_audio_path (string audio_path) const
{
/* XXX hardly bombproof! fix me */
string res;
res = Glib::path_get_dirname (audio_path);
res = Glib::path_get_dirname (res);
res += '/';
res += peak_dir_name;
res += '/';
res = peak_dir ();
res += PBD::basename_nosuffix (audio_path);
res += ".peak";
@@ -2955,11 +2950,7 @@ Session::audio_path_from_name (string name, uint32_t nchan, uint32_t chan, bool
spath = (*i).path;
if (destructive) {
spath += tape_dir_name;
} else {
spath += sound_dir_name;
}
spath += sound_dir_name;
if (destructive) {
if (nchan < 2) {
@@ -3016,11 +3007,7 @@ Session::audio_path_from_name (string name, uint32_t nchan, uint32_t chan, bool
string foo = buf;
if (destructive) {
spath = tape_dir ();
} else {
spath = discover_best_sound_dir ();
}
spath = discover_best_sound_dir ();
string::size_type pos = foo.find_last_of ('/');
@@ -3037,7 +3024,7 @@ boost::shared_ptr<AudioFileSource>
Session::create_audio_source_for_session (AudioDiskstream& ds, uint32_t chan, bool destructive)
{
string spath = audio_path_from_name (ds.name(), ds.n_channels(), chan, destructive);
return boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createWritable (spath, destructive, frame_rate()));
return boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createWritable (*this, spath, destructive, frame_rate()));
}
/* Playlist management */
@@ -3206,7 +3193,7 @@ Session::remove_empty_sounds ()
for (vector<string *>::iterator i = possible_audiofiles->begin(); i != possible_audiofiles->end(); ++i) {
if (AudioFileSource::is_empty (*(*i))) {
if (AudioFileSource::is_empty (*this, *(*i))) {
unlink ((*i)->c_str());
@@ -3386,7 +3373,7 @@ jack_nframes_t
Session::available_capture_duration ()
{
const double scale = 4096.0 / sizeof (Sample);
if (_total_free_4k_blocks * scale > (double) max_frames) {
return max_frames;
}
@@ -3713,7 +3700,7 @@ Session::write_one_audio_track (AudioTrack& track, jack_nframes_t start, jack_nf
}
try {
fsource = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createWritable (buf, false, frame_rate()));
fsource = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createWritable (*this, buf, false, frame_rate()));
}
catch (failed_constructor& err) {

View File

@@ -364,7 +364,6 @@ Session::second_stage_init (bool new_session)
_end_location_is_free = false;
}
restore_history(_current_snapshot_name);
return 0;
}
@@ -429,16 +428,7 @@ Session::setup_raid_path (string path)
if (fspath[fspath.length()-1] != '/') {
fspath += '/';
}
fspath += sound_dir_name;
fspath += ':';
/* tape dir */
fspath += sp.path;
if (fspath[fspath.length()-1] != '/') {
fspath += '/';
}
fspath += tape_dir_name;
fspath += sound_dir (false);
AudioFileSource::set_search_path (fspath);
@@ -459,16 +449,7 @@ Session::setup_raid_path (string path)
if (fspath[fspath.length()-1] != '/') {
fspath += '/';
}
fspath += sound_dir_name;
fspath += ':';
/* add tape dir to file search path */
fspath += sp.path;
if (fspath[fspath.length()-1] != '/') {
fspath += '/';
}
fspath += tape_dir_name;
fspath += sound_dir (false);
fspath += ':';
remaining = remaining.substr (colon+1);
@@ -484,15 +465,9 @@ Session::setup_raid_path (string path)
if (fspath[fspath.length()-1] != '/') {
fspath += '/';
}
fspath += sound_dir_name;
fspath += sound_dir (false);
fspath += ':';
fspath += sp.path;
if (fspath[fspath.length()-1] != '/') {
fspath += '/';
}
fspath += tape_dir_name;
session_dirs.push_back (sp);
}
@@ -509,61 +484,40 @@ int
Session::create (bool& new_session, string* mix_template, jack_nframes_t initial_length)
{
string dir;
new_session = !g_file_test (_path.c_str(), GFileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
if (mkdir (_path.c_str(), 0755) < 0) {
if (errno == EEXIST) {
new_session = false;
} else {
error << string_compose(_("Session: cannot create session dir \"%1\" (%2)"), _path, strerror (errno)) << endmsg;
return -1;
}
} else {
new_session = true;
if (g_mkdir_with_parents (_path.c_str(), 0755) < 0) {
error << string_compose(_("Session: cannot create session dir \"%1\" (%2)"), _path, strerror (errno)) << endmsg;
return -1;
}
dir = peak_dir ();
if (mkdir (dir.c_str(), 0755) < 0) {
if (errno != EEXIST) {
error << string_compose(_("Session: cannot create session peakfile dir \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
return -1;
}
if (g_mkdir_with_parents (dir.c_str(), 0755) < 0) {
error << string_compose(_("Session: cannot create session peakfile dir \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
return -1;
}
dir = sound_dir ();
if (mkdir (dir.c_str(), 0755) < 0) {
if (errno != EEXIST) {
error << string_compose(_("Session: cannot create session sounds dir \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
return -1;
}
}
dir = tape_dir ();
if (mkdir (dir.c_str(), 0755) < 0) {
if (errno != EEXIST) {
error << string_compose(_("Session: cannot create session tape dir \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
return -1;
}
if (g_mkdir_with_parents (dir.c_str(), 0755) < 0) {
error << string_compose(_("Session: cannot create session sounds dir \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
return -1;
}
dir = dead_sound_dir ();
if (mkdir (dir.c_str(), 0755) < 0) {
if (errno != EEXIST) {
error << string_compose(_("Session: cannot create session dead sounds dir \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
return -1;
}
if (g_mkdir_with_parents (dir.c_str(), 0755) < 0) {
error << string_compose(_("Session: cannot create session dead sounds dir \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
return -1;
}
dir = automation_dir ();
if (mkdir (dir.c_str(), 0755) < 0) {
if (errno != EEXIST) {
error << string_compose(_("Session: cannot create session automation dir \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
return -1;
}
if (g_mkdir_with_parents (dir.c_str(), 0755) < 0) {
error << string_compose(_("Session: cannot create session automation dir \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
return -1;
}
@@ -709,6 +663,8 @@ Session::save_state (string snapshot_name, bool pending)
}
cerr << "actually writing state\n";
if (!tree.write (xml_path)) {
error << string_compose (_("state could not be saved to %1"), xml_path) << endmsg;
@@ -1934,7 +1890,7 @@ Session::XMLSourceFactory (const XMLNode& node)
}
try {
return SourceFactory::create (node);
return SourceFactory::create (*this, node);
}
catch (failed_constructor& err) {
@@ -1959,7 +1915,7 @@ Session::save_template (string template_name)
if ((dp = opendir (dir.c_str()))) {
closedir (dp);
} else {
if (mkdir (dir.c_str(), S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)<0) {
if (g_mkdir_with_parents (dir.c_str(), S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
error << string_compose(_("Could not create mix templates directory \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
return -1;
}
@@ -2039,11 +1995,9 @@ Session::ensure_sound_dir (string path, string& result)
/* Ensure that the parent directory exists */
if (mkdir (path.c_str(), 0775)) {
if (errno != EEXIST) {
error << string_compose(_("cannot create session directory \"%1\"; ignored"), path) << endmsg;
return -1;
}
if (g_mkdir_with_parents (path.c_str(), 0775)) {
error << string_compose(_("cannot create session directory \"%1\"; ignored"), path) << endmsg;
return -1;
}
/* Ensure that the sounds directory exists */
@@ -2052,33 +2006,27 @@ Session::ensure_sound_dir (string path, string& result)
result += '/';
result += sound_dir_name;
if (mkdir (result.c_str(), 0775)) {
if (errno != EEXIST) {
error << string_compose(_("cannot create sounds directory \"%1\"; ignored"), result) << endmsg;
return -1;
}
if (g_mkdir_with_parents (result.c_str(), 0775)) {
error << string_compose(_("cannot create sounds directory \"%1\"; ignored"), result) << endmsg;
return -1;
}
dead = path;
dead += '/';
dead += dead_sound_dir_name;
if (mkdir (dead.c_str(), 0775)) {
if (errno != EEXIST) {
error << string_compose(_("cannot create dead sounds directory \"%1\"; ignored"), dead) << endmsg;
return -1;
}
if (g_mkdir_with_parents (dead.c_str(), 0775)) {
error << string_compose(_("cannot create dead sounds directory \"%1\"; ignored"), dead) << endmsg;
return -1;
}
peak = path;
peak += '/';
peak += peak_dir_name;
if (mkdir (peak.c_str(), 0775)) {
if (errno != EEXIST) {
error << string_compose(_("cannot create peak file directory \"%1\"; ignored"), peak) << endmsg;
return -1;
}
if (g_mkdir_with_parents (peak.c_str(), 0775)) {
error << string_compose(_("cannot create peak file directory \"%1\"; ignored"), peak) << endmsg;
return -1;
}
/* callers expect this to be terminated ... */
@@ -2093,12 +2041,6 @@ Session::discover_best_sound_dir (bool destructive)
vector<space_and_path>::iterator i;
string result;
/* destructive files all go into the same place */
if (destructive) {
return tape_dir();
}
/* handle common case without system calls */
if (session_dirs.size() == 1) {
@@ -2304,20 +2246,37 @@ Session::dead_sound_dir () const
}
string
Session::sound_dir () const
Session::sound_dir (bool with_path) const
{
string res = _path;
/* support old session structure */
struct stat statbuf;
string old;
if (with_path) {
old = _path;
}
old += sound_dir_name;
old += '/';
if (stat (old.c_str(), &statbuf) == 0) {
return old;
}
string res;
if (with_path) {
res = _path;
}
res += interchange_dir_name;
res += '/';
res += legalize_for_path (_name);
res += '/';
res += sound_dir_name;
res += '/';
return res;
}
string
Session::tape_dir () const
{
string res = _path;
res += tape_dir_name;
res += '/';
return res;
}
@@ -3314,8 +3273,7 @@ Session::save_history (string snapshot_name)
XMLTree tree;
string xml_path;
string bak_path;
tree.set_root (&history.get_state());
if (snapshot_name.empty()) {
@@ -3323,7 +3281,6 @@ Session::save_history (string snapshot_name)
}
xml_path = _path + snapshot_name + ".history";
cerr << "Saving history to " << xml_path << endmsg;
bak_path = xml_path + ".bak";
@@ -3334,6 +3291,8 @@ Session::save_history (string snapshot_name)
return -1;
}
cerr << "actually writing history\n";
if (!tree.write (xml_path))
{
error << string_compose (_("history could not be saved to %1"), xml_path) << endmsg;

View File

@@ -51,7 +51,7 @@ Session::bbt_time (jack_nframes_t when, BBT_Time& bbt)
void
Session::sync_time_vars ()
{
_current_frame_rate = _base_frame_rate * (1.0 + (video_pullup/100.0) );
_current_frame_rate = (jack_nframes_t) round (_base_frame_rate * (1.0 + (video_pullup/100.0)));
_frames_per_hour = _current_frame_rate * 3600;
_frames_per_smpte_frame = (double) _current_frame_rate / (double) smpte_frames_per_second;
_smpte_frames_per_hour = (unsigned long) (smpte_frames_per_second * 3600.0);

View File

@@ -82,7 +82,7 @@ Session::tempoize_region (TimeStretchRequest& tsr)
}
try {
sources.push_back (boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createWritable (path, false, frame_rate())));
sources.push_back (boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createWritable (*this, path, false, frame_rate())));
} catch (failed_constructor& err) {
error << string_compose (_("tempoize: error creating new audio file %1 (%2)"), path, strerror (errno)) << endmsg;

View File

@@ -34,8 +34,8 @@ using namespace std;
using namespace ARDOUR;
using namespace PBD;
SndFileSource::SndFileSource (const XMLNode& node)
: AudioFileSource (node)
SndFileSource::SndFileSource (Session& s, const XMLNode& node)
: AudioFileSource (s, node)
{
init (_name);
@@ -52,9 +52,9 @@ SndFileSource::SndFileSource (const XMLNode& node)
}
}
SndFileSource::SndFileSource (string idstr, Flag flags)
SndFileSource::SndFileSource (Session& s, string idstr, Flag flags)
/* files created this way are never writable or removable */
: AudioFileSource (idstr, Flag (flags & ~(Writable|Removable|RemovableIfEmpty|RemoveAtDestroy)))
: AudioFileSource (s, idstr, Flag (flags & ~(Writable|Removable|RemovableIfEmpty|RemoveAtDestroy)))
{
init (idstr);
@@ -71,8 +71,8 @@ SndFileSource::SndFileSource (string idstr, Flag flags)
}
}
SndFileSource::SndFileSource (string idstr, SampleFormat sfmt, HeaderFormat hf, jack_nframes_t rate, Flag flags)
: AudioFileSource(idstr, flags, sfmt, hf)
SndFileSource::SndFileSource (Session& s, string idstr, SampleFormat sfmt, HeaderFormat hf, jack_nframes_t rate, Flag flags)
: AudioFileSource (s, idstr, flags, sfmt, hf)
{
int fmt = 0;
@@ -507,6 +507,9 @@ SndFileSource::set_header_timeline_position ()
delete _broadcast_info;
_broadcast_info = 0;
}
}
jack_nframes_t

View File

@@ -42,13 +42,15 @@ using std::max;
using namespace ARDOUR;
Source::Source (string name)
Source::Source (Session& s, string name)
: _session (s)
{
_name = name;
_timestamp = 0;
}
Source::Source (const XMLNode& node)
Source::Source (Session& s, const XMLNode& node)
: _session (s)
{
_timestamp = 0;

View File

@@ -36,25 +36,25 @@ sigc::signal<void,boost::shared_ptr<Source> > SourceFactory::SourceCreated;
#ifdef HAVE_COREAUDIO
boost::shared_ptr<Source>
SourceFactory::create (const XMLNode& node)
SourceFactory::create (Session& s, const XMLNode& node)
{
if (node.property (X_("destructive")) != 0) {
boost::shared_ptr<Source> ret (new DestructiveFileSource (node));
boost::shared_ptr<Source> ret (new DestructiveFileSource (s, node));
SourceCreated (ret);
return ret;
} else {
try {
boost::shared_ptr<Source> ret (new CoreAudioSource (node));
boost::shared_ptr<Source> ret (new CoreAudioSource (s, node));
SourceCreated (ret);
return ret;
}
catch (failed_constructor& err) {
boost::shared_ptr<Source> ret (new SndFileSource (node));
boost::shared_ptr<Source> ret (new SndFileSource (s, node));
SourceCreated (ret);
return ret;
}
@@ -66,17 +66,17 @@ SourceFactory::create (const XMLNode& node)
#else
boost::shared_ptr<Source>
SourceFactory::create (const XMLNode& node)
SourceFactory::create (Session& s, const XMLNode& node)
{
if (node.property (X_("destructive")) != 0) {
boost::shared_ptr<Source> ret (new DestructiveFileSource (node));
boost::shared_ptr<Source> ret (new DestructiveFileSource (s, node));
SourceCreated (ret);
return ret;
} else {
boost::shared_ptr<Source> ret (new SndFileSource (node));
boost::shared_ptr<Source> ret (new SndFileSource (s, node));
SourceCreated (ret);
return ret;
}
@@ -86,10 +86,10 @@ SourceFactory::create (const XMLNode& node)
#ifdef HAVE_COREAUDIO
boost::shared_ptr<Source>
SourceFactory::createReadable (string idstr, AudioFileSource::Flag flags, bool announce)
SourceFactory::createReadable (Session& s, string idstr, AudioFileSource::Flag flags, bool announce)
{
if (flags & Destructive) {
boost::shared_ptr<Source> ret (new DestructiveFileSource (idstr, flags));
boost::shared_ptr<Source> ret (new DestructiveFileSource (s, idstr, flags));
if (announce) {
SourceCreated (ret);
}
@@ -97,7 +97,7 @@ SourceFactory::createReadable (string idstr, AudioFileSource::Flag flags, bool a
}
try {
boost::shared_ptr<Source> ret (new CoreAudioSource (idstr, flags));
boost::shared_ptr<Source> ret (new CoreAudioSource (s, idstr, flags));
if (announce) {
SourceCreated (ret);
}
@@ -105,7 +105,7 @@ SourceFactory::createReadable (string idstr, AudioFileSource::Flag flags, bool a
}
catch (failed_constructor& err) {
boost::shared_ptr<Source> ret (new SndFileSource (idstr, flags));
boost::shared_ptr<Source> ret (new SndFileSource (s, idstr, flags));
if (announce) {
SourceCreated (ret);
}
@@ -118,9 +118,9 @@ SourceFactory::createReadable (string idstr, AudioFileSource::Flag flags, bool a
#else
boost::shared_ptr<Source>
SourceFactory::createReadable (string idstr, AudioFileSource::Flag flags, bool announce)
SourceFactory::createReadable (Session& s, string idstr, AudioFileSource::Flag flags, bool announce)
{
boost::shared_ptr<Source> ret (new SndFileSource (idstr, flags));
boost::shared_ptr<Source> ret (new SndFileSource (s, idstr, flags));
if (announce) {
SourceCreated (ret);
}
@@ -130,12 +130,12 @@ SourceFactory::createReadable (string idstr, AudioFileSource::Flag flags, bool a
#endif // HAVE_COREAUDIO
boost::shared_ptr<Source>
SourceFactory::createWritable (std::string path, bool destructive, jack_nframes_t rate, bool announce)
SourceFactory::createWritable (Session& s, std::string path, bool destructive, jack_nframes_t rate, bool announce)
{
/* this might throw failed_constructor(), which is OK */
if (destructive) {
boost::shared_ptr<Source> ret (new DestructiveFileSource (path,
boost::shared_ptr<Source> ret (new DestructiveFileSource (s, path,
Config->get_native_file_data_format(),
Config->get_native_file_header_format(),
rate));
@@ -145,7 +145,7 @@ SourceFactory::createWritable (std::string path, bool destructive, jack_nframes_
return ret;
} else {
boost::shared_ptr<Source> ret (new SndFileSource (path,
boost::shared_ptr<Source> ret (new SndFileSource (s, path,
Config->get_native_file_data_format(),
Config->get_native_file_header_format(),
rate));

View File

@@ -174,9 +174,9 @@ VSTPlugin::get_state()
if (stat (path.c_str(), &sbuf)) {
if (errno == ENOENT) {
if (mkdir (path.c_str(), 0600)) {
if (g_mkdir_with_parents (path.c_str(), 0600)) {
error << string_compose (_("cannot create VST chunk directory: %1"),
strerror (errno))
strerror (errno))
<< endmsg;
return *root;
}

View File

@@ -42,7 +42,7 @@ class Stateful {
virtual void add_instant_xml (XMLNode&, const std::string& dir);
XMLNode *instant_xml (const std::string& str, const std::string& dir);
PBD::ID id() { return _id; }
const PBD::ID& id() const { return _id; }
protected:
XMLNode *_extra_xml;