mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-10 00:34:59 +01:00
Merge branch 'windows' into windows+cc
This commit is contained in:
commit
fa71d82dda
24 changed files with 1945 additions and 1633 deletions
|
|
@ -365,9 +365,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
|
|||
|
||||
(void) theme_manager.get (true);
|
||||
|
||||
starting.connect (sigc::mem_fun(*this, &ARDOUR_UI::startup));
|
||||
stopping.connect (sigc::mem_fun(*this, &ARDOUR_UI::shutdown));
|
||||
|
||||
_process_thread = new ProcessThread ();
|
||||
_process_thread->init ();
|
||||
|
||||
|
|
@ -540,6 +537,10 @@ ARDOUR_UI::post_engine ()
|
|||
|
||||
ARDOUR_UI::~ARDOUR_UI ()
|
||||
{
|
||||
if (ui_config->dirty()) {
|
||||
ui_config->save_state();
|
||||
}
|
||||
|
||||
delete keyboard;
|
||||
delete editor;
|
||||
delete mixer;
|
||||
|
|
@ -716,8 +717,8 @@ ARDOUR_UI::check_announcements ()
|
|||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
ARDOUR_UI::startup ()
|
||||
int
|
||||
ARDOUR_UI::starting ()
|
||||
{
|
||||
Application* app = Application::instance ();
|
||||
char *nsm_url;
|
||||
|
|
@ -789,7 +790,7 @@ ARDOUR_UI::startup ()
|
|||
s.hide ();
|
||||
switch (s.response ()) {
|
||||
case Gtk::RESPONSE_REJECT:
|
||||
exit (1);
|
||||
return -1;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -803,8 +804,8 @@ ARDOUR_UI::startup ()
|
|||
|
||||
/* go get a session */
|
||||
|
||||
if (get_session_parameters (true, ARDOUR_COMMAND_LINE::new_session, ARDOUR_COMMAND_LINE::load_template)) {
|
||||
exit (1);
|
||||
if (get_session_parameters (false, ARDOUR_COMMAND_LINE::new_session, ARDOUR_COMMAND_LINE::load_template)) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -820,6 +821,7 @@ ARDOUR_UI::startup ()
|
|||
_status_bar_visibility.update ();
|
||||
|
||||
BootMessage (string_compose (_("%1 is ready for use"), PROGRAM_NAME));
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -2562,6 +2564,18 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
|
|||
template_name = load_template;
|
||||
}
|
||||
|
||||
session_name = basename_nosuffix (ARDOUR_COMMAND_LINE::session_name);
|
||||
session_path = ARDOUR_COMMAND_LINE::session_name;
|
||||
|
||||
if (!session_path.empty()) {
|
||||
if (Glib::file_test (session_path.c_str(), Glib::FILE_TEST_EXISTS)) {
|
||||
if (Glib::file_test (session_path.c_str(), Glib::FILE_TEST_IS_REGULAR)) {
|
||||
/* session/snapshot file, change path to be dir */
|
||||
session_path = Glib::path_get_dirname (session_path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SessionDialog session_dialog (should_be_new, session_name, session_path, load_template, cancel_not_quit);
|
||||
|
||||
while (ret != 0) {
|
||||
|
|
@ -2586,11 +2600,14 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
|
|||
} else {
|
||||
session_path = "";
|
||||
session_name = "";
|
||||
session_dialog.clear_given ();
|
||||
}
|
||||
|
||||
|
||||
if (should_be_new || session_name.empty()) {
|
||||
/* need the dialog to get info from user */
|
||||
|
||||
|
||||
cerr << "run dialog\n";
|
||||
|
||||
switch (session_dialog.run()) {
|
||||
case RESPONSE_ACCEPT:
|
||||
break;
|
||||
|
|
@ -2610,7 +2627,8 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
|
|||
should_be_new = false;
|
||||
|
||||
session_name = session_dialog.session_name (likely_new);
|
||||
|
||||
session_path = session_dialog.session_folder ();
|
||||
|
||||
if (nsm) {
|
||||
likely_new = true;
|
||||
}
|
||||
|
|
@ -2662,6 +2680,7 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
|
|||
|
||||
if (Glib::file_test (session_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) {
|
||||
|
||||
|
||||
if (likely_new && !nsm) {
|
||||
|
||||
std::string existing = Glib::build_filename (session_path, session_name);
|
||||
|
|
@ -2685,10 +2704,11 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
|
|||
}
|
||||
|
||||
char illegal = Session::session_name_is_legal(session_name);
|
||||
|
||||
if (illegal) {
|
||||
pop_back_splash (session_dialog);
|
||||
MessageDialog msg (session_dialog, string_compose(_("To ensure compatibility with various systems\n"
|
||||
"session names may not contain a '%1' character"), illegal));
|
||||
"session names may not contain a '%1' character"), illegal));
|
||||
msg.run ();
|
||||
ARDOUR_COMMAND_LINE::session_name = ""; // cancel that
|
||||
continue;
|
||||
|
|
@ -2699,8 +2719,6 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
|
|||
|
||||
if (likely_new && template_name.empty()) {
|
||||
|
||||
cerr << "building a session from dialog\n";
|
||||
|
||||
ret = build_session_from_dialog (session_dialog, session_path, session_name);
|
||||
|
||||
} else {
|
||||
|
|
@ -2716,6 +2734,12 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
|
|||
_session->save_state (ARDOUR_COMMAND_LINE::immediate_save, false);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
/* clear this to avoid endless attempts to load the
|
||||
same session.
|
||||
*/
|
||||
|
||||
ARDOUR_COMMAND_LINE::session_name = "";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -3772,6 +3796,7 @@ ARDOUR_UI::disconnect_from_engine ()
|
|||
/* drop connection to AudioEngine::Halted so that we don't act
|
||||
* as if the engine unexpectedly shut down
|
||||
*/
|
||||
|
||||
halt_connection.disconnect ();
|
||||
|
||||
if (AudioEngine::instance()->stop ()) {
|
||||
|
|
@ -4107,8 +4132,6 @@ ARDOUR_UI::reset_route_peak_display (Route* route)
|
|||
int
|
||||
ARDOUR_UI::do_audio_midi_setup (uint32_t desired_sample_rate)
|
||||
{
|
||||
cerr << "Do AMS\n";
|
||||
|
||||
audio_midi_setup->set_desired_sample_rate (desired_sample_rate);
|
||||
|
||||
switch (audio_midi_setup->run()) {
|
||||
|
|
@ -4120,3 +4143,5 @@ ARDOUR_UI::do_audio_midi_setup (uint32_t desired_sample_rate)
|
|||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -333,8 +333,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
|
|||
|
||||
static ARDOUR_UI *theArdourUI;
|
||||
|
||||
void startup ();
|
||||
void shutdown ();
|
||||
int starting ();
|
||||
|
||||
int ask_about_saving_session (const std::vector<std::string>& actions);
|
||||
|
||||
|
|
|
|||
|
|
@ -50,14 +50,6 @@ namespace ARDOUR {
|
|||
|
||||
using namespace ARDOUR;
|
||||
|
||||
void
|
||||
ARDOUR_UI::shutdown ()
|
||||
{
|
||||
if (ui_config->dirty()) {
|
||||
ui_config->save_state();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ARDOUR_UI::we_have_dependents ()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -235,7 +235,6 @@ EngineControl::EngineControl ()
|
|||
ARDOUR::AudioEngine::instance()->Stopped.connect (stopped_connection, MISSING_INVALIDATOR, boost::bind (&EngineControl::engine_stopped, this), gui_context());
|
||||
ARDOUR::AudioEngine::instance()->Halted.connect (stopped_connection, MISSING_INVALIDATOR, boost::bind (&EngineControl::engine_stopped, this), gui_context());
|
||||
|
||||
cerr << "AMS about to change backend\n";
|
||||
backend_changed ();
|
||||
|
||||
if (audio_setup) {
|
||||
|
|
|
|||
|
|
@ -521,6 +521,7 @@ int main (int argc, char *argv[])
|
|||
|
||||
ui->run (text_receiver);
|
||||
Gtkmm2ext::Application::instance()->cleanup();
|
||||
delete ui;
|
||||
ui = 0;
|
||||
|
||||
ARDOUR::cleanup ();
|
||||
|
|
|
|||
2577
gtk2_ardour/po/de.po
2577
gtk2_ardour/po/de.po
File diff suppressed because it is too large
Load diff
|
|
@ -74,11 +74,6 @@ SessionDialog::SessionDialog (bool require_new, const std::string& session_name,
|
|||
, _master_bus_channel_count_adj (2, 0, 100, 1, 10, 0)
|
||||
, _existing_session_chooser_used (false)
|
||||
{
|
||||
if (!session_name.empty() && !require_new) {
|
||||
response (RESPONSE_OK);
|
||||
return;
|
||||
}
|
||||
|
||||
set_keep_above (true);
|
||||
set_position (WIN_POS_CENTER);
|
||||
get_vbox()->set_spacing (6);
|
||||
|
|
@ -143,12 +138,32 @@ SessionDialog::SessionDialog (bool require_new, const std::string& session_name,
|
|||
recent_label.hide ();
|
||||
}
|
||||
}
|
||||
|
||||
/* possibly get out of here immediately if everything is ready to go.
|
||||
We still need to set up the whole dialog because of the way
|
||||
ARDOUR_UI::get_session_parameters() might skip it on a first
|
||||
pass then require it for a second pass (e.g. when there
|
||||
is an error with session loading and we have to ask the user
|
||||
what to do next).
|
||||
*/
|
||||
|
||||
if (!session_name.empty() && !require_new) {
|
||||
response (RESPONSE_OK);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
SessionDialog::~SessionDialog()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
SessionDialog::clear_given ()
|
||||
{
|
||||
_provided_session_path = "";
|
||||
_provided_session_name = "";
|
||||
}
|
||||
|
||||
bool
|
||||
SessionDialog::use_session_template ()
|
||||
{
|
||||
|
|
@ -185,6 +200,7 @@ std::string
|
|||
SessionDialog::session_name (bool& should_be_new)
|
||||
{
|
||||
if (!_provided_session_name.empty() && !new_only) {
|
||||
should_be_new = false;
|
||||
return _provided_session_name;
|
||||
}
|
||||
|
||||
|
|
@ -221,12 +237,16 @@ SessionDialog::session_folder ()
|
|||
TreeIter iter = recent_session_display.get_selection()->get_selected();
|
||||
|
||||
if (iter) {
|
||||
return (*iter)[recent_session_columns.fullpath];
|
||||
string s = (*iter)[recent_session_columns.fullpath];
|
||||
if (Glib::file_test (s, Glib::FILE_TEST_IS_REGULAR)) {
|
||||
return Glib::path_get_dirname (s);
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
if (_existing_session_chooser_used) {
|
||||
/* existing session chosen from file chooser */
|
||||
return existing_session_chooser.get_current_folder ();
|
||||
return Glib::path_get_dirname (existing_session_chooser.get_current_folder ());
|
||||
} else {
|
||||
std::string legal_session_folder_name = legalize_for_path (new_name_entry.get_text());
|
||||
return Glib::build_filename (new_folder_chooser.get_current_folder(), legal_session_folder_name);
|
||||
|
|
@ -251,7 +271,9 @@ SessionDialog::setup_initial_choice_box ()
|
|||
ic_new_session_button.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::new_session_button_clicked));
|
||||
|
||||
Gtk::HBox* hbox = manage (new HBox);
|
||||
Gtk::VBox* vbox = manage (new VBox);
|
||||
hbox->set_spacing (12);
|
||||
vbox->set_spacing (12);
|
||||
|
||||
string image_path;
|
||||
|
||||
|
|
@ -261,9 +283,10 @@ SessionDialog::setup_initial_choice_box ()
|
|||
hbox->pack_start (*image, false, false);
|
||||
}
|
||||
}
|
||||
|
||||
hbox->pack_start (ic_new_session_button, true, true);
|
||||
|
||||
|
||||
vbox->pack_start (ic_new_session_button, true, true, 20);
|
||||
hbox->pack_start (*vbox, true, true, 20);
|
||||
|
||||
centering_vbox->pack_start (*hbox, false, false);
|
||||
|
||||
/* Possible update message */
|
||||
|
|
@ -276,8 +299,6 @@ SessionDialog::setup_initial_choice_box ()
|
|||
|
||||
info_box->pack_start (info_scroller_label, false, false);
|
||||
|
||||
cerr << "Frame should be visible\n";
|
||||
|
||||
info_scroller_count = 0;
|
||||
info_scroller_connection = Glib::signal_timeout().connect (mem_fun(*this, &SessionDialog::info_scroller_update), 50);
|
||||
|
||||
|
|
|
|||
|
|
@ -51,9 +51,11 @@ class SessionDialog : public ArdourDialog {
|
|||
const std::string& template_name, bool cancel_not_quit);
|
||||
~SessionDialog ();
|
||||
|
||||
void clear_given ();
|
||||
|
||||
std::string session_name (bool& should_be_new);
|
||||
std::string session_folder ();
|
||||
|
||||
|
||||
bool use_session_template();
|
||||
std::string session_template_name();
|
||||
|
||||
|
|
|
|||
|
|
@ -194,6 +194,7 @@ ProxyBase::ProxyBase (const string& name, const std::string& menu_name, const XM
|
|||
ProxyBase::~ProxyBase ()
|
||||
{
|
||||
delete vistracker;
|
||||
delete _window;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ namespace ARDOUR {
|
|||
*/
|
||||
bool init (bool with_vst, bool try_optimization, const char* localedir);
|
||||
void init_post_engine ();
|
||||
int cleanup ();
|
||||
void cleanup ();
|
||||
bool no_auto_connect ();
|
||||
void make_property_quarks ();
|
||||
|
||||
|
|
|
|||
|
|
@ -229,6 +229,7 @@ public:
|
|||
std::string _latency_output_name;
|
||||
framecnt_t _latency_signal_latency;
|
||||
bool _started_for_latency;
|
||||
bool _in_destructor;
|
||||
|
||||
void meter_thread ();
|
||||
void start_metering_thread ();
|
||||
|
|
@ -236,9 +237,6 @@ public:
|
|||
|
||||
static gint m_meter_exit;
|
||||
|
||||
void parameter_changed (const std::string&);
|
||||
PBD::ScopedConnection config_connection;
|
||||
|
||||
typedef std::map<std::string,AudioBackendInfo*> BackendMap;
|
||||
BackendMap _backends;
|
||||
AudioBackendInfo* backend_discover (const std::string&);
|
||||
|
|
|
|||
|
|
@ -881,15 +881,6 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
|
|||
|
||||
MIDI::MachineControl& mmc() { return *_mmc; }
|
||||
|
||||
/* Callbacks specifically related to JACK, and called directly
|
||||
* from the JACK audio backend.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_JACK_SESSION
|
||||
void jack_session_event (jack_session_event_t* event);
|
||||
#endif
|
||||
void jack_timebase_callback (jack_transport_state_t, pframes_t, jack_position_t*, int);
|
||||
|
||||
protected:
|
||||
friend class AudioEngine;
|
||||
void set_block_size (pframes_t nframes);
|
||||
|
|
|
|||
|
|
@ -79,6 +79,7 @@ AudioEngine::AudioEngine ()
|
|||
, _latency_flush_frames (0)
|
||||
, _latency_signal_latency (0)
|
||||
, _started_for_latency (false)
|
||||
, _in_destructor (false)
|
||||
{
|
||||
g_atomic_int_set (&m_meter_exit, 0);
|
||||
discover_backends ();
|
||||
|
|
@ -86,15 +87,9 @@ AudioEngine::AudioEngine ()
|
|||
|
||||
AudioEngine::~AudioEngine ()
|
||||
{
|
||||
_in_destructor = true;
|
||||
stop_metering_thread ();
|
||||
drop_backend ();
|
||||
|
||||
config_connection.disconnect ();
|
||||
|
||||
{
|
||||
Glib::Threads::Mutex::Lock tm (_process_lock);
|
||||
session_removed.signal ();
|
||||
stop_metering_thread ();
|
||||
}
|
||||
}
|
||||
|
||||
AudioEngine*
|
||||
|
|
@ -477,6 +472,7 @@ AudioEngine::discover_backends ()
|
|||
|
||||
Glib::PatternSpec so_extension_pattern("*backend.so");
|
||||
Glib::PatternSpec dylib_extension_pattern("*backend.dylib");
|
||||
Glib::PatternSpec dll_extension_pattern("*backend.dll");
|
||||
|
||||
find_matching_files_in_search_path (backend_search_path (),
|
||||
so_extension_pattern, backend_modules);
|
||||
|
|
@ -484,6 +480,9 @@ AudioEngine::discover_backends ()
|
|||
find_matching_files_in_search_path (backend_search_path (),
|
||||
dylib_extension_pattern, backend_modules);
|
||||
|
||||
find_matching_files_in_search_path (backend_search_path (),
|
||||
dll_extension_pattern, backend_modules);
|
||||
|
||||
DEBUG_TRACE (DEBUG::Panning, string_compose (_("looking for backends in %1\n"), backend_search_path().to_string()));
|
||||
|
||||
for (vector<std::string>::iterator i = backend_modules.begin(); i != backend_modules.end(); ++i) {
|
||||
|
|
@ -998,6 +997,11 @@ AudioEngine::update_latencies ()
|
|||
void
|
||||
AudioEngine::halted_callback (const char* why)
|
||||
{
|
||||
if (_in_destructor) {
|
||||
/* everything is under control */
|
||||
return;
|
||||
}
|
||||
|
||||
stop_metering_thread ();
|
||||
_running = false;
|
||||
|
||||
|
|
|
|||
|
|
@ -366,9 +366,15 @@ ARDOUR::init_post_engine ()
|
|||
ARDOUR::PluginManager::instance().refresh ();
|
||||
}
|
||||
|
||||
int
|
||||
ARDOUR::cleanup ()
|
||||
void
|
||||
ARDOUR::cleanup ()
|
||||
{
|
||||
if (!libardour_initialized) {
|
||||
return;
|
||||
}
|
||||
|
||||
ARDOUR::AudioEngine::destroy ();
|
||||
|
||||
delete Library;
|
||||
#ifdef HAVE_LRDF
|
||||
lrdf_cleanup ();
|
||||
|
|
@ -382,7 +388,8 @@ ARDOUR::cleanup ()
|
|||
vstfx_exit();
|
||||
#endif
|
||||
PBD::cleanup ();
|
||||
return 0;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -182,7 +182,6 @@ libardour_sources = [
|
|||
'session_events.cc',
|
||||
'session_export.cc',
|
||||
'session_handle.cc',
|
||||
'session_jack.cc',
|
||||
'session_ltc.cc',
|
||||
'session_metadata.cc',
|
||||
'session_midi.cc',
|
||||
|
|
@ -246,8 +245,6 @@ def configure(conf):
|
|||
path_prefix + 'version.cc',
|
||||
'libardour3', conf.env['MAJOR'], conf.env['MINOR'], 0)
|
||||
autowaf.configure(conf)
|
||||
autowaf.check_pkg(conf, 'jack', uselib_store='JACK',
|
||||
atleast_version='0.118.2')
|
||||
if Options.options.dist_target == 'auto':
|
||||
if re.search ("linux", sys.platform) != None:
|
||||
autowaf.check_pkg(conf, 'alsa', uselib_store='ALSA')
|
||||
|
|
@ -304,9 +301,6 @@ def configure(conf):
|
|||
conf.check(header_name='sys/vfs.h', define_name='HAVE_SYS_VFS_H',mandatory=False)
|
||||
conf.check(header_name='sys/statvfs.h', define_name='HAVE_SYS_STATVFS_H',mandatory=False)
|
||||
|
||||
conf.check(header_name='jack/session.h', uselib = [ 'JACK' ],
|
||||
define_name='HAVE_JACK_SESSION')
|
||||
|
||||
conf.check(header_name='unistd.h', define_name='HAVE_UNISTD',mandatory=False)
|
||||
|
||||
if flac_supported():
|
||||
|
|
@ -343,8 +337,8 @@ def build(bld):
|
|||
obj.name = 'libardour'
|
||||
obj.target = 'ardour'
|
||||
obj.uselib = ['GLIBMM','GTHREAD','AUBIO','SIGCPP','XML','UUID',
|
||||
'JACK', 'ALSA', 'SNDFILE','SAMPLERATE','LRDF',
|
||||
'AUDIOUNITS', 'OSX','BOOST','CURL','DL']
|
||||
'SNDFILE','SAMPLERATE','LRDF','AUDIOUNITS',
|
||||
'OSX','BOOST','CURL','DL']
|
||||
obj.use = ['libpbd','libmidipp','libevoral','libvamphost',
|
||||
'libvampplugin','libtaglib','librubberband',
|
||||
'libaudiographer','libltc','libtimecode']
|
||||
|
|
@ -410,7 +404,7 @@ def build(bld):
|
|||
testcommon.includes = obj.includes + ['test', '../pbd', '..']
|
||||
testcommon.source = ['test/test_globals.cc', 'test/testrunner.cc', 'test/test_needing_session.cc',
|
||||
'test/test_common.cc', 'test/dummy_lxvst.cc', 'test/audio_region_test.cc', 'test/test_util.cc']
|
||||
testcommon.uselib = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD',
|
||||
testcommon.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD',
|
||||
'SAMPLERATE','XML','LRDF','COREAUDIO']
|
||||
testcommon.use = ['libpbd','libmidipp','libevoral','libvamphost',
|
||||
'libvampplugin','libtaglib','librubberband',
|
||||
|
|
@ -488,7 +482,7 @@ def build(bld):
|
|||
|
||||
session_load_tester.includes = obj.includes
|
||||
session_load_tester.includes.append ('test')
|
||||
session_load_tester.uselib = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD',
|
||||
session_load_tester.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD',
|
||||
'SAMPLERATE','XML','LRDF','COREAUDIO']
|
||||
session_load_tester.use = ['libpbd','libmidipp','ardour']
|
||||
session_load_tester.name = 'libardour-session-load-tester'
|
||||
|
|
@ -523,7 +517,7 @@ def build(bld):
|
|||
|
||||
profilingobj.includes = obj.includes
|
||||
profilingobj.includes.append ('test')
|
||||
profilingobj.uselib = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD',
|
||||
profilingobj.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD',
|
||||
'SAMPLERATE','XML','LRDF','COREAUDIO']
|
||||
profilingobj.use = ['libpbd','libmidipp','ardour']
|
||||
profilingobj.name = 'libardour-profiling'
|
||||
|
|
@ -550,7 +544,7 @@ def create_ardour_test_program(bld, includes, name, target, sources):
|
|||
testobj = bld(features = 'cxx cxxprogram')
|
||||
testobj.includes = includes + ['test', '../pbd', '..']
|
||||
testobj.source = sources
|
||||
testobj.uselib = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD',
|
||||
testobj.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD',
|
||||
'SAMPLERATE','XML','LRDF','COREAUDIO']
|
||||
testobj.use = ['libpbd','libmidipp','libevoral','libvamphost',
|
||||
'libvampplugin','libtaglib','librubberband',
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@
|
|||
#include "jack_audiobackend.h"
|
||||
#include "jack_connection.h"
|
||||
#include "jack_utils.h"
|
||||
#include "jack_session.h"
|
||||
|
||||
#include "i18n.h"
|
||||
|
||||
|
|
@ -64,6 +65,7 @@ JACKAudioBackend::JACKAudioBackend (AudioEngine& e, boost::shared_ptr<JackConnec
|
|||
, _target_systemic_output_latency (0)
|
||||
, _current_sample_rate (0)
|
||||
, _current_buffer_size (0)
|
||||
, _session (0)
|
||||
{
|
||||
_jack_connection->Connected.connect_same_thread (jack_connection_connection, boost::bind (&JACKAudioBackend::when_connected_to_jack, this));
|
||||
_jack_connection->Disconnected.connect_same_thread (disconnect_connection, boost::bind (&JACKAudioBackend::disconnected, this, _1));
|
||||
|
|
@ -748,7 +750,8 @@ JACKAudioBackend::jack_timebase_callback (jack_transport_state_t state, pframes_
|
|||
ARDOUR::Session* session = engine.session();
|
||||
|
||||
if (session) {
|
||||
session->jack_timebase_callback (state, nframes, pos, new_position);
|
||||
JACKSession jsession (session);
|
||||
jsession.timebase_callback (state, nframes, pos, new_position);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -793,7 +796,6 @@ JACKAudioBackend::_xrun_callback (void *arg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef HAVE_JACK_SESSION
|
||||
void
|
||||
JACKAudioBackend::_session_callback (jack_session_event_t *event, void *arg)
|
||||
{
|
||||
|
|
@ -801,10 +803,10 @@ JACKAudioBackend::_session_callback (jack_session_event_t *event, void *arg)
|
|||
ARDOUR::Session* session = jab->engine.session();
|
||||
|
||||
if (session) {
|
||||
session->jack_session_event (event);
|
||||
JACKSession jsession (session);
|
||||
jsession.session_event (event);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
JACKAudioBackend::_freewheel_callback (int onoff, void *arg)
|
||||
|
|
|
|||
|
|
@ -30,15 +30,14 @@
|
|||
#include <boost/shared_ptr.hpp>
|
||||
|
||||
#include <jack/jack.h>
|
||||
#ifdef HAVE_JACK_SESSION
|
||||
#include <jack/session.h>
|
||||
#endif
|
||||
|
||||
#include "ardour/audio_backend.h"
|
||||
|
||||
namespace ARDOUR {
|
||||
|
||||
class JackConnection;
|
||||
class JACKSession;
|
||||
|
||||
class JACKAudioBackend : public AudioBackend {
|
||||
public:
|
||||
|
|
@ -196,9 +195,7 @@ class JACKAudioBackend : public AudioBackend {
|
|||
static int _jack_sync_callback (jack_transport_state_t, jack_position_t*, void *arg);
|
||||
static void _freewheel_callback (int , void *arg);
|
||||
static void _latency_callback (jack_latency_callback_mode_t, void*);
|
||||
#ifdef HAVE_JACK_SESSION
|
||||
static void _session_callback (jack_session_event_t *event, void *arg);
|
||||
#endif
|
||||
|
||||
void jack_timebase_callback (jack_transport_state_t, pframes_t, jack_position_t*, int);
|
||||
int jack_sync_callback (jack_transport_state_t, jack_position_t*);
|
||||
|
|
@ -261,6 +258,12 @@ class JACKAudioBackend : public AudioBackend {
|
|||
|
||||
void when_connected_to_jack ();
|
||||
PBD::ScopedConnection jack_connection_connection;
|
||||
|
||||
/* Object to manage interactions with Session in a way that
|
||||
keeps JACK out of libardour directly
|
||||
*/
|
||||
|
||||
JACKSession* _session;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright (C) 1999-2013 Paul Davis
|
||||
Copyright (C) 2013 Paul Davis
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -18,16 +18,11 @@
|
|||
*/
|
||||
|
||||
|
||||
#ifdef WAF_BUILD
|
||||
#include "libardour-config.h"
|
||||
#endif
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#include <glibmm/miscutils.h>
|
||||
|
||||
#include "jack/jack.h"
|
||||
#include "jack/session.h"
|
||||
#include <jack/jack.h>
|
||||
|
||||
#include "ardour/audioengine.h"
|
||||
#include "ardour/filename_extensions.h"
|
||||
|
|
@ -35,12 +30,22 @@
|
|||
#include "ardour/session_directory.h"
|
||||
#include "ardour/tempo.h"
|
||||
|
||||
#include "jack_session.h"
|
||||
|
||||
using namespace ARDOUR;
|
||||
using std::string;
|
||||
|
||||
#ifdef HAVE_JACK_SESSION
|
||||
JACKSession::JACKSession (Session* s)
|
||||
: SessionHandlePtr (s)
|
||||
{
|
||||
}
|
||||
|
||||
JACKSession::~JACKSession ()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
Session::jack_session_event (jack_session_event_t* event)
|
||||
JACKSession::session_event (jack_session_event_t* event)
|
||||
{
|
||||
char timebuf[128], *tmp;
|
||||
time_t n;
|
||||
|
|
@ -54,7 +59,7 @@ Session::jack_session_event (jack_session_event_t* event)
|
|||
|
||||
if (event->type == JackSessionSaveTemplate)
|
||||
{
|
||||
if (save_template( timebuf )) {
|
||||
if (_session->save_template( timebuf )) {
|
||||
event->flags = JackSessionSaveError;
|
||||
} else {
|
||||
string cmd ("ardour3 -P -U ");
|
||||
|
|
@ -67,10 +72,10 @@ Session::jack_session_event (jack_session_event_t* event)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (save_state (timebuf)) {
|
||||
if (_session->save_state (timebuf)) {
|
||||
event->flags = JackSessionSaveError;
|
||||
} else {
|
||||
std::string xml_path (_session_dir->root_path());
|
||||
std::string xml_path (_session->session_directory().root_path());
|
||||
std::string legalized_filename = legalize_for_path (timebuf) + statefile_suffix;
|
||||
xml_path = Glib::build_filename (xml_path, legalized_filename);
|
||||
|
||||
|
|
@ -95,66 +100,69 @@ Session::jack_session_event (jack_session_event_t* event)
|
|||
}
|
||||
|
||||
if (event->type == JackSessionSaveAndQuit) {
|
||||
Quit (); /* EMIT SIGNAL */
|
||||
_session->Quit (); /* EMIT SIGNAL */
|
||||
}
|
||||
|
||||
jack_session_event_free( event );
|
||||
jack_session_event_free (event);
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
Session::jack_timebase_callback (jack_transport_state_t /*state*/,
|
||||
JACKSession::timebase_callback (jack_transport_state_t /*state*/,
|
||||
pframes_t /*nframes*/,
|
||||
jack_position_t* pos,
|
||||
int /*new_position*/)
|
||||
{
|
||||
Timecode::BBT_Time bbt;
|
||||
TempoMap& tempo_map (_session->tempo_map());
|
||||
framepos_t tf = _session->transport_frame ();
|
||||
|
||||
/* BBT info */
|
||||
|
||||
if (_tempo_map) {
|
||||
|
||||
TempoMetric metric (_tempo_map->metric_at (_transport_frame));
|
||||
|
||||
try {
|
||||
_tempo_map->bbt_time_rt (_transport_frame, bbt);
|
||||
|
||||
pos->bar = bbt.bars;
|
||||
pos->beat = bbt.beats;
|
||||
pos->tick = bbt.ticks;
|
||||
|
||||
// XXX still need to set bar_start_tick
|
||||
|
||||
pos->beats_per_bar = metric.meter().divisions_per_bar();
|
||||
pos->beat_type = metric.meter().note_divisor();
|
||||
pos->ticks_per_beat = Timecode::BBT_Time::ticks_per_beat;
|
||||
pos->beats_per_minute = metric.tempo().beats_per_minute();
|
||||
|
||||
pos->valid = jack_position_bits_t (pos->valid | JackPositionBBT);
|
||||
|
||||
} catch (...) {
|
||||
/* no message */
|
||||
}
|
||||
TempoMetric metric (tempo_map.metric_at (tf));
|
||||
|
||||
try {
|
||||
tempo_map.bbt_time_rt (tf, bbt);
|
||||
|
||||
pos->bar = bbt.bars;
|
||||
pos->beat = bbt.beats;
|
||||
pos->tick = bbt.ticks;
|
||||
|
||||
// XXX still need to set bar_start_tick
|
||||
|
||||
pos->beats_per_bar = metric.meter().divisions_per_bar();
|
||||
pos->beat_type = metric.meter().note_divisor();
|
||||
pos->ticks_per_beat = Timecode::BBT_Time::ticks_per_beat;
|
||||
pos->beats_per_minute = metric.tempo().beats_per_minute();
|
||||
|
||||
pos->valid = jack_position_bits_t (pos->valid | JackPositionBBT);
|
||||
|
||||
} catch (...) {
|
||||
/* no message */
|
||||
}
|
||||
|
||||
#ifdef HAVE_JACK_VIDEO_SUPPORT
|
||||
//poke audio video ratio so Ardour can track Video Sync
|
||||
pos->audio_frames_per_video_frame = frame_rate() / timecode_frames_per_second();
|
||||
pos->audio_frames_per_video_frame = _session->frame_rate() / _session->timecode_frames_per_second();
|
||||
pos->valid = jack_position_bits_t (pos->valid | JackAudioVideoRatio);
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
#ifdef HAVE_JACK_TIMCODE_SUPPORT
|
||||
/* This is not yet defined in JACK */
|
||||
|
||||
/* Timecode info */
|
||||
|
||||
pos->timecode_offset = config.get_timecode_offset();
|
||||
t.timecode_frame_rate = timecode_frames_per_second();
|
||||
pos->valid = jack_position_bits_t (pos->valid | JackPositionTimecode;
|
||||
pos->timecode_offset = _session->config.get_timecode_offset();
|
||||
t.timecode_frame_rate = _session->timecode_frames_per_second();
|
||||
pos->valid = jack_position_bits_t (pos->valid | JackPositionTimecode);
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_JACK_LOOPING_SUPPORT
|
||||
/* This is not yet defined in JACK */
|
||||
if (_transport_speed) {
|
||||
|
||||
if (play_loop) {
|
||||
|
||||
Location* location = _locations.auto_loop_location();
|
||||
Location* location = _session->locations()->auto_loop_location();
|
||||
|
||||
if (location) {
|
||||
|
||||
47
libs/backends/jack/jack_session.h
Normal file
47
libs/backends/jack/jack_session.h
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
Copyright (C) 2013 Paul Davis
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __ardour_jack_audiobackend_jack_session_h__
|
||||
#define __ardour_jack_audiobackend_jack_session_h__
|
||||
|
||||
#include <jack/session.h>
|
||||
#include <jack/transport.h>
|
||||
|
||||
#include "ardour/types.h"
|
||||
#include "ardour/session_handle.h"
|
||||
|
||||
namespace ARDOUR {
|
||||
class Session;
|
||||
|
||||
class JACKSession : public ARDOUR::SessionHandlePtr
|
||||
{
|
||||
public:
|
||||
JACKSession (ARDOUR::Session* s);
|
||||
~JACKSession ();
|
||||
|
||||
void session_event (jack_session_event_t* event);
|
||||
void timebase_callback (jack_transport_state_t /*state*/,
|
||||
ARDOUR::pframes_t /*nframes*/,
|
||||
jack_position_t* pos,
|
||||
int /*new_position*/);
|
||||
};
|
||||
|
||||
} /* namespace */
|
||||
|
||||
#endif /* __ardour_jack_audiobackend_jack_session_h__ */
|
||||
|
|
@ -37,10 +37,10 @@ def build(bld):
|
|||
'jack_connection.cc',
|
||||
'jack_audiobackend.cc',
|
||||
'jack_portengine.cc',
|
||||
'jack_utils.cc'
|
||||
'jack_utils.cc',
|
||||
'jack_session.cc',
|
||||
]
|
||||
obj.includes = ['.']
|
||||
obj.cxxflags = [ '-fPIC' ]
|
||||
obj.name = 'jack_audiobackend'
|
||||
obj.target = 'jack_audiobackend'
|
||||
if Options.options.dist_target == 'mingw':
|
||||
|
|
|
|||
|
|
@ -120,9 +120,9 @@ UI::UI (string namestr, int *argc, char ***argv)
|
|||
|
||||
UI::~UI ()
|
||||
{
|
||||
_receiver.hangup ();
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
UI::caller_is_ui_thread ()
|
||||
{
|
||||
|
|
@ -265,12 +265,14 @@ UI::run (Receiver &old_receiver)
|
|||
|
||||
Glib::signal_idle().connect (bind_return (mem_fun (old_receiver, &Receiver::hangup), false));
|
||||
|
||||
starting ();
|
||||
if (starting ()) {
|
||||
return;
|
||||
}
|
||||
|
||||
_active = true;
|
||||
theMain->run ();
|
||||
_active = false;
|
||||
stopping ();
|
||||
_receiver.hangup ();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -156,8 +156,7 @@ class UI : public AbstractUI<UIRequest>
|
|||
stopping just after we return from it (at the top level)
|
||||
*/
|
||||
|
||||
sigc::signal<void> starting;
|
||||
sigc::signal<void> stopping;
|
||||
virtual int starting() = 0;
|
||||
|
||||
sigc::signal<void> theme_changed;
|
||||
|
||||
|
|
|
|||
10
wscript
10
wscript
|
|
@ -606,7 +606,12 @@ def configure(conf):
|
|||
if Options.options.boost_sp_debug:
|
||||
conf.env.append_value('CXXFLAGS', '-DBOOST_SP_ENABLE_DEBUG_HOOKS')
|
||||
|
||||
autowaf.check_header(conf, 'cxx', 'jack/session.h', define="JACK_SESSION", mandatory = False)
|
||||
conf.check_cxx(fragment = "#include <boost/version.hpp>\nint main(void) { return (BOOST_VERSION >= 103900 ? 0 : 1); }\n",
|
||||
execute = "1",
|
||||
mandatory = True,
|
||||
msg = 'Checking for boost library >= 1.39',
|
||||
okmsg = 'ok',
|
||||
errmsg = 'too old\nPlease install boost version 1.39 or higher.')
|
||||
|
||||
autowaf.check_pkg(conf, 'glib-2.0', uselib_store='GLIB', atleast_version='2.2')
|
||||
autowaf.check_pkg(conf, 'gthread-2.0', uselib_store='GTHREAD', atleast_version='2.2')
|
||||
|
|
@ -678,8 +683,6 @@ def configure(conf):
|
|||
else:
|
||||
conf.define('LXVST_SUPPORT', 1)
|
||||
conf.env['LXVST_SUPPORT'] = True
|
||||
if bool(conf.env['JACK_SESSION']):
|
||||
conf.define('HAVE_JACK_SESSION', 1)
|
||||
conf.define('WINDOWS_KEY', opts.windows_key)
|
||||
conf.env['PROGRAM_NAME'] = opts.program_name
|
||||
if opts.rt_alloc_debug:
|
||||
|
|
@ -741,7 +744,6 @@ const char* const ardour_config_info = "\\n\\
|
|||
write_config_text('FLAC', conf.is_defined('HAVE_FLAC'))
|
||||
write_config_text('FPU optimization', opts.fpu_optimization)
|
||||
write_config_text('Freedesktop files', opts.freedesktop)
|
||||
write_config_text('JACK session support', conf.is_defined('JACK_SESSION'))
|
||||
write_config_text('LV2 UI embedding', conf.is_defined('HAVE_SUIL'))
|
||||
write_config_text('LV2 support', conf.is_defined('LV2_SUPPORT'))
|
||||
write_config_text('LXVST support', conf.is_defined('LXVST_SUPPORT'))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue