mirror of
https://github.com/Ardour/ardour.git
synced 2026-01-07 22:25:46 +01:00
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:
parent
babf75d871
commit
f2c8ae66c0
50 changed files with 349 additions and 306 deletions
|
|
@ -1,3 +1,3 @@
|
|||
#!/bin/sh
|
||||
source `dirname "$0"`/ardev_common.sh
|
||||
exec gtk2_ardour/ardour.bin --novst "$*"
|
||||
exec gtk2_ardour/ardour.bin --novst $*
|
||||
|
|
|
|||
|
|
@ -1616,6 +1616,9 @@ ARDOUR_UI::save_template ()
|
|||
void
|
||||
ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
|
||||
{
|
||||
string session_name;
|
||||
string session_path;
|
||||
|
||||
int response = Gtk::RESPONSE_NONE;
|
||||
|
||||
new_session_dialog->set_modal(true);
|
||||
|
|
@ -1637,14 +1640,28 @@ ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
|
|||
new_session_dialog->reset();
|
||||
|
||||
} else if (response == Gtk::RESPONSE_YES) {
|
||||
|
||||
/* YES == OPEN, but there's no enum for that */
|
||||
|
||||
std::string session_name = new_session_dialog->session_name();
|
||||
std::string session_path = new_session_dialog->session_folder();
|
||||
load_session (session_path, session_name);
|
||||
session_name = new_session_dialog->session_name();
|
||||
|
||||
if (session_name.empty()) {
|
||||
response = Gtk::RESPONSE_NONE;
|
||||
cerr << "session name is empty\n";
|
||||
continue;
|
||||
}
|
||||
|
||||
if (session_name[0] == '/' ||
|
||||
(session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
|
||||
(session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
|
||||
load_session (Glib::path_get_dirname (session_name), session_name);
|
||||
} else {
|
||||
session_path = new_session_dialog->session_folder();
|
||||
load_session (session_path, session_name);
|
||||
}
|
||||
|
||||
} else if (response == Gtk::RESPONSE_OK) {
|
||||
|
||||
if (new_session_dialog->get_current_page() == 1) {
|
||||
|
||||
/* XXX this is a bit of a hack..
|
||||
|
|
@ -1652,93 +1669,121 @@ ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
|
|||
if we're on page 1 (the load page)
|
||||
Unfortunately i can't see how atm..
|
||||
*/
|
||||
|
||||
std::string session_name = new_session_dialog->session_name();
|
||||
std::string session_path = new_session_dialog->session_folder();
|
||||
load_session (session_path, session_name);
|
||||
|
||||
|
||||
if (session_name.empty()) {
|
||||
response = Gtk::RESPONSE_NONE;
|
||||
cerr << "session name is empty 2\n";
|
||||
continue;
|
||||
}
|
||||
|
||||
if (session_name[0] == '/' ||
|
||||
(session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
|
||||
(session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
|
||||
load_session (Glib::path_get_dirname (session_name), session_name);
|
||||
} else {
|
||||
session_path = new_session_dialog->session_folder();
|
||||
load_session (session_path, session_name);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
_session_is_new = true;
|
||||
|
||||
std::string session_name = new_session_dialog->session_name();
|
||||
std::string session_path = new_session_dialog->session_folder();
|
||||
session_name = new_session_dialog->session_name();
|
||||
|
||||
if (session_name.empty()) {
|
||||
response = Gtk::RESPONSE_NONE;
|
||||
cerr << "session name is empty 3\n";
|
||||
continue;
|
||||
}
|
||||
|
||||
if (session_name[0] == '/' ||
|
||||
(session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
|
||||
(session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
|
||||
|
||||
session_path = Glib::path_get_dirname (session_name);
|
||||
session_name = Glib::path_get_basename (session_name);
|
||||
|
||||
} else {
|
||||
|
||||
std::string session_path = new_session_dialog->session_folder();
|
||||
|
||||
}
|
||||
|
||||
//XXX This is needed because session constructor wants a
|
||||
//non-existant path. hopefully this will be fixed at some point.
|
||||
|
||||
session_path = Glib::build_filename(session_path, session_name);
|
||||
|
||||
|
||||
session_path = Glib::build_filename (session_path, session_name);
|
||||
|
||||
std::string template_name = new_session_dialog->session_template_name();
|
||||
|
||||
|
||||
if (new_session_dialog->use_session_template()) {
|
||||
|
||||
load_session (session_path, session_name, &template_name);
|
||||
|
||||
load_session (session_path, session_name, &template_name);
|
||||
|
||||
} else {
|
||||
|
||||
uint32_t cchns;
|
||||
|
||||
uint32_t cchns;
|
||||
uint32_t mchns;
|
||||
Session::AutoConnectOption iconnect;
|
||||
Session::AutoConnectOption oconnect;
|
||||
|
||||
|
||||
if (new_session_dialog->create_control_bus()) {
|
||||
cchns = (uint32_t) new_session_dialog->control_channel_count();
|
||||
cchns = (uint32_t) new_session_dialog->control_channel_count();
|
||||
} else {
|
||||
cchns = 0;
|
||||
cchns = 0;
|
||||
}
|
||||
|
||||
|
||||
if (new_session_dialog->create_master_bus()) {
|
||||
mchns = (uint32_t) new_session_dialog->master_channel_count();
|
||||
mchns = (uint32_t) new_session_dialog->master_channel_count();
|
||||
} else {
|
||||
mchns = 0;
|
||||
mchns = 0;
|
||||
}
|
||||
|
||||
|
||||
if (new_session_dialog->connect_inputs()) {
|
||||
iconnect = Session::AutoConnectPhysical;
|
||||
iconnect = Session::AutoConnectPhysical;
|
||||
} else {
|
||||
iconnect = Session::AutoConnectOption (0);
|
||||
iconnect = Session::AutoConnectOption (0);
|
||||
}
|
||||
|
||||
|
||||
/// @todo some minor tweaks.
|
||||
|
||||
|
||||
if (new_session_dialog->connect_outs_to_master()) {
|
||||
oconnect = Session::AutoConnectMaster;
|
||||
oconnect = Session::AutoConnectMaster;
|
||||
} else if (new_session_dialog->connect_outs_to_physical()) {
|
||||
oconnect = Session::AutoConnectPhysical;
|
||||
oconnect = Session::AutoConnectPhysical;
|
||||
} else {
|
||||
oconnect = Session::AutoConnectOption (0);
|
||||
oconnect = Session::AutoConnectOption (0);
|
||||
}
|
||||
|
||||
|
||||
uint32_t nphysin = (uint32_t) new_session_dialog->input_limit_count();
|
||||
uint32_t nphysout = (uint32_t) new_session_dialog->output_limit_count();
|
||||
|
||||
|
||||
build_session (session_path,
|
||||
session_name,
|
||||
cchns,
|
||||
mchns,
|
||||
iconnect,
|
||||
oconnect,
|
||||
nphysin,
|
||||
nphysout,
|
||||
engine->frame_rate() * 60 * 5);
|
||||
session_name,
|
||||
cchns,
|
||||
mchns,
|
||||
iconnect,
|
||||
oconnect,
|
||||
nphysin,
|
||||
nphysout,
|
||||
engine->frame_rate() * 60 * 5);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} while (response == Gtk::RESPONSE_NONE);
|
||||
|
||||
show();
|
||||
new_session_dialog->get_window()->set_cursor();
|
||||
|
||||
new_session_dialog->hide();
|
||||
}
|
||||
|
||||
void
|
||||
ARDOUR_UI::close_session()
|
||||
{
|
||||
unload_session();
|
||||
new_session ();
|
||||
unload_session();
|
||||
new_session ();
|
||||
}
|
||||
|
||||
int
|
||||
|
|
|
|||
|
|
@ -79,6 +79,10 @@ ARDOUR_UI::connect_dependents_to_session (ARDOUR::Session *s)
|
|||
{
|
||||
editor->connect_to_session (s);
|
||||
mixer->connect_to_session (s);
|
||||
|
||||
/* its safe to do this now */
|
||||
|
||||
s->restore_history (s->snap_name());
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -69,6 +69,7 @@ AudioStreamView::AudioStreamView (AudioTimeAxisView& tv)
|
|||
|
||||
use_rec_regions = tv.editor.show_waveforms_recording ();
|
||||
last_rec_peak_frame = 0;
|
||||
|
||||
}
|
||||
|
||||
AudioStreamView::~AudioStreamView ()
|
||||
|
|
|
|||
|
|
@ -163,9 +163,8 @@ class AutomationLine : public sigc::trackable, public PBD::StatefulDestructible
|
|||
XMLNode& get_state (void);
|
||||
int set_state (const XMLNode&);
|
||||
|
||||
PBD::ID id() { return _id; }
|
||||
protected:
|
||||
PBD::ID _id;
|
||||
|
||||
string _name;
|
||||
guint32 _height;
|
||||
uint32_t _line_color;
|
||||
|
|
|
|||
|
|
@ -1327,6 +1327,7 @@ Editor::connect_to_session (Session *t)
|
|||
}
|
||||
|
||||
/* register for undo history */
|
||||
|
||||
session->register_with_memento_command_factory(_id, this);
|
||||
}
|
||||
|
||||
|
|
@ -2109,6 +2110,9 @@ Editor::set_state (const XMLNode& node)
|
|||
int x, y, xoff, yoff;
|
||||
Gdk::Geometry g;
|
||||
|
||||
if ((prop = node.property ("id")) != 0) {
|
||||
_id = prop->value ();
|
||||
}
|
||||
|
||||
if ((geometry = find_named_node (node, "geometry")) == 0) {
|
||||
|
||||
|
|
@ -2240,6 +2244,9 @@ Editor::get_state ()
|
|||
XMLNode* node = new XMLNode ("Editor");
|
||||
char buf[32];
|
||||
|
||||
_id.print (buf);
|
||||
node->add_property ("id", buf);
|
||||
|
||||
if (is_realized()) {
|
||||
Glib::RefPtr<Gdk::Window> win = get_window();
|
||||
|
||||
|
|
@ -2249,7 +2256,7 @@ Editor::get_state ()
|
|||
win->get_size(width, height);
|
||||
|
||||
XMLNode* geometry = new XMLNode ("geometry");
|
||||
char buf[32];
|
||||
|
||||
snprintf(buf, sizeof(buf), "%d", width);
|
||||
geometry->add_property("x_size", string(buf));
|
||||
snprintf(buf, sizeof(buf), "%d", height);
|
||||
|
|
|
|||
|
|
@ -143,8 +143,6 @@ class Editor : public PublicEditor
|
|||
XMLNode& get_state ();
|
||||
int set_state (const XMLNode& );
|
||||
|
||||
PBD::ID id() { return _id; }
|
||||
|
||||
void set_mouse_mode (Editing::MouseMode, bool force=true);
|
||||
void step_mouse_mode (bool next);
|
||||
Editing::MouseMode current_mouse_mode () { return mouse_mode; }
|
||||
|
|
@ -349,8 +347,6 @@ class Editor : public PublicEditor
|
|||
ARDOUR::AudioEngine& engine;
|
||||
bool constructed;
|
||||
|
||||
PBD::ID _id;
|
||||
|
||||
PlaylistSelector* _playlist_selector;
|
||||
|
||||
void set_frames_per_unit (double);
|
||||
|
|
|
|||
|
|
@ -270,7 +270,7 @@ Editor::embed_sndfile (Glib::ustring path, bool split, bool multiple_files, bool
|
|||
idspec += string_compose(":%1", n);
|
||||
|
||||
try {
|
||||
source = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createReadable (idspec, (mode == ImportAsTrack ? AudioFileSource::Destructive : AudioFileSource::Flag (0))));
|
||||
source = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createReadable (*session, idspec, (mode == ImportAsTrack ? AudioFileSource::Destructive : AudioFileSource::Flag (0))));
|
||||
sources.push_back(source);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -208,7 +208,7 @@ Editor::write_region (string path, boost::shared_ptr<AudioRegion> region)
|
|||
|
||||
|
||||
try {
|
||||
fs = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createReadable (path, AudioFileSource::Flag (0)));
|
||||
fs = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createReadable (*session, path, AudioFileSource::Flag (0)));
|
||||
}
|
||||
|
||||
catch (failed_constructor& err) {
|
||||
|
|
@ -339,7 +339,7 @@ Editor::write_audio_range (AudioPlaylist& playlist, uint32_t channels, list<Audi
|
|||
path = s;
|
||||
|
||||
try {
|
||||
fs = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createReadable (path, AudioFileSource::Flag (0)));
|
||||
fs = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createReadable (*session, path, AudioFileSource::Flag (0)));
|
||||
}
|
||||
|
||||
catch (failed_constructor& err) {
|
||||
|
|
|
|||
|
|
@ -26,16 +26,12 @@ class AudioRegionGainLine : public AutomationLine
|
|||
|
||||
void remove_point (ControlPoint&);
|
||||
|
||||
PBD::ID id() { return _id; }
|
||||
|
||||
|
||||
private:
|
||||
ARDOUR::Session& session;
|
||||
AudioRegionView& rv;
|
||||
|
||||
UndoAction get_memento();
|
||||
|
||||
PBD::ID _id;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -198,7 +198,7 @@ SoundFileBox::play_btn_clicked ()
|
|||
|
||||
for (int n = 0; n < sf_info.channels; ++n) {
|
||||
try {
|
||||
afs = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createReadable (path+":"+string_compose("%1", n), AudioFileSource::Flag (0)));
|
||||
afs = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createReadable (*_session, path+":"+string_compose("%1", n), AudioFileSource::Flag (0)));
|
||||
srclist.push_back(afs);
|
||||
|
||||
} catch (failed_constructor& err) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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>);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 ();
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -897,3 +897,4 @@ AudioPlaylist::crossfades_at (jack_nframes_t frame, Crossfades& clist)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 ();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue