mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-08 15:54:57 +01:00
Merge branch 'master' into windows+cc
Conflicts (hopefully resolved): gtk2_ardour/ardour_ui.cc
This commit is contained in:
commit
e466ce40ad
51 changed files with 1819 additions and 1369 deletions
|
|
@ -35,10 +35,9 @@
|
||||||
<menuitem action='addExistingAudioFiles'/>
|
<menuitem action='addExistingAudioFiles'/>
|
||||||
<!--menuitem action='importFromSession'/-->
|
<!--menuitem action='importFromSession'/-->
|
||||||
|
|
||||||
#ifndef NOVIDEOTIMELINE
|
|
||||||
<menuitem action='OpenVideo'/>
|
<menuitem action='OpenVideo'/>
|
||||||
<menuitem action='CloseVideo'/>
|
<menuitem action='CloseVideo'/>
|
||||||
#endif
|
|
||||||
<menu name='Export' action='Export'>
|
<menu name='Export' action='Export'>
|
||||||
<menuitem action='ExportAudio'/>
|
<menuitem action='ExportAudio'/>
|
||||||
<menuitem action='StemExport'/>
|
<menuitem action='StemExport'/>
|
||||||
|
|
@ -282,9 +281,7 @@
|
||||||
<menuitem action='snap-regions-to-grid'/>
|
<menuitem action='snap-regions-to-grid'/>
|
||||||
<menuitem action='toggle-region-lock'/>
|
<menuitem action='toggle-region-lock'/>
|
||||||
<menuitem action='toggle-region-lock-style'/>
|
<menuitem action='toggle-region-lock-style'/>
|
||||||
#ifndef NOVIDEOTIMELINE
|
|
||||||
<menuitem action='toggle-region-video-lock'/>
|
<menuitem action='toggle-region-video-lock'/>
|
||||||
#endif
|
|
||||||
<menuitem action='set-region-sync-position'/>
|
<menuitem action='set-region-sync-position'/>
|
||||||
<menuitem action='remove-region-sync'/>
|
<menuitem action='remove-region-sync'/>
|
||||||
<menuitem action='nudge-forward'/>
|
<menuitem action='nudge-forward'/>
|
||||||
|
|
@ -437,9 +434,7 @@
|
||||||
<menuitem action="toggle-cd-marker-ruler"/>
|
<menuitem action="toggle-cd-marker-ruler"/>
|
||||||
<menuitem action="toggle-marker-ruler"/>
|
<menuitem action="toggle-marker-ruler"/>
|
||||||
<separator/>
|
<separator/>
|
||||||
#ifndef NOVIDEOTIMELINE
|
|
||||||
<menuitem action="toggle-video-ruler"/>
|
<menuitem action="toggle-video-ruler"/>
|
||||||
#endif
|
|
||||||
</menu>
|
</menu>
|
||||||
<menu action="VideoMonitorMenu">
|
<menu action="VideoMonitorMenu">
|
||||||
<menuitem action="zoom-vmon-100"/>
|
<menuitem action="zoom-vmon-100"/>
|
||||||
|
|
@ -543,10 +538,8 @@
|
||||||
<menuitem action="toggle-marker-ruler"/>
|
<menuitem action="toggle-marker-ruler"/>
|
||||||
<menuitem action="toggle-cd-marker-ruler"/>
|
<menuitem action="toggle-cd-marker-ruler"/>
|
||||||
<menuitem action="toggle-loop-punch-ruler"/>
|
<menuitem action="toggle-loop-punch-ruler"/>
|
||||||
#ifndef NOVIDEOTIMELINE
|
|
||||||
<separator/>
|
<separator/>
|
||||||
<menuitem action="toggle-video-ruler"/>
|
<menuitem action="toggle-video-ruler"/>
|
||||||
#endif
|
|
||||||
</popup>
|
</popup>
|
||||||
|
|
||||||
<popup name='ProcessorMenu'>
|
<popup name='ProcessorMenu'>
|
||||||
|
|
@ -642,9 +635,7 @@
|
||||||
<menuitem action='naturalize-region'/>
|
<menuitem action='naturalize-region'/>
|
||||||
<menuitem action='toggle-region-lock'/>
|
<menuitem action='toggle-region-lock'/>
|
||||||
<menuitem action='toggle-region-lock-style'/>
|
<menuitem action='toggle-region-lock-style'/>
|
||||||
#ifndef NOVIDEOTIMELINE
|
|
||||||
<menuitem action='toggle-region-video-lock'/>
|
<menuitem action='toggle-region-video-lock'/>
|
||||||
#endif
|
|
||||||
<menuitem action='snap-regions-to-grid'/>
|
<menuitem action='snap-regions-to-grid'/>
|
||||||
<menuitem action='set-region-sync-position'/>
|
<menuitem action='set-region-sync-position'/>
|
||||||
<menuitem action='remove-region-sync'/>
|
<menuitem action='remove-region-sync'/>
|
||||||
|
|
|
||||||
|
|
@ -162,7 +162,7 @@ ArdourButton::set_markup (const std::string& str)
|
||||||
_layout = Pango::Layout::create (get_pango_context());
|
_layout = Pango::Layout::create (get_pango_context());
|
||||||
}
|
}
|
||||||
|
|
||||||
_layout->set_text (str);
|
_layout->set_markup (str);
|
||||||
queue_resize ();
|
queue_resize ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -439,7 +439,7 @@ ARDOUR_UI::engine_halted (const char* reason, bool free_reason)
|
||||||
msgstr = string_compose (_("The audio backend was shutdown because:\n\n%1"), reason);
|
msgstr = string_compose (_("The audio backend was shutdown because:\n\n%1"), reason);
|
||||||
} else {
|
} else {
|
||||||
msgstr = string_compose (_("\
|
msgstr = string_compose (_("\
|
||||||
`The audio backend has either been shutdown or it\n\
|
The audio backend has either been shutdown or it\n\
|
||||||
disconnected %1 because %1\n\
|
disconnected %1 because %1\n\
|
||||||
was not fast enough. Try to restart\n\
|
was not fast enough. Try to restart\n\
|
||||||
the audio backend and save the session."), PROGRAM_NAME);
|
the audio backend and save the session."), PROGRAM_NAME);
|
||||||
|
|
@ -800,7 +800,11 @@ ARDOUR_UI::starting ()
|
||||||
* audio backend end up.
|
* audio backend end up.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
try {
|
||||||
audio_midi_setup.get (true);
|
audio_midi_setup.get (true);
|
||||||
|
} catch (...) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/* go get a session */
|
/* go get a session */
|
||||||
|
|
||||||
|
|
@ -2851,6 +2855,22 @@ ARDOUR_UI::load_session (const std::string& path, const std::string& snap_name,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!new_session->writable()) {
|
||||||
|
MessageDialog msg (_("This session has been opened in read-only mode.\n\nYou will not be able to record or save."),
|
||||||
|
true,
|
||||||
|
Gtk::MESSAGE_INFO,
|
||||||
|
BUTTONS_OK);
|
||||||
|
|
||||||
|
msg.set_keep_above (true);
|
||||||
|
msg.set_title (_("Read-only Session"));
|
||||||
|
msg.set_position (Gtk::WIN_POS_CENTER);
|
||||||
|
pop_back_splash (msg);
|
||||||
|
msg.present ();
|
||||||
|
(void) msg.run ();
|
||||||
|
msg.hide ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Now the session been created, add the transport controls */
|
/* Now the session been created, add the transport controls */
|
||||||
new_session->add_controllable(roll_controllable);
|
new_session->add_controllable(roll_controllable);
|
||||||
new_session->add_controllable(stop_controllable);
|
new_session->add_controllable(stop_controllable);
|
||||||
|
|
@ -3815,8 +3835,13 @@ int
|
||||||
ARDOUR_UI::reconnect_to_engine ()
|
ARDOUR_UI::reconnect_to_engine ()
|
||||||
{
|
{
|
||||||
if (AudioEngine::instance()->start ()) {
|
if (AudioEngine::instance()->start ()) {
|
||||||
|
if (editor) {
|
||||||
MessageDialog msg (*editor, _("Could not reconnect to the Audio/MIDI engine"));
|
MessageDialog msg (*editor, _("Could not reconnect to the Audio/MIDI engine"));
|
||||||
msg.run ();
|
msg.run ();
|
||||||
|
} else {
|
||||||
|
MessageDialog msg (_("Could not reconnect to the Audio/MIDI engine"));
|
||||||
|
msg.run ();
|
||||||
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4133,6 +4158,7 @@ int
|
||||||
ARDOUR_UI::do_audio_midi_setup (uint32_t desired_sample_rate)
|
ARDOUR_UI::do_audio_midi_setup (uint32_t desired_sample_rate)
|
||||||
{
|
{
|
||||||
audio_midi_setup->set_desired_sample_rate (desired_sample_rate);
|
audio_midi_setup->set_desired_sample_rate (desired_sample_rate);
|
||||||
|
audio_midi_setup->set_position (WIN_POS_CENTER);
|
||||||
|
|
||||||
switch (audio_midi_setup->run()) {
|
switch (audio_midi_setup->run()) {
|
||||||
case Gtk::RESPONSE_OK:
|
case Gtk::RESPONSE_OK:
|
||||||
|
|
|
||||||
|
|
@ -139,7 +139,7 @@ ARDOUR_UI::install_actions ()
|
||||||
sigc::mem_fun (*this, &ARDOUR_UI::remove_video));
|
sigc::mem_fun (*this, &ARDOUR_UI::remove_video));
|
||||||
act->set_sensitive (false);
|
act->set_sensitive (false);
|
||||||
act = ActionManager::register_action (main_actions, X_("ExportVideo"), _("Export To Video File"),
|
act = ActionManager::register_action (main_actions, X_("ExportVideo"), _("Export To Video File"),
|
||||||
sigc::mem_fun (*editor, &PublicEditor::export_video));
|
hide_return (sigc::bind (sigc::mem_fun(*editor, &PublicEditor::export_video), false)));
|
||||||
ActionManager::session_sensitive_actions.push_back (act);
|
ActionManager::session_sensitive_actions.push_back (act);
|
||||||
|
|
||||||
act = ActionManager::register_action (main_actions, X_("Snapshot"), _("Snapshot..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::snapshot_session), false));
|
act = ActionManager::register_action (main_actions, X_("Snapshot"), _("Snapshot..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::snapshot_session), false));
|
||||||
|
|
|
||||||
|
|
@ -1913,6 +1913,9 @@ Editor::add_selection_context_items (Menu_Helpers::MenuList& edit_items)
|
||||||
edit_items.push_back (MenuElem (_("Bounce Range to Region List"), sigc::bind (sigc::mem_fun(*this, &Editor::bounce_range_selection), false, false)));
|
edit_items.push_back (MenuElem (_("Bounce Range to Region List"), sigc::bind (sigc::mem_fun(*this, &Editor::bounce_range_selection), false, false)));
|
||||||
edit_items.push_back (MenuElem (_("Bounce Range to Region List With Processing"), sigc::bind (sigc::mem_fun(*this, &Editor::bounce_range_selection), false, true)));
|
edit_items.push_back (MenuElem (_("Bounce Range to Region List With Processing"), sigc::bind (sigc::mem_fun(*this, &Editor::bounce_range_selection), false, true)));
|
||||||
edit_items.push_back (MenuElem (_("Export Range..."), sigc::mem_fun(*this, &Editor::export_selection)));
|
edit_items.push_back (MenuElem (_("Export Range..."), sigc::mem_fun(*this, &Editor::export_selection)));
|
||||||
|
if (ARDOUR_UI::instance()->video_timeline->get_duration() > 0) {
|
||||||
|
edit_items.push_back (MenuElem (_("Export Video Range..."), sigc::bind (sigc::mem_fun(*this, &Editor::export_video), true)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -895,7 +895,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
|
||||||
void toggle_ruler_video (bool onoff) {ruler_video_action->set_active(onoff);}
|
void toggle_ruler_video (bool onoff) {ruler_video_action->set_active(onoff);}
|
||||||
int videotl_bar_height; /* in units of timebar_height; default: 4 */
|
int videotl_bar_height; /* in units of timebar_height; default: 4 */
|
||||||
int get_videotl_bar_height () const { return videotl_bar_height; }
|
int get_videotl_bar_height () const { return videotl_bar_height; }
|
||||||
void export_video ();
|
void export_video (bool range = false);
|
||||||
void toggle_region_video_lock ();
|
void toggle_region_video_lock ();
|
||||||
|
|
||||||
Gtk::VBox time_bars_vbox;
|
Gtk::VBox time_bars_vbox;
|
||||||
|
|
|
||||||
|
|
@ -111,7 +111,7 @@ Editor::embed_audio_from_video (std::string path, framepos_t n)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Editor::export_video ()
|
Editor::export_video (bool range)
|
||||||
{
|
{
|
||||||
if (ARDOUR::Config->get_show_video_export_info()) {
|
if (ARDOUR::Config->get_show_video_export_info()) {
|
||||||
ExportVideoInfobox infobox (_session);
|
ExportVideoInfobox infobox (_session);
|
||||||
|
|
@ -127,7 +127,7 @@ Editor::export_video ()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ExportVideoDialog dialog (_session, get_selection().time);
|
ExportVideoDialog dialog (_session, get_selection().time, range);
|
||||||
Gtk::ResponseType r = (Gtk::ResponseType) dialog.run();
|
Gtk::ResponseType r = (Gtk::ResponseType) dialog.run();
|
||||||
(void) r; // keep gcc quiet
|
(void) r; // keep gcc quiet
|
||||||
dialog.hide();
|
dialog.hide();
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@
|
||||||
#include "pbd/error.h"
|
#include "pbd/error.h"
|
||||||
#include "pbd/xml++.h"
|
#include "pbd/xml++.h"
|
||||||
#include "pbd/unwind.h"
|
#include "pbd/unwind.h"
|
||||||
|
#include "pbd/failed_constructor.h"
|
||||||
|
|
||||||
#include <gtkmm/alignment.h>
|
#include <gtkmm/alignment.h>
|
||||||
#include <gtkmm/stock.h>
|
#include <gtkmm/stock.h>
|
||||||
|
|
@ -57,9 +58,14 @@ using namespace Gtkmm2ext;
|
||||||
using namespace PBD;
|
using namespace PBD;
|
||||||
using namespace Glib;
|
using namespace Glib;
|
||||||
|
|
||||||
|
static const unsigned int midi_tab = -1; /* not currently in use */
|
||||||
|
static const unsigned int latency_tab = 1; /* zero-based, page zero is the main setup page */
|
||||||
|
|
||||||
|
static const char* results_markup = X_("<span foreground=\"red\" style=\"italic\" size=\"larger\">%1</span>");
|
||||||
|
|
||||||
EngineControl::EngineControl ()
|
EngineControl::EngineControl ()
|
||||||
: ArdourDialog (_("Audio/MIDI Setup"))
|
: ArdourDialog (_("Audio/MIDI Setup"))
|
||||||
, basic_packer (9, 3)
|
, basic_packer (9, 4)
|
||||||
, input_latency_adjustment (0, 0, 99999, 1)
|
, input_latency_adjustment (0, 0, 99999, 1)
|
||||||
, input_latency (input_latency_adjustment)
|
, input_latency (input_latency_adjustment)
|
||||||
, output_latency_adjustment (0, 0, 99999, 1)
|
, output_latency_adjustment (0, 0, 99999, 1)
|
||||||
|
|
@ -71,12 +77,14 @@ EngineControl::EngineControl ()
|
||||||
, ports_adjustment (128, 8, 1024, 1, 16)
|
, ports_adjustment (128, 8, 1024, 1, 16)
|
||||||
, ports_spinner (ports_adjustment)
|
, ports_spinner (ports_adjustment)
|
||||||
, control_app_button (_("Device Control Panel"))
|
, control_app_button (_("Device Control Panel"))
|
||||||
, lm_start_stop_label (_("Measure latency"))
|
, lm_measure_button (_("Measure"))
|
||||||
, lm_use_button (_("Use results"))
|
, lm_use_button (_("Use results"))
|
||||||
, lm_table (5, 2)
|
, lm_back_button (_("Back to settings ... (ignore results)"))
|
||||||
|
, lm_button (_("Calibrate..."))
|
||||||
|
, lm_table (12, 3)
|
||||||
, have_lm_results (false)
|
, have_lm_results (false)
|
||||||
|
, lm_running (false)
|
||||||
, midi_refresh_button (_("Refresh list"))
|
, midi_refresh_button (_("Refresh list"))
|
||||||
, aj_button (_("Start MIDI ALSA/JACK bridge"))
|
|
||||||
, ignore_changes (0)
|
, ignore_changes (0)
|
||||||
, _desired_sample_rate (0)
|
, _desired_sample_rate (0)
|
||||||
, no_push (true)
|
, no_push (true)
|
||||||
|
|
@ -94,6 +102,13 @@ EngineControl::EngineControl ()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
vector<const ARDOUR::AudioBackendInfo*> backends = ARDOUR::AudioEngine::instance()->available_backends();
|
vector<const ARDOUR::AudioBackendInfo*> backends = ARDOUR::AudioEngine::instance()->available_backends();
|
||||||
|
|
||||||
|
if (backends.empty()) {
|
||||||
|
MessageDialog msg (string_compose (_("No audio/MIDI backends detected. %1 cannot run\n\n(This is a build/packaging/system error. It should never happen.)"), PROGRAM_NAME));
|
||||||
|
msg.run ();
|
||||||
|
throw failed_constructor ();
|
||||||
|
}
|
||||||
|
|
||||||
for (vector<const ARDOUR::AudioBackendInfo*>::const_iterator b = backends.begin(); b != backends.end(); ++b) {
|
for (vector<const ARDOUR::AudioBackendInfo*>::const_iterator b = backends.begin(); b != backends.end(); ++b) {
|
||||||
strings.push_back ((*b)->name);
|
strings.push_back ((*b)->name);
|
||||||
}
|
}
|
||||||
|
|
@ -108,7 +123,7 @@ EngineControl::EngineControl ()
|
||||||
|
|
||||||
basic_packer.set_spacings (6);
|
basic_packer.set_spacings (6);
|
||||||
basic_packer.set_border_width (12);
|
basic_packer.set_border_width (12);
|
||||||
basic_packer.set_homogeneous (true);
|
basic_packer.set_homogeneous (false);
|
||||||
|
|
||||||
/* pack it in */
|
/* pack it in */
|
||||||
|
|
||||||
|
|
@ -122,8 +137,10 @@ EngineControl::EngineControl ()
|
||||||
|
|
||||||
row = 0;
|
row = 0;
|
||||||
lm_table.set_row_spacings (12);
|
lm_table.set_row_spacings (12);
|
||||||
|
lm_table.set_col_spacings (6);
|
||||||
|
lm_table.set_homogeneous (false);
|
||||||
|
|
||||||
lm_table.attach (lm_title, 0, 2, row, row+1, xopt, (AttachOptions) 0);
|
lm_table.attach (lm_title, 0, 3, row, row+1, xopt, (AttachOptions) 0);
|
||||||
row++;
|
row++;
|
||||||
|
|
||||||
Gtk::Label* preamble;
|
Gtk::Label* preamble;
|
||||||
|
|
@ -131,17 +148,17 @@ EngineControl::EngineControl ()
|
||||||
preamble = manage (new Label);
|
preamble = manage (new Label);
|
||||||
preamble->set_width_chars (60);
|
preamble->set_width_chars (60);
|
||||||
preamble->set_line_wrap (true);
|
preamble->set_line_wrap (true);
|
||||||
preamble->set_markup (_("<span weight=\"bold\">Turn down the volume on your hardware to a very low level.</span>"));
|
preamble->set_markup (_("<span weight=\"bold\">Turn down the volume on your audio equipment to a very low level.</span>"));
|
||||||
|
|
||||||
lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
|
lm_table.attach (*preamble, 0, 3, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
|
||||||
row++;
|
row++;
|
||||||
|
|
||||||
preamble = manage (new Label);
|
preamble = manage (new Label);
|
||||||
preamble->set_width_chars (60);
|
preamble->set_width_chars (60);
|
||||||
preamble->set_line_wrap (true);
|
preamble->set_line_wrap (true);
|
||||||
preamble->set_markup (_("Select two channels below and connect them using a cable or (less ideally) a speaker and microphone."));
|
preamble->set_markup (_("Select two channels below and connect them using a cable."));
|
||||||
|
|
||||||
lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
|
lm_table.attach (*preamble, 0, 3, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
|
||||||
row++;
|
row++;
|
||||||
|
|
||||||
label = manage (new Label (_("Output channel")));
|
label = manage (new Label (_("Output channel")));
|
||||||
|
|
@ -149,7 +166,7 @@ EngineControl::EngineControl ()
|
||||||
|
|
||||||
Gtk::Alignment* misc_align = manage (new Alignment (0.0, 0.5));
|
Gtk::Alignment* misc_align = manage (new Alignment (0.0, 0.5));
|
||||||
misc_align->add (lm_output_channel_combo);
|
misc_align->add (lm_output_channel_combo);
|
||||||
lm_table.attach (*misc_align, 1, 2, row, row+1, xopt, (AttachOptions) 0);
|
lm_table.attach (*misc_align, 1, 3, row, row+1, xopt, (AttachOptions) 0);
|
||||||
++row;
|
++row;
|
||||||
|
|
||||||
label = manage (new Label (_("Input channel")));
|
label = manage (new Label (_("Input channel")));
|
||||||
|
|
@ -157,41 +174,61 @@ EngineControl::EngineControl ()
|
||||||
|
|
||||||
misc_align = manage (new Alignment (0.0, 0.5));
|
misc_align = manage (new Alignment (0.0, 0.5));
|
||||||
misc_align->add (lm_input_channel_combo);
|
misc_align->add (lm_input_channel_combo);
|
||||||
lm_table.attach (*misc_align, 1, 2, row, row+1, FILL, (AttachOptions) 0);
|
lm_table.attach (*misc_align, 1, 3, row, row+1, FILL, (AttachOptions) 0);
|
||||||
++row;
|
++row;
|
||||||
|
|
||||||
xopt = AttachOptions(0);
|
xopt = AttachOptions(0);
|
||||||
|
|
||||||
lm_measure_button.add (lm_start_stop_label);
|
lm_measure_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::latency_button_clicked));
|
||||||
|
|
||||||
lm_measure_button.signal_toggled().connect (sigc::mem_fun (*this, &EngineControl::latency_button_toggled));
|
|
||||||
lm_use_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::use_latency_button_clicked));
|
lm_use_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::use_latency_button_clicked));
|
||||||
|
lm_back_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (notebook, &Gtk::Notebook::set_current_page), 0));
|
||||||
|
|
||||||
lm_use_button.set_sensitive (false);
|
lm_use_button.set_sensitive (false);
|
||||||
|
|
||||||
|
/* Increase the default spacing around the labels of these three
|
||||||
|
* buttons
|
||||||
|
*/
|
||||||
|
|
||||||
|
Gtk::Misc* l;
|
||||||
|
|
||||||
|
if ((l = dynamic_cast<Gtk::Misc*>(lm_measure_button.get_child())) != 0) {
|
||||||
|
l->set_padding (10, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((l = dynamic_cast<Gtk::Misc*>(lm_use_button.get_child())) != 0) {
|
||||||
|
l->set_padding (10, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((l = dynamic_cast<Gtk::Misc*>(lm_back_button.get_child())) != 0) {
|
||||||
|
l->set_padding (10, 10);
|
||||||
|
}
|
||||||
|
|
||||||
preamble = manage (new Label);
|
preamble = manage (new Label);
|
||||||
preamble->set_width_chars (60);
|
preamble->set_width_chars (60);
|
||||||
preamble->set_line_wrap (true);
|
preamble->set_line_wrap (true);
|
||||||
preamble->set_markup (_("Once the channels are connected, click the \"Measure latency\" button."));
|
preamble->set_markup (_("Once the channels are connected, click the \"Measure\" button."));
|
||||||
lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
|
lm_table.attach (*preamble, 0, 3, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
|
||||||
row++;
|
row++;
|
||||||
|
|
||||||
lm_table.attach (lm_measure_button, 0, 2, row, row+1, xopt, (AttachOptions) 0);
|
|
||||||
++row;
|
|
||||||
lm_table.attach (lm_results, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
|
|
||||||
++row;
|
|
||||||
|
|
||||||
|
|
||||||
preamble = manage (new Label);
|
preamble = manage (new Label);
|
||||||
preamble->set_width_chars (60);
|
preamble->set_width_chars (60);
|
||||||
preamble->set_line_wrap (true);
|
preamble->set_line_wrap (true);
|
||||||
preamble->set_markup (_("When satisfied with the results, click the \"Use results\" button."));
|
preamble->set_markup (_("When satisfied with the results, click the \"Use results\" button."));
|
||||||
lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
|
lm_table.attach (*preamble, 0, 3, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
|
||||||
row++;
|
|
||||||
|
|
||||||
lm_table.attach (lm_use_button, 0, 2, row, row+1, xopt, (AttachOptions) 0);
|
++row; // skip a row in the table
|
||||||
++row;
|
++row; // skip a row in the table
|
||||||
|
|
||||||
lm_results.set_markup ("<i>No measurement results yet</i>");
|
lm_table.attach (lm_results, 0, 3, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
|
||||||
|
|
||||||
|
++row; // skip a row in the table
|
||||||
|
++row; // skip a row in the table
|
||||||
|
|
||||||
|
lm_table.attach (lm_measure_button, 0, 1, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
|
||||||
|
lm_table.attach (lm_use_button, 1, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
|
||||||
|
lm_table.attach (lm_back_button, 2, 3, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
|
||||||
|
|
||||||
|
lm_results.set_markup (string_compose (results_markup, _("No measurement results yet")));
|
||||||
|
|
||||||
lm_vbox.set_border_width (12);
|
lm_vbox.set_border_width (12);
|
||||||
lm_vbox.pack_start (lm_table, false, false);
|
lm_vbox.pack_start (lm_table, false, false);
|
||||||
|
|
@ -199,11 +236,11 @@ EngineControl::EngineControl ()
|
||||||
/* pack it all up */
|
/* pack it all up */
|
||||||
|
|
||||||
notebook.pages().push_back (TabElem (basic_vbox, _("Audio")));
|
notebook.pages().push_back (TabElem (basic_vbox, _("Audio")));
|
||||||
notebook.pages().push_back (TabElem (midi_vbox, _("MIDI")));
|
// notebook.pages().push_back (TabElem (midi_vbox, _("MIDI")));
|
||||||
notebook.pages().push_back (TabElem (lm_vbox, _("Latency")));
|
notebook.pages().push_back (TabElem (lm_vbox, _("Latency")));
|
||||||
notebook.set_border_width (12);
|
notebook.set_border_width (12);
|
||||||
|
|
||||||
notebook.set_tab_pos (POS_RIGHT);
|
notebook.set_show_tabs (false);
|
||||||
notebook.show_all ();
|
notebook.show_all ();
|
||||||
|
|
||||||
notebook.set_name ("SettingsNotebook");
|
notebook.set_name ("SettingsNotebook");
|
||||||
|
|
@ -247,6 +284,7 @@ EngineControl::EngineControl ()
|
||||||
sample_rate_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::sample_rate_changed));
|
sample_rate_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::sample_rate_changed));
|
||||||
buffer_size_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::buffer_size_changed));
|
buffer_size_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::buffer_size_changed));
|
||||||
device_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::device_changed));
|
device_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::device_changed));
|
||||||
|
midi_option_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::midi_option_changed));
|
||||||
|
|
||||||
input_latency.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed));
|
input_latency.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed));
|
||||||
output_latency.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed));
|
output_latency.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed));
|
||||||
|
|
@ -298,6 +336,8 @@ EngineControl::build_notebook ()
|
||||||
basic_packer.attach (*label, 0, 1, 0, 1, xopt, (AttachOptions) 0);
|
basic_packer.attach (*label, 0, 1, 0, 1, xopt, (AttachOptions) 0);
|
||||||
basic_packer.attach (backend_combo, 1, 2, 0, 1, xopt, (AttachOptions) 0);
|
basic_packer.attach (backend_combo, 1, 2, 0, 1, xopt, (AttachOptions) 0);
|
||||||
|
|
||||||
|
lm_button.signal_clicked.connect (sigc::bind (sigc::mem_fun (notebook, &Gtk::Notebook::set_current_page), latency_tab));
|
||||||
|
lm_button.set_name ("record enable button");
|
||||||
if (_have_control) {
|
if (_have_control) {
|
||||||
build_full_control_notebook ();
|
build_full_control_notebook ();
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -354,7 +394,7 @@ EngineControl::build_full_control_notebook ()
|
||||||
basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0);
|
basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0);
|
||||||
basic_packer.attach (buffer_size_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0);
|
basic_packer.attach (buffer_size_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0);
|
||||||
buffer_size_duration_label.set_alignment (0.0); /* left-align */
|
buffer_size_duration_label.set_alignment (0.0); /* left-align */
|
||||||
basic_packer.attach (buffer_size_duration_label, 2, 3, row, row+1, xopt, (AttachOptions) 0);
|
basic_packer.attach (buffer_size_duration_label, 2, 3, row, row+1, SHRINK, (AttachOptions) 0);
|
||||||
row++;
|
row++;
|
||||||
|
|
||||||
input_channels.set_name ("InputChannels");
|
input_channels.set_name ("InputChannels");
|
||||||
|
|
@ -389,7 +429,7 @@ EngineControl::build_full_control_notebook ()
|
||||||
basic_packer.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0);
|
basic_packer.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0);
|
||||||
basic_packer.attach (input_latency, 1, 2, row, row+1, xopt, (AttachOptions) 0);
|
basic_packer.attach (input_latency, 1, 2, row, row+1, xopt, (AttachOptions) 0);
|
||||||
label = manage (left_aligned_label (_("samples")));
|
label = manage (left_aligned_label (_("samples")));
|
||||||
basic_packer.attach (*label, 2, 3, row, row+1, xopt, (AttachOptions) 0);
|
basic_packer.attach (*label, 2, 3, row, row+1, SHRINK, (AttachOptions) 0);
|
||||||
++row;
|
++row;
|
||||||
|
|
||||||
output_latency.set_name ("OutputLatency");
|
output_latency.set_name ("OutputLatency");
|
||||||
|
|
@ -402,9 +442,17 @@ EngineControl::build_full_control_notebook ()
|
||||||
basic_packer.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0);
|
basic_packer.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0);
|
||||||
basic_packer.attach (output_latency, 1, 2, row, row+1, xopt, (AttachOptions) 0);
|
basic_packer.attach (output_latency, 1, 2, row, row+1, xopt, (AttachOptions) 0);
|
||||||
label = manage (left_aligned_label (_("samples")));
|
label = manage (left_aligned_label (_("samples")));
|
||||||
basic_packer.attach (*label, 2, 3, row, row+1, xopt, (AttachOptions) 0);
|
basic_packer.attach (*label, 2, 3, row, row+1, SHRINK, (AttachOptions) 0);
|
||||||
|
|
||||||
|
/* button spans 2 rows */
|
||||||
|
|
||||||
|
basic_packer.attach (lm_button, 3, 4, row-1, row+1, xopt, xopt);
|
||||||
++row;
|
++row;
|
||||||
|
|
||||||
|
label = manage (left_aligned_label (_("MIDI System")));
|
||||||
|
basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0);
|
||||||
|
basic_packer.attach (midi_option_combo, 1, 2, row, row + 1, SHRINK, (AttachOptions) 0);
|
||||||
|
row++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -449,7 +497,7 @@ EngineControl::build_no_control_notebook ()
|
||||||
|
|
||||||
EngineControl::~EngineControl ()
|
EngineControl::~EngineControl ()
|
||||||
{
|
{
|
||||||
|
ignore_changes = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -502,7 +550,6 @@ EngineControl::setup_midi_tab_for_backend ()
|
||||||
void
|
void
|
||||||
EngineControl::setup_midi_tab_for_jack ()
|
EngineControl::setup_midi_tab_for_jack ()
|
||||||
{
|
{
|
||||||
midi_vbox.pack_start (aj_button, false, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -605,6 +652,21 @@ EngineControl::backend_changed ()
|
||||||
list_devices ();
|
list_devices ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vector<string> midi_options = backend->enumerate_midi_options();
|
||||||
|
|
||||||
|
if (midi_options.size() == 1) {
|
||||||
|
/* only contains the "none" option */
|
||||||
|
midi_option_combo.set_sensitive (false);
|
||||||
|
} else {
|
||||||
|
if (_have_control) {
|
||||||
|
set_popdown_strings (midi_option_combo, midi_options);
|
||||||
|
midi_option_combo.set_active_text (midi_options.front());
|
||||||
|
midi_option_combo.set_sensitive (true);
|
||||||
|
} else {
|
||||||
|
midi_option_combo.set_sensitive (false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
maybe_display_saved_state ();
|
maybe_display_saved_state ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -862,6 +924,14 @@ EngineControl::show_buffer_duration ()
|
||||||
buffer_size_duration_label.set_text (buf);
|
buffer_size_duration_label.set_text (buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
EngineControl::midi_option_changed ()
|
||||||
|
{
|
||||||
|
if (!ignore_changes) {
|
||||||
|
save_state ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
EngineControl::parameter_changed ()
|
EngineControl::parameter_changed ()
|
||||||
{
|
{
|
||||||
|
|
@ -938,6 +1008,7 @@ EngineControl::store_state (State& state)
|
||||||
state.output_latency = get_output_latency ();
|
state.output_latency = get_output_latency ();
|
||||||
state.input_channels = get_input_channels ();
|
state.input_channels = get_input_channels ();
|
||||||
state.output_channels = get_output_channels ();
|
state.output_channels = get_output_channels ();
|
||||||
|
state.midi_option = get_midi_option ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -962,6 +1033,10 @@ EngineControl::maybe_display_saved_state ()
|
||||||
show_buffer_duration ();
|
show_buffer_duration ();
|
||||||
input_latency.set_value (state->input_latency);
|
input_latency.set_value (state->input_latency);
|
||||||
output_latency.set_value (state->output_latency);
|
output_latency.set_value (state->output_latency);
|
||||||
|
|
||||||
|
if (!state->midi_option.empty()) {
|
||||||
|
midi_option_combo.set_active_text (state->midi_option);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -988,6 +1063,7 @@ EngineControl::get_state ()
|
||||||
node->add_property ("input-channels", (*i).input_channels);
|
node->add_property ("input-channels", (*i).input_channels);
|
||||||
node->add_property ("output-channels", (*i).output_channels);
|
node->add_property ("output-channels", (*i).output_channels);
|
||||||
node->add_property ("active", (*i).active ? "yes" : "no");
|
node->add_property ("active", (*i).active ? "yes" : "no");
|
||||||
|
node->add_property ("midi-option", (*i).midi_option);
|
||||||
|
|
||||||
state_nodes->add_child_nocopy (*node);
|
state_nodes->add_child_nocopy (*node);
|
||||||
}
|
}
|
||||||
|
|
@ -1084,6 +1160,11 @@ EngineControl::set_state (const XMLNode& root)
|
||||||
}
|
}
|
||||||
state.active = string_is_affirmative (prop->value ());
|
state.active = string_is_affirmative (prop->value ());
|
||||||
|
|
||||||
|
if ((prop = grandchild->property ("midi-option")) == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
state.midi_option = prop->value ();
|
||||||
|
|
||||||
states.push_back (state);
|
states.push_back (state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1101,6 +1182,7 @@ EngineControl::set_state (const XMLNode& root)
|
||||||
buffer_size_combo.set_active_text (bufsize_as_string ((*i).buffer_size));
|
buffer_size_combo.set_active_text (bufsize_as_string ((*i).buffer_size));
|
||||||
input_latency.set_value ((*i).input_latency);
|
input_latency.set_value ((*i).input_latency);
|
||||||
output_latency.set_value ((*i).output_latency);
|
output_latency.set_value ((*i).output_latency);
|
||||||
|
midi_option_combo.set_active_text ((*i).midi_option);
|
||||||
ignore_changes--;
|
ignore_changes--;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -1131,6 +1213,7 @@ EngineControl::push_state_to_backend (bool start)
|
||||||
bool change_bufsize = false;
|
bool change_bufsize = false;
|
||||||
bool change_latency = false;
|
bool change_latency = false;
|
||||||
bool change_channels = false;
|
bool change_channels = false;
|
||||||
|
bool change_midi = false;
|
||||||
|
|
||||||
uint32_t ochan = get_output_channels ();
|
uint32_t ochan = get_output_channels ();
|
||||||
uint32_t ichan = get_input_channels ();
|
uint32_t ichan = get_input_channels ();
|
||||||
|
|
@ -1159,6 +1242,10 @@ EngineControl::push_state_to_backend (bool start)
|
||||||
change_bufsize = true;
|
change_bufsize = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (get_midi_option() != backend->midi_option()) {
|
||||||
|
change_midi = true;
|
||||||
|
}
|
||||||
|
|
||||||
/* zero-requested channels means "all available" */
|
/* zero-requested channels means "all available" */
|
||||||
|
|
||||||
if (ichan == 0) {
|
if (ichan == 0) {
|
||||||
|
|
@ -1191,6 +1278,7 @@ EngineControl::push_state_to_backend (bool start)
|
||||||
change_bufsize = true;
|
change_bufsize = true;
|
||||||
change_channels = true;
|
change_channels = true;
|
||||||
change_latency = true;
|
change_latency = true;
|
||||||
|
change_midi = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -1241,6 +1329,7 @@ EngineControl::push_state_to_backend (bool start)
|
||||||
|
|
||||||
if (change_driver || change_device || change_channels || change_latency ||
|
if (change_driver || change_device || change_channels || change_latency ||
|
||||||
(change_rate && !backend->can_change_sample_rate_when_running()) ||
|
(change_rate && !backend->can_change_sample_rate_when_running()) ||
|
||||||
|
change_midi ||
|
||||||
(change_bufsize && !backend->can_change_buffer_size_when_running())) {
|
(change_bufsize && !backend->can_change_buffer_size_when_running())) {
|
||||||
restart_required = true;
|
restart_required = true;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -1249,7 +1338,7 @@ EngineControl::push_state_to_backend (bool start)
|
||||||
|
|
||||||
if (was_running) {
|
if (was_running) {
|
||||||
|
|
||||||
if (!change_driver && !change_device && !change_channels && !change_latency) {
|
if (!change_driver && !change_device && !change_channels && !change_latency && !change_midi) {
|
||||||
/* no changes in any parameters that absolutely require a
|
/* no changes in any parameters that absolutely require a
|
||||||
* restart, so check those that might be changeable without a
|
* restart, so check those that might be changeable without a
|
||||||
* restart
|
* restart
|
||||||
|
|
@ -1314,6 +1403,10 @@ EngineControl::push_state_to_backend (bool start)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (change_midi) {
|
||||||
|
backend->set_midi_option (get_midi_option());
|
||||||
|
}
|
||||||
|
|
||||||
if (start || (was_running && restart_required)) {
|
if (start || (was_running && restart_required)) {
|
||||||
if (ARDOUR_UI::instance()->reconnect_to_engine()) {
|
if (ARDOUR_UI::instance()->reconnect_to_engine()) {
|
||||||
return -1;
|
return -1;
|
||||||
|
|
@ -1388,6 +1481,12 @@ EngineControl::get_buffer_size () const
|
||||||
return samples;
|
return samples;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string
|
||||||
|
EngineControl::get_midi_option () const
|
||||||
|
{
|
||||||
|
return midi_option_combo.get_active_text();
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t
|
uint32_t
|
||||||
EngineControl::get_input_channels() const
|
EngineControl::get_input_channels() const
|
||||||
{
|
{
|
||||||
|
|
@ -1480,12 +1579,12 @@ EngineControl::on_switch_page (GtkNotebookPage*, guint page_num)
|
||||||
apply_button->set_sensitive (false);
|
apply_button->set_sensitive (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (page_num == 1) {
|
if (page_num == midi_tab) {
|
||||||
/* MIDI tab */
|
/* MIDI tab */
|
||||||
refresh_midi_display ();
|
refresh_midi_display ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (page_num == 2) {
|
if (page_num == latency_tab) {
|
||||||
/* latency tab */
|
/* latency tab */
|
||||||
|
|
||||||
if (!ARDOUR::AudioEngine::instance()->running()) {
|
if (!ARDOUR::AudioEngine::instance()->running()) {
|
||||||
|
|
@ -1530,7 +1629,7 @@ EngineControl::check_latency_measurement ()
|
||||||
MTDM* mtdm = ARDOUR::AudioEngine::instance()->mtdm ();
|
MTDM* mtdm = ARDOUR::AudioEngine::instance()->mtdm ();
|
||||||
|
|
||||||
if (mtdm->resolve () < 0) {
|
if (mtdm->resolve () < 0) {
|
||||||
lm_results.set_markup (string_compose ("<span foreground=\"red\">%1</span>", _("No signal detected ")));
|
lm_results.set_markup (string_compose (results_markup, _("No signal detected ")));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1543,7 +1642,7 @@ EngineControl::check_latency_measurement ()
|
||||||
ARDOUR::framecnt_t const sample_rate = ARDOUR::AudioEngine::instance()->sample_rate();
|
ARDOUR::framecnt_t const sample_rate = ARDOUR::AudioEngine::instance()->sample_rate();
|
||||||
|
|
||||||
if (sample_rate == 0) {
|
if (sample_rate == 0) {
|
||||||
lm_results.set_text (_("Disconnected from audio engine"));
|
lm_results.set_markup (string_compose (results_markup, _("Disconnected from audio engine")));
|
||||||
ARDOUR::AudioEngine::instance()->stop_latency_detection ();
|
ARDOUR::AudioEngine::instance()->stop_latency_detection ();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -1551,28 +1650,29 @@ EngineControl::check_latency_measurement ()
|
||||||
uint32_t frames_total = mtdm->del();
|
uint32_t frames_total = mtdm->del();
|
||||||
uint32_t extra = frames_total - ARDOUR::AudioEngine::instance()->latency_signal_delay();
|
uint32_t extra = frames_total - ARDOUR::AudioEngine::instance()->latency_signal_delay();
|
||||||
|
|
||||||
snprintf (buf, sizeof (buf), "%u samples %10.3lf ms", extra, extra * 1000.0f/sample_rate);
|
snprintf (buf, sizeof (buf), "%u samples / %.3lf ms", extra, extra * 1000.0f/sample_rate);
|
||||||
|
|
||||||
bool solid = true;
|
bool solid = true;
|
||||||
|
|
||||||
if (mtdm->err () > 0.2) {
|
if (mtdm->err () > 0.2) {
|
||||||
strcat (buf, " ??");
|
strcat (buf, " ");
|
||||||
|
strcat (buf, _("(signal detection error)"));
|
||||||
solid = false;
|
solid = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mtdm->inv ()) {
|
if (mtdm->inv ()) {
|
||||||
strcat (buf, " (Inv)");
|
strcat (buf, " ");
|
||||||
|
strcat (buf, _("(inverted - bad wiring)"));
|
||||||
solid = false;
|
solid = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (solid) {
|
if (solid) {
|
||||||
lm_measure_button.set_active (false);
|
end_latency_detection ();
|
||||||
lm_use_button.set_sensitive (true);
|
lm_use_button.set_sensitive (true);
|
||||||
strcat (buf, " (set)");
|
|
||||||
have_lm_results = true;
|
have_lm_results = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
lm_results.set_text (buf);
|
lm_results.set_markup (string_compose (results_markup, string_compose (_("Detected roundtrip latency: %1"), buf)));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -1582,32 +1682,39 @@ EngineControl::start_latency_detection ()
|
||||||
{
|
{
|
||||||
ARDOUR::AudioEngine::instance()->set_latency_input_port (lm_input_channel_combo.get_active_text());
|
ARDOUR::AudioEngine::instance()->set_latency_input_port (lm_input_channel_combo.get_active_text());
|
||||||
ARDOUR::AudioEngine::instance()->set_latency_output_port (lm_output_channel_combo.get_active_text());
|
ARDOUR::AudioEngine::instance()->set_latency_output_port (lm_output_channel_combo.get_active_text());
|
||||||
ARDOUR::AudioEngine::instance()->start_latency_detection ();
|
|
||||||
lm_results.set_text (_("Detecting ..."));
|
if (ARDOUR::AudioEngine::instance()->start_latency_detection () == 0) {
|
||||||
latency_timeout = Glib::signal_timeout().connect (mem_fun (*this, &EngineControl::check_latency_measurement), 250);
|
lm_results.set_markup (string_compose (results_markup, _("Detecting ...")));
|
||||||
lm_start_stop_label.set_text (_("Cancel measurement"));
|
latency_timeout = Glib::signal_timeout().connect (mem_fun (*this, &EngineControl::check_latency_measurement), 100);
|
||||||
|
lm_measure_button.set_label (_("Cancel"));
|
||||||
have_lm_results = false;
|
have_lm_results = false;
|
||||||
|
lm_use_button.set_sensitive (false);
|
||||||
lm_input_channel_combo.set_sensitive (false);
|
lm_input_channel_combo.set_sensitive (false);
|
||||||
lm_output_channel_combo.set_sensitive (false);
|
lm_output_channel_combo.set_sensitive (false);
|
||||||
|
lm_running = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
EngineControl::end_latency_detection ()
|
EngineControl::end_latency_detection ()
|
||||||
{
|
{
|
||||||
ARDOUR::AudioEngine::instance()->stop_latency_detection ();
|
|
||||||
latency_timeout.disconnect ();
|
latency_timeout.disconnect ();
|
||||||
lm_start_stop_label.set_text (_("Measure latency"));
|
ARDOUR::AudioEngine::instance()->stop_latency_detection ();
|
||||||
|
lm_measure_button.set_label (_("Measure"));
|
||||||
if (!have_lm_results) {
|
if (!have_lm_results) {
|
||||||
lm_results.set_markup ("<i>No measurement results yet</i>");
|
lm_results.set_markup (string_compose (results_markup, _("No measurement results yet")));
|
||||||
|
} else {
|
||||||
|
lm_use_button.set_sensitive (false);
|
||||||
}
|
}
|
||||||
lm_input_channel_combo.set_sensitive (true);
|
lm_input_channel_combo.set_sensitive (true);
|
||||||
lm_output_channel_combo.set_sensitive (true);
|
lm_output_channel_combo.set_sensitive (true);
|
||||||
|
lm_running = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
EngineControl::latency_button_toggled ()
|
EngineControl::latency_button_clicked ()
|
||||||
{
|
{
|
||||||
if (lm_measure_button.get_active ()) {
|
if (!lm_running) {
|
||||||
start_latency_detection ();
|
start_latency_detection ();
|
||||||
} else {
|
} else {
|
||||||
end_latency_detection ();
|
end_latency_detection ();
|
||||||
|
|
@ -1629,6 +1736,10 @@ EngineControl::use_latency_button_clicked ()
|
||||||
|
|
||||||
input_latency_adjustment.set_value (one_way);
|
input_latency_adjustment.set_value (one_way);
|
||||||
output_latency_adjustment.set_value (one_way);
|
output_latency_adjustment.set_value (one_way);
|
||||||
|
|
||||||
|
/* back to settings page */
|
||||||
|
|
||||||
|
notebook.set_current_page (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@
|
||||||
#include "pbd/signals.h"
|
#include "pbd/signals.h"
|
||||||
|
|
||||||
#include "ardour_dialog.h"
|
#include "ardour_dialog.h"
|
||||||
|
#include "ardour_button.h"
|
||||||
|
|
||||||
class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
|
class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
|
||||||
public:
|
public:
|
||||||
|
|
@ -62,6 +63,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
|
||||||
Gtk::ComboBoxText driver_combo;
|
Gtk::ComboBoxText driver_combo;
|
||||||
Gtk::ComboBoxText device_combo;
|
Gtk::ComboBoxText device_combo;
|
||||||
Gtk::ComboBoxText sample_rate_combo;
|
Gtk::ComboBoxText sample_rate_combo;
|
||||||
|
Gtk::ComboBoxText midi_option_combo;
|
||||||
Gtk::ComboBoxText buffer_size_combo;
|
Gtk::ComboBoxText buffer_size_combo;
|
||||||
Gtk::Label buffer_size_duration_label;
|
Gtk::Label buffer_size_duration_label;
|
||||||
Gtk::Adjustment input_latency_adjustment;
|
Gtk::Adjustment input_latency_adjustment;
|
||||||
|
|
@ -84,14 +86,16 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
|
||||||
|
|
||||||
Gtk::ComboBoxText lm_output_channel_combo;
|
Gtk::ComboBoxText lm_output_channel_combo;
|
||||||
Gtk::ComboBoxText lm_input_channel_combo;
|
Gtk::ComboBoxText lm_input_channel_combo;
|
||||||
Gtk::Label lm_start_stop_label;
|
Gtk::Button lm_measure_button;
|
||||||
Gtk::ToggleButton lm_measure_button;
|
|
||||||
Gtk::Button lm_use_button;
|
Gtk::Button lm_use_button;
|
||||||
|
Gtk::Button lm_back_button;
|
||||||
|
ArdourButton lm_button;
|
||||||
Gtk::Label lm_title;
|
Gtk::Label lm_title;
|
||||||
Gtk::Label lm_results;
|
Gtk::Label lm_results;
|
||||||
Gtk::Table lm_table;
|
Gtk::Table lm_table;
|
||||||
Gtk::VBox lm_vbox;
|
Gtk::VBox lm_vbox;
|
||||||
bool have_lm_results;
|
bool have_lm_results;
|
||||||
|
bool lm_running;
|
||||||
|
|
||||||
Gtk::Button* cancel_button;
|
Gtk::Button* cancel_button;
|
||||||
Gtk::Button* ok_button;
|
Gtk::Button* ok_button;
|
||||||
|
|
@ -117,6 +121,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
|
||||||
void sample_rate_changed ();
|
void sample_rate_changed ();
|
||||||
void buffer_size_changed ();
|
void buffer_size_changed ();
|
||||||
void parameter_changed ();
|
void parameter_changed ();
|
||||||
|
void midi_option_changed ();
|
||||||
|
|
||||||
void setup_midi_tab_for_backend ();
|
void setup_midi_tab_for_backend ();
|
||||||
void setup_midi_tab_for_jack ();
|
void setup_midi_tab_for_jack ();
|
||||||
|
|
@ -133,6 +138,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
|
||||||
std::string get_device_name() const;
|
std::string get_device_name() const;
|
||||||
std::string get_driver() const;
|
std::string get_driver() const;
|
||||||
std::string get_backend() const;
|
std::string get_backend() const;
|
||||||
|
std::string get_midi_option () const;
|
||||||
|
|
||||||
void device_changed ();
|
void device_changed ();
|
||||||
void list_devices ();
|
void list_devices ();
|
||||||
|
|
@ -149,6 +155,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
|
||||||
uint32_t input_channels;
|
uint32_t input_channels;
|
||||||
uint32_t output_channels;
|
uint32_t output_channels;
|
||||||
bool active;
|
bool active;
|
||||||
|
std::string midi_option;
|
||||||
|
|
||||||
State()
|
State()
|
||||||
: input_latency (0)
|
: input_latency (0)
|
||||||
|
|
@ -188,7 +195,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
|
||||||
void update_sensitivity ();
|
void update_sensitivity ();
|
||||||
|
|
||||||
/* latency measurement */
|
/* latency measurement */
|
||||||
void latency_button_toggled ();
|
void latency_button_clicked ();
|
||||||
bool check_latency_measurement ();
|
bool check_latency_measurement ();
|
||||||
sigc::connection latency_timeout;
|
sigc::connection latency_timeout;
|
||||||
void enable_latency_tab ();
|
void enable_latency_tab ();
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@ using namespace PBD;
|
||||||
using namespace ARDOUR;
|
using namespace ARDOUR;
|
||||||
using namespace VideoUtils;
|
using namespace VideoUtils;
|
||||||
|
|
||||||
ExportVideoDialog::ExportVideoDialog (Session* s, TimeSelection &tme)
|
ExportVideoDialog::ExportVideoDialog (Session* s, TimeSelection &tme, bool range)
|
||||||
: ArdourDialog (_("Export Video File "))
|
: ArdourDialog (_("Export Video File "))
|
||||||
, export_range (tme)
|
, export_range (tme)
|
||||||
, outfn_path_label (_("File:"), Gtk::ALIGN_LEFT)
|
, outfn_path_label (_("File:"), Gtk::ALIGN_LEFT)
|
||||||
|
|
@ -154,7 +154,11 @@ ExportVideoDialog::ExportVideoDialog (Session* s, TimeSelection &tme)
|
||||||
if (!export_range.empty()) {
|
if (!export_range.empty()) {
|
||||||
insnd_combo.append_text (_("Selected range")); // TODO show export_range.start() -> export_range.end_frame()
|
insnd_combo.append_text (_("Selected range")); // TODO show export_range.start() -> export_range.end_frame()
|
||||||
}
|
}
|
||||||
|
if (range) {
|
||||||
|
insnd_combo.set_active(2);
|
||||||
|
} else {
|
||||||
insnd_combo.set_active(0);
|
insnd_combo.set_active(0);
|
||||||
|
}
|
||||||
|
|
||||||
outfn_path_entry.set_width_chars(38);
|
outfn_path_entry.set_width_chars(38);
|
||||||
outfn_path_entry.set_text (_session->session_directory().export_path() + G_DIR_SEPARATOR +"export.avi");
|
outfn_path_entry.set_text (_session->session_directory().export_path() + G_DIR_SEPARATOR +"export.avi");
|
||||||
|
|
@ -512,9 +516,8 @@ ExportVideoDialog::launch_export ()
|
||||||
end += av_offset;
|
end += av_offset;
|
||||||
}
|
}
|
||||||
else if (insnd_combo.get_active_row_number() == 2) {
|
else if (insnd_combo.get_active_row_number() == 2) {
|
||||||
// TODO quantize to video-frame ?!
|
start = ARDOUR_UI::instance()->video_timeline->quantify_frames_to_apv(export_range.start());
|
||||||
start = export_range.start();
|
end = ARDOUR_UI::instance()->video_timeline->quantify_frames_to_apv(export_range.end_frame());
|
||||||
end = export_range.end_frame();
|
|
||||||
}
|
}
|
||||||
if (end <= 0) {
|
if (end <= 0) {
|
||||||
start = _session->current_start_frame();
|
start = _session->current_start_frame();
|
||||||
|
|
@ -524,6 +527,15 @@ ExportVideoDialog::launch_export ()
|
||||||
printf("audio export-range %lld -> %lld\n", start, end);
|
printf("audio export-range %lld -> %lld\n", start, end);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
const frameoffset_t vstart = ARDOUR_UI::instance()->video_timeline->get_offset();
|
||||||
|
const frameoffset_t vend = vstart + ARDOUR_UI::instance()->video_timeline->get_duration();
|
||||||
|
|
||||||
|
if ( (start >= end) || (end < vstart) || (start > vend)) {
|
||||||
|
warning << _("Export Video: export-range does not include video.") << endmsg;
|
||||||
|
Gtk::Dialog::response(RESPONSE_CANCEL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
tsp->set_range (start, end);
|
tsp->set_range (start, end);
|
||||||
tsp->set_name ("mysession");
|
tsp->set_name ("mysession");
|
||||||
tsp->set_range_id ("session");
|
tsp->set_range_id ("session");
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@
|
||||||
class ExportVideoDialog : public ArdourDialog , public PBD::ScopedConnectionList
|
class ExportVideoDialog : public ArdourDialog , public PBD::ScopedConnectionList
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ExportVideoDialog (ARDOUR::Session*, TimeSelection &tme);
|
ExportVideoDialog (ARDOUR::Session*, TimeSelection &tme, bool range = false);
|
||||||
~ExportVideoDialog ();
|
~ExportVideoDialog ();
|
||||||
|
|
||||||
std::string get_exported_filename () { return outfn_path_entry.get_text(); }
|
std::string get_exported_filename () { return outfn_path_entry.get_text(); }
|
||||||
|
|
|
||||||
|
|
@ -159,6 +159,7 @@ PluginUIWindow::PluginUIWindow (
|
||||||
|
|
||||||
PluginUIWindow::~PluginUIWindow ()
|
PluginUIWindow::~PluginUIWindow ()
|
||||||
{
|
{
|
||||||
|
cerr << "PluginWindow deleted for " << this << endl;
|
||||||
delete _pluginui;
|
delete _pluginui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -403,8 +404,6 @@ PluginUIWindow::plugin_going_away ()
|
||||||
}
|
}
|
||||||
|
|
||||||
death_connection.disconnect ();
|
death_connection.disconnect ();
|
||||||
|
|
||||||
delete_when_idle (this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PlugUIBase::PlugUIBase (boost::shared_ptr<PluginInsert> pi)
|
PlugUIBase::PlugUIBase (boost::shared_ptr<PluginInsert> pi)
|
||||||
|
|
|
||||||
|
|
@ -1392,7 +1392,7 @@ ProcessorBox::redisplay_processors ()
|
||||||
|
|
||||||
_route->foreach_processor (sigc::mem_fun (*this, &ProcessorBox::add_processor_to_display));
|
_route->foreach_processor (sigc::mem_fun (*this, &ProcessorBox::add_processor_to_display));
|
||||||
|
|
||||||
for (list<ProcessorWindowProxy*>::iterator i = _processor_window_info.begin(); i != _processor_window_info.end(); ++i) {
|
for (ProcessorWindowProxies::iterator i = _processor_window_info.begin(); i != _processor_window_info.end(); ++i) {
|
||||||
(*i)->marked = false;
|
(*i)->marked = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1400,15 +1400,42 @@ ProcessorBox::redisplay_processors ()
|
||||||
|
|
||||||
/* trim dead wood from the processor window proxy list */
|
/* trim dead wood from the processor window proxy list */
|
||||||
|
|
||||||
list<ProcessorWindowProxy*>::iterator i = _processor_window_info.begin();
|
ProcessorWindowProxies::iterator i = _processor_window_info.begin();
|
||||||
while (i != _processor_window_info.end()) {
|
while (i != _processor_window_info.end()) {
|
||||||
list<ProcessorWindowProxy*>::iterator j = i;
|
ProcessorWindowProxies::iterator j = i;
|
||||||
++j;
|
++j;
|
||||||
|
|
||||||
if (!(*i)->marked) {
|
if (!(*i)->valid()) {
|
||||||
|
|
||||||
WM::Manager::instance().remove (*i);
|
WM::Manager::instance().remove (*i);
|
||||||
delete *i;
|
delete *i;
|
||||||
_processor_window_info.erase (i);
|
_processor_window_info.erase (i);
|
||||||
|
|
||||||
|
} else if (!(*i)->marked) {
|
||||||
|
|
||||||
|
/* this processor is no longer part of this processor
|
||||||
|
* box.
|
||||||
|
*
|
||||||
|
* that could be because it was deleted or it could be
|
||||||
|
* because the route being displayed in the parent
|
||||||
|
* strip changed.
|
||||||
|
*
|
||||||
|
* The latter only happens with the editor mixer strip.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (is_editor_mixer_strip()) {
|
||||||
|
|
||||||
|
/* editor mixer strip .. DO NOTHING
|
||||||
|
*
|
||||||
|
* note: the processor window stays visible if
|
||||||
|
* it is already visible
|
||||||
|
*/
|
||||||
|
} else {
|
||||||
|
(*i)->hide ();
|
||||||
|
WM::Manager::instance().remove (*i);
|
||||||
|
delete *i;
|
||||||
|
_processor_window_info.erase (i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
i = j;
|
i = j;
|
||||||
|
|
@ -1428,7 +1455,7 @@ ProcessorBox::maybe_add_processor_to_ui_list (boost::weak_ptr<Processor> w)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
list<ProcessorWindowProxy*>::iterator i = _processor_window_info.begin ();
|
ProcessorWindowProxies::iterator i = _processor_window_info.begin ();
|
||||||
while (i != _processor_window_info.end()) {
|
while (i != _processor_window_info.end()) {
|
||||||
|
|
||||||
boost::shared_ptr<Processor> t = (*i)->processor().lock ();
|
boost::shared_ptr<Processor> t = (*i)->processor().lock ();
|
||||||
|
|
@ -2077,6 +2104,18 @@ ProcessorBox::get_editor_window (boost::shared_ptr<Processor> processor, bool us
|
||||||
boost::shared_ptr<PortInsert> port_insert;
|
boost::shared_ptr<PortInsert> port_insert;
|
||||||
Window* gidget = 0;
|
Window* gidget = 0;
|
||||||
|
|
||||||
|
/* This method may or may not return a Window, but if it does not it
|
||||||
|
* will modify the parent mixer strip appearance layout to allow
|
||||||
|
* "editing" the @param processor that was passed in.
|
||||||
|
*
|
||||||
|
* So for example, if the processor is an Amp (gain), the parent strip
|
||||||
|
* will be forced back into a model where the fader controls the main gain.
|
||||||
|
* If the processor is a send, then we map the send controls onto the
|
||||||
|
* strip.
|
||||||
|
*
|
||||||
|
* Plugins and others will return a window for control.
|
||||||
|
*/
|
||||||
|
|
||||||
if (boost::dynamic_pointer_cast<AudioTrack>(_route) != 0) {
|
if (boost::dynamic_pointer_cast<AudioTrack>(_route) != 0) {
|
||||||
|
|
||||||
if (boost::dynamic_pointer_cast<AudioTrack> (_route)->freeze_state() == AudioTrack::Frozen) {
|
if (boost::dynamic_pointer_cast<AudioTrack> (_route)->freeze_state() == AudioTrack::Frozen) {
|
||||||
|
|
@ -2554,7 +2593,13 @@ ProcessorBox::generate_processor_title (boost::shared_ptr<PluginInsert> pi)
|
||||||
maker += " ...";
|
maker += " ...";
|
||||||
}
|
}
|
||||||
|
|
||||||
return string_compose(_("%1: %2 (by %3)"), _route->name(), pi->name(), maker);
|
SessionObject* owner = pi->owner();
|
||||||
|
|
||||||
|
if (owner) {
|
||||||
|
return string_compose(_("%1: %2 (by %3)"), owner->name(), pi->name(), maker);
|
||||||
|
} else {
|
||||||
|
return string_compose(_("%2 (by %3)"), pi->name(), maker);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @param p Processor.
|
/** @param p Processor.
|
||||||
|
|
@ -2667,6 +2712,12 @@ ProcessorBox::update_gui_object_state (ProcessorEntry* entry)
|
||||||
entry->add_control_state (proc);
|
entry->add_control_state (proc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
ProcessorBox::is_editor_mixer_strip() const
|
||||||
|
{
|
||||||
|
return _parent_strip && !_parent_strip->mixer_owned();
|
||||||
|
}
|
||||||
|
|
||||||
ProcessorWindowProxy::ProcessorWindowProxy (string const & name, ProcessorBox* box, boost::weak_ptr<Processor> processor)
|
ProcessorWindowProxy::ProcessorWindowProxy (string const & name, ProcessorBox* box, boost::weak_ptr<Processor> processor)
|
||||||
: WM::ProxyBase (name, string())
|
: WM::ProxyBase (name, string())
|
||||||
, marked (false)
|
, marked (false)
|
||||||
|
|
@ -2674,8 +2725,34 @@ ProcessorWindowProxy::ProcessorWindowProxy (string const & name, ProcessorBox* b
|
||||||
, _processor (processor)
|
, _processor (processor)
|
||||||
, is_custom (false)
|
, is_custom (false)
|
||||||
, want_custom (false)
|
, want_custom (false)
|
||||||
|
, _valid (true)
|
||||||
{
|
{
|
||||||
|
boost::shared_ptr<Processor> p = _processor.lock ();
|
||||||
|
if (!p) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
p->DropReferences.connect (going_away_connection, MISSING_INVALIDATOR, boost::bind (&ProcessorWindowProxy::processor_going_away, this), gui_context());
|
||||||
|
}
|
||||||
|
|
||||||
|
ProcessorWindowProxy::~ProcessorWindowProxy()
|
||||||
|
{
|
||||||
|
/* processor window proxies do not own the windows they create with
|
||||||
|
* ::get(), so set _window to null before the normal WindowProxy method
|
||||||
|
* deletes it.
|
||||||
|
*/
|
||||||
|
_window = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ProcessorWindowProxy::processor_going_away ()
|
||||||
|
{
|
||||||
|
delete _window;
|
||||||
|
_window = 0;
|
||||||
|
_valid = false;
|
||||||
|
/* should be no real reason to do this, since the object that would
|
||||||
|
send DropReferences is about to be deleted, but lets do it anyway.
|
||||||
|
*/
|
||||||
|
going_away_connection.disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
ARDOUR::SessionHandlePtr*
|
ARDOUR::SessionHandlePtr*
|
||||||
|
|
@ -2685,6 +2762,12 @@ ProcessorWindowProxy::session_handle()
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
ProcessorWindowProxy::valid() const
|
||||||
|
{
|
||||||
|
return _valid;
|
||||||
|
}
|
||||||
|
|
||||||
XMLNode&
|
XMLNode&
|
||||||
ProcessorWindowProxy::get_state () const
|
ProcessorWindowProxy::get_state () const
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,7 @@ class ProcessorWindowProxy : public WM::ProxyBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ProcessorWindowProxy (std::string const &, ProcessorBox *, boost::weak_ptr<ARDOUR::Processor>);
|
ProcessorWindowProxy (std::string const &, ProcessorBox *, boost::weak_ptr<ARDOUR::Processor>);
|
||||||
|
~ProcessorWindowProxy();
|
||||||
|
|
||||||
Gtk::Window* get (bool create = false);
|
Gtk::Window* get (bool create = false);
|
||||||
|
|
||||||
|
|
@ -91,6 +92,7 @@ class ProcessorWindowProxy : public WM::ProxyBase
|
||||||
void set_custom_ui_mode(bool use_custom) { want_custom = use_custom; }
|
void set_custom_ui_mode(bool use_custom) { want_custom = use_custom; }
|
||||||
|
|
||||||
bool marked;
|
bool marked;
|
||||||
|
bool valid () const;
|
||||||
|
|
||||||
void set_state (const XMLNode&);
|
void set_state (const XMLNode&);
|
||||||
XMLNode& get_state () const;
|
XMLNode& get_state () const;
|
||||||
|
|
@ -100,6 +102,10 @@ class ProcessorWindowProxy : public WM::ProxyBase
|
||||||
boost::weak_ptr<ARDOUR::Processor> _processor;
|
boost::weak_ptr<ARDOUR::Processor> _processor;
|
||||||
bool is_custom;
|
bool is_custom;
|
||||||
bool want_custom;
|
bool want_custom;
|
||||||
|
bool _valid;
|
||||||
|
|
||||||
|
void processor_going_away ();
|
||||||
|
PBD::ScopedConnection going_away_connection;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ProcessorEntry : public Gtkmm2ext::DnDVBoxChild, public sigc::trackable
|
class ProcessorEntry : public Gtkmm2ext::DnDVBoxChild, public sigc::trackable
|
||||||
|
|
@ -303,6 +309,8 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
|
||||||
|
|
||||||
void route_going_away ();
|
void route_going_away ();
|
||||||
|
|
||||||
|
bool is_editor_mixer_strip() const;
|
||||||
|
|
||||||
Gtkmm2ext::DnDVBox<ProcessorEntry> processor_display;
|
Gtkmm2ext::DnDVBox<ProcessorEntry> processor_display;
|
||||||
Gtk::ScrolledWindow processor_scroller;
|
Gtk::ScrolledWindow processor_scroller;
|
||||||
|
|
||||||
|
|
@ -404,7 +412,9 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
|
||||||
void route_property_changed (const PBD::PropertyChange&);
|
void route_property_changed (const PBD::PropertyChange&);
|
||||||
std::string generate_processor_title (boost::shared_ptr<ARDOUR::PluginInsert> pi);
|
std::string generate_processor_title (boost::shared_ptr<ARDOUR::PluginInsert> pi);
|
||||||
|
|
||||||
std::list<ProcessorWindowProxy*> _processor_window_info;
|
typedef std::list<ProcessorWindowProxy*> ProcessorWindowProxies;
|
||||||
|
ProcessorWindowProxies _processor_window_info;
|
||||||
|
|
||||||
ProcessorWindowProxy* find_window_proxy (boost::shared_ptr<ARDOUR::Processor>) const;
|
ProcessorWindowProxy* find_window_proxy (boost::shared_ptr<ARDOUR::Processor>) const;
|
||||||
|
|
||||||
void set_processor_ui (boost::shared_ptr<ARDOUR::Processor>, Gtk::Window *);
|
void set_processor_ui (boost::shared_ptr<ARDOUR::Processor>, Gtk::Window *);
|
||||||
|
|
|
||||||
|
|
@ -296,7 +296,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
|
||||||
virtual int get_videotl_bar_height () const = 0;
|
virtual int get_videotl_bar_height () const = 0;
|
||||||
virtual void set_video_timeline_height (const int h) = 0;
|
virtual void set_video_timeline_height (const int h) = 0;
|
||||||
virtual void embed_audio_from_video (std::string, framepos_t n = 0) = 0;
|
virtual void embed_audio_from_video (std::string, framepos_t n = 0) = 0;
|
||||||
virtual void export_video () = 0;
|
virtual void export_video (bool range = false) = 0;
|
||||||
|
|
||||||
virtual RouteTimeAxisView* get_route_view_by_route_id (const PBD::ID& id) const = 0;
|
virtual RouteTimeAxisView* get_route_view_by_route_id (const PBD::ID& id) const = 0;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -349,7 +349,7 @@ ProxyBase::setup ()
|
||||||
assert (_window);
|
assert (_window);
|
||||||
|
|
||||||
vistracker = new Gtkmm2ext::VisibilityTracker (*_window);
|
vistracker = new Gtkmm2ext::VisibilityTracker (*_window);
|
||||||
_window->signal_delete_event().connect (sigc::mem_fun (*this, &ProxyBase::handle_win_event));
|
_window->signal_delete_event().connect (sigc::mem_fun (*this, &ProxyBase::delete_event_handler));
|
||||||
|
|
||||||
if (_width != -1 || _height != -1 || _x_off != -1 || _y_off != -1) {
|
if (_width != -1 || _height != -1 || _x_off != -1 || _y_off != -1) {
|
||||||
/* cancel any mouse-based positioning */
|
/* cancel any mouse-based positioning */
|
||||||
|
|
@ -369,8 +369,9 @@ ProxyBase::setup ()
|
||||||
void
|
void
|
||||||
ProxyBase::show ()
|
ProxyBase::show ()
|
||||||
{
|
{
|
||||||
Gtk::Window* win = get (true);
|
get (true);
|
||||||
win->show ();
|
assert (_window);
|
||||||
|
_window->show ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -384,17 +385,19 @@ ProxyBase::maybe_show ()
|
||||||
void
|
void
|
||||||
ProxyBase::show_all ()
|
ProxyBase::show_all ()
|
||||||
{
|
{
|
||||||
Gtk::Window* win = get (true);
|
get (true);
|
||||||
win->show_all ();
|
assert (_window);
|
||||||
|
_window->show_all ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ProxyBase::present ()
|
ProxyBase::present ()
|
||||||
{
|
{
|
||||||
Gtk::Window* win = get (true);
|
get (true);
|
||||||
win->show_all ();
|
assert (_window);
|
||||||
win->present ();
|
|
||||||
|
_window->show_all ();
|
||||||
|
_window->present ();
|
||||||
|
|
||||||
/* turn off any mouse-based positioning */
|
/* turn off any mouse-based positioning */
|
||||||
_window->set_position (Gtk::WIN_POS_NONE);
|
_window->set_position (Gtk::WIN_POS_NONE);
|
||||||
|
|
@ -403,15 +406,14 @@ ProxyBase::present ()
|
||||||
void
|
void
|
||||||
ProxyBase::hide ()
|
ProxyBase::hide ()
|
||||||
{
|
{
|
||||||
Gtk::Window* win = get (false);
|
if (_window) {
|
||||||
if (win) {
|
|
||||||
save_pos_and_size();
|
save_pos_and_size();
|
||||||
win->hide ();
|
_window->hide ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ProxyBase::handle_win_event (GdkEventAny* /*ev*/)
|
ProxyBase::delete_event_handler (GdkEventAny* /*ev*/)
|
||||||
{
|
{
|
||||||
hide();
|
hide();
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -420,10 +422,9 @@ ProxyBase::handle_win_event (GdkEventAny* /*ev*/)
|
||||||
void
|
void
|
||||||
ProxyBase::save_pos_and_size ()
|
ProxyBase::save_pos_and_size ()
|
||||||
{
|
{
|
||||||
Gtk::Window* win = get (false);
|
if (_window) {
|
||||||
if (win) {
|
_window->get_position (_x_off, _y_off);
|
||||||
win->get_position (_x_off, _y_off);
|
_window->get_size (_width, _height);
|
||||||
win->get_size (_width, _height);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*-----------------------*/
|
/*-----------------------*/
|
||||||
|
|
|
||||||
|
|
@ -122,7 +122,7 @@ class ProxyBase : public ARDOUR::SessionHandlePtr, public sigc::trackable {
|
||||||
Gtkmm2ext::VisibilityTracker* vistracker;
|
Gtkmm2ext::VisibilityTracker* vistracker;
|
||||||
|
|
||||||
void save_pos_and_size ();
|
void save_pos_and_size ();
|
||||||
bool handle_win_event (GdkEventAny *ev);
|
bool delete_event_handler (GdkEventAny *ev);
|
||||||
|
|
||||||
void setup ();
|
void setup ();
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -640,7 +640,7 @@ def build(bld):
|
||||||
# Menus
|
# Menus
|
||||||
menus_argv = []
|
menus_argv = []
|
||||||
if bld.is_defined('GTKOSX'):
|
if bld.is_defined('GTKOSX'):
|
||||||
menus_argv = [ '-E', '-P', '-DGTKOSX', '-DNOVIDEOTIMELINE' ]
|
menus_argv = [ '-E', '-P', '-DGTKOSX' ]
|
||||||
else:
|
else:
|
||||||
menus_argv = [ '-E', '-P' ]
|
menus_argv = [ '-E', '-P' ]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -239,7 +239,38 @@ class AudioBackend : public PortEngine {
|
||||||
* app is undefined or cannot be launched.
|
* app is undefined or cannot be launched.
|
||||||
*/
|
*/
|
||||||
virtual void launch_control_app () = 0;
|
virtual void launch_control_app () = 0;
|
||||||
/* Basic state control */
|
|
||||||
|
/* @return a vector of strings that describe the available
|
||||||
|
* MIDI options.
|
||||||
|
*
|
||||||
|
* These can be presented to the user to decide which
|
||||||
|
* MIDI drivers, options etc. can be used. The returned strings
|
||||||
|
* should be thought of as the key to a map of possible
|
||||||
|
* approaches to handling MIDI within the backend. Ensure that
|
||||||
|
* the strings will make sense to the user.
|
||||||
|
*/
|
||||||
|
virtual std::vector<std::string> enumerate_midi_options () const = 0;
|
||||||
|
|
||||||
|
/* Request the use of the MIDI option named @param option, which
|
||||||
|
* should be one of the strings returned by enumerate_midi_options()
|
||||||
|
*
|
||||||
|
* @return zero if successful, non-zero otherwise
|
||||||
|
*/
|
||||||
|
virtual int set_midi_option (const std::string& option) = 0;
|
||||||
|
|
||||||
|
virtual std::string midi_option () const = 0;
|
||||||
|
|
||||||
|
/* State Control */
|
||||||
|
|
||||||
|
/* non-virtual method to avoid possible overrides of default
|
||||||
|
* parameters. See Scott Meyers or other books on C++ to
|
||||||
|
* understand this pattern, or possibly just this:
|
||||||
|
*
|
||||||
|
* http://stackoverflow.com/questions/12139786/good-pratice-default-arguments-for-pure-virtual-method
|
||||||
|
*/
|
||||||
|
int start (bool for_latency_measurement=false) {
|
||||||
|
return _start (for_latency_measurement);
|
||||||
|
}
|
||||||
|
|
||||||
/** Start using the device named in the most recent call
|
/** Start using the device named in the most recent call
|
||||||
* to set_device(), with the parameters set by various
|
* to set_device(), with the parameters set by various
|
||||||
|
|
@ -250,9 +281,14 @@ class AudioBackend : public PortEngine {
|
||||||
* the AudioEngine referenced by @param engine. These calls will
|
* the AudioEngine referenced by @param engine. These calls will
|
||||||
* occur in a thread created by and/or under the control of the backend.
|
* occur in a thread created by and/or under the control of the backend.
|
||||||
*
|
*
|
||||||
|
* @param for_latency_measurement if true, the device is being started
|
||||||
|
* to carry out latency measurements and the backend should this
|
||||||
|
* take care to return latency numbers that do not reflect
|
||||||
|
* any existing systemic latency settings.
|
||||||
|
*
|
||||||
* Return zero if successful, negative values otherwise.
|
* Return zero if successful, negative values otherwise.
|
||||||
*/
|
*/
|
||||||
virtual int start () = 0;
|
virtual int _start (bool for_latency_measurement) = 0;
|
||||||
|
|
||||||
/** Stop using the device currently in use.
|
/** Stop using the device currently in use.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,7 @@ public:
|
||||||
int discover_backends();
|
int discover_backends();
|
||||||
std::vector<const AudioBackendInfo*> available_backends() const;
|
std::vector<const AudioBackendInfo*> available_backends() const;
|
||||||
std::string current_backend_name () const;
|
std::string current_backend_name () const;
|
||||||
|
boost::shared_ptr<AudioBackend> set_default_backend ();
|
||||||
boost::shared_ptr<AudioBackend> set_backend (const std::string&, const std::string& arg1, const std::string& arg2);
|
boost::shared_ptr<AudioBackend> set_backend (const std::string&, const std::string& arg1, const std::string& arg2);
|
||||||
boost::shared_ptr<AudioBackend> current_backend() const { return _backend; }
|
boost::shared_ptr<AudioBackend> current_backend() const { return _backend; }
|
||||||
bool setup_required () const;
|
bool setup_required () const;
|
||||||
|
|
@ -82,8 +83,8 @@ public:
|
||||||
* just forward to a backend implementation.
|
* just forward to a backend implementation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int start ();
|
int start (bool for_latency_measurement=false);
|
||||||
int stop ();
|
int stop (bool for_latency_measurement=false);
|
||||||
int pause ();
|
int pause ();
|
||||||
int freewheel (bool start_stop);
|
int freewheel (bool start_stop);
|
||||||
float get_cpu_load() const ;
|
float get_cpu_load() const ;
|
||||||
|
|
@ -193,7 +194,7 @@ public:
|
||||||
|
|
||||||
MTDM* mtdm();
|
MTDM* mtdm();
|
||||||
int prepare_for_latency_measurement ();
|
int prepare_for_latency_measurement ();
|
||||||
void start_latency_detection ();
|
int start_latency_detection ();
|
||||||
void stop_latency_detection ();
|
void stop_latency_detection ();
|
||||||
void set_latency_input_port (const std::string&);
|
void set_latency_input_port (const std::string&);
|
||||||
void set_latency_output_port (const std::string&);
|
void set_latency_output_port (const std::string&);
|
||||||
|
|
@ -228,6 +229,7 @@ public:
|
||||||
std::string _latency_input_name;
|
std::string _latency_input_name;
|
||||||
std::string _latency_output_name;
|
std::string _latency_output_name;
|
||||||
framecnt_t _latency_signal_latency;
|
framecnt_t _latency_signal_latency;
|
||||||
|
bool _stopped_for_latency;
|
||||||
bool _started_for_latency;
|
bool _started_for_latency;
|
||||||
bool _in_destructor;
|
bool _in_destructor;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -113,6 +113,9 @@ class Processor : public SessionObject, public Automatable, public Latent
|
||||||
void set_ui (void*);
|
void set_ui (void*);
|
||||||
void* get_ui () const { return _ui_pointer; }
|
void* get_ui () const { return _ui_pointer; }
|
||||||
|
|
||||||
|
void set_owner (SessionObject*);
|
||||||
|
SessionObject* owner() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual int set_state_2X (const XMLNode&, int version);
|
virtual int set_state_2X (const XMLNode&, int version);
|
||||||
|
|
||||||
|
|
@ -125,6 +128,7 @@ protected:
|
||||||
bool _display_to_user;
|
bool _display_to_user;
|
||||||
bool _pre_fader; ///< true if this processor is currently placed before the Amp, otherwise false
|
bool _pre_fader; ///< true if this processor is currently placed before the Amp, otherwise false
|
||||||
void* _ui_pointer;
|
void* _ui_pointer;
|
||||||
|
SessionObject* _owner;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ARDOUR
|
} // namespace ARDOUR
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ AudioEngine::AudioEngine ()
|
||||||
, _latency_output_port (0)
|
, _latency_output_port (0)
|
||||||
, _latency_flush_frames (0)
|
, _latency_flush_frames (0)
|
||||||
, _latency_signal_latency (0)
|
, _latency_signal_latency (0)
|
||||||
, _started_for_latency (false)
|
, _stopped_for_latency (false)
|
||||||
, _in_destructor (false)
|
, _in_destructor (false)
|
||||||
{
|
{
|
||||||
g_atomic_int_set (&m_meter_exit, 0);
|
g_atomic_int_set (&m_meter_exit, 0);
|
||||||
|
|
@ -564,6 +564,16 @@ AudioEngine::drop_backend ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boost::shared_ptr<AudioBackend>
|
||||||
|
AudioEngine::set_default_backend ()
|
||||||
|
{
|
||||||
|
if (_backends.empty()) {
|
||||||
|
return boost::shared_ptr<AudioBackend>();
|
||||||
|
}
|
||||||
|
|
||||||
|
return set_backend (_backends.begin()->first, "", "");
|
||||||
|
}
|
||||||
|
|
||||||
boost::shared_ptr<AudioBackend>
|
boost::shared_ptr<AudioBackend>
|
||||||
AudioEngine::set_backend (const std::string& name, const std::string& arg1, const std::string& arg2)
|
AudioEngine::set_backend (const std::string& name, const std::string& arg1, const std::string& arg2)
|
||||||
{
|
{
|
||||||
|
|
@ -593,7 +603,7 @@ AudioEngine::set_backend (const std::string& name, const std::string& arg1, cons
|
||||||
/* BACKEND PROXY WRAPPERS */
|
/* BACKEND PROXY WRAPPERS */
|
||||||
|
|
||||||
int
|
int
|
||||||
AudioEngine::start ()
|
AudioEngine::start (bool for_latency)
|
||||||
{
|
{
|
||||||
if (!_backend) {
|
if (!_backend) {
|
||||||
return -1;
|
return -1;
|
||||||
|
|
@ -606,7 +616,7 @@ AudioEngine::start ()
|
||||||
_processed_frames = 0;
|
_processed_frames = 0;
|
||||||
last_monitor_check = 0;
|
last_monitor_check = 0;
|
||||||
|
|
||||||
if (_backend->start()) {
|
if (_backend->start (for_latency)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -622,7 +632,7 @@ AudioEngine::start ()
|
||||||
|
|
||||||
start_metering_thread ();
|
start_metering_thread ();
|
||||||
|
|
||||||
if (!_started_for_latency) {
|
if (!for_latency) {
|
||||||
Running(); /* EMIT SIGNAL */
|
Running(); /* EMIT SIGNAL */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -630,7 +640,7 @@ AudioEngine::start ()
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
AudioEngine::stop ()
|
AudioEngine::stop (bool for_latency)
|
||||||
{
|
{
|
||||||
if (!_backend) {
|
if (!_backend) {
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -651,7 +661,10 @@ AudioEngine::stop ()
|
||||||
stop_metering_thread ();
|
stop_metering_thread ();
|
||||||
|
|
||||||
Port::PortDrop ();
|
Port::PortDrop ();
|
||||||
|
|
||||||
|
if (!for_latency) {
|
||||||
Stopped (); /* EMIT SIGNAL */
|
Stopped (); /* EMIT SIGNAL */
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -1015,8 +1028,11 @@ AudioEngine::halted_callback (const char* why)
|
||||||
_running = false;
|
_running = false;
|
||||||
|
|
||||||
Port::PortDrop (); /* EMIT SIGNAL */
|
Port::PortDrop (); /* EMIT SIGNAL */
|
||||||
|
|
||||||
|
if (!_started_for_latency) {
|
||||||
Halted (why); /* EMIT SIGNAL */
|
Halted (why); /* EMIT SIGNAL */
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
AudioEngine::setup_required () const
|
AudioEngine::setup_required () const
|
||||||
|
|
@ -1044,23 +1060,26 @@ AudioEngine::mtdm()
|
||||||
int
|
int
|
||||||
AudioEngine::prepare_for_latency_measurement ()
|
AudioEngine::prepare_for_latency_measurement ()
|
||||||
{
|
{
|
||||||
if (!running()) {
|
if (running()) {
|
||||||
_started_for_latency = true;
|
_stopped_for_latency = true;
|
||||||
|
stop (true);
|
||||||
if (start()) {
|
|
||||||
_started_for_latency = false;
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (start (true)) {
|
||||||
|
_started_for_latency = true;
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
int
|
||||||
AudioEngine::start_latency_detection ()
|
AudioEngine::start_latency_detection ()
|
||||||
{
|
{
|
||||||
|
if (!running()) {
|
||||||
if (prepare_for_latency_measurement ()) {
|
if (prepare_for_latency_measurement ()) {
|
||||||
return;
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PortEngine& pe (port_engine());
|
PortEngine& pe (port_engine());
|
||||||
|
|
@ -1074,27 +1093,32 @@ AudioEngine::start_latency_detection ()
|
||||||
PortEngine::PortHandle* in = pe.get_port_by_name (_latency_input_name);
|
PortEngine::PortHandle* in = pe.get_port_by_name (_latency_input_name);
|
||||||
|
|
||||||
if (!out || !in) {
|
if (!out || !in) {
|
||||||
return;
|
stop (true);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* create the ports we will use to read/write data */
|
/* create the ports we will use to read/write data */
|
||||||
|
|
||||||
if ((_latency_output_port = pe.register_port ("latency_out", DataType::AUDIO, IsOutput)) == 0) {
|
if ((_latency_output_port = pe.register_port ("latency_out", DataType::AUDIO, IsOutput)) == 0) {
|
||||||
return;
|
stop (true);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
if (pe.connect (_latency_output_port, _latency_output_name)) {
|
if (pe.connect (_latency_output_port, _latency_output_name)) {
|
||||||
pe.unregister_port (_latency_output_port);
|
pe.unregister_port (_latency_output_port);
|
||||||
return;
|
stop (true);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const string portname ("latency_in");
|
const string portname ("latency_in");
|
||||||
if ((_latency_input_port = pe.register_port (portname, DataType::AUDIO, IsInput)) == 0) {
|
if ((_latency_input_port = pe.register_port (portname, DataType::AUDIO, IsInput)) == 0) {
|
||||||
pe.unregister_port (_latency_output_port);
|
pe.unregister_port (_latency_output_port);
|
||||||
return;
|
stop (true);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
if (pe.connect (_latency_input_name, make_port_name_non_relative (portname))) {
|
if (pe.connect (_latency_input_name, make_port_name_non_relative (portname))) {
|
||||||
pe.unregister_port (_latency_output_port);
|
pe.unregister_port (_latency_output_port);
|
||||||
return;
|
stop (true);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
LatencyRange lr;
|
LatencyRange lr;
|
||||||
|
|
@ -1110,6 +1134,7 @@ AudioEngine::start_latency_detection ()
|
||||||
_measuring_latency = true;
|
_measuring_latency = true;
|
||||||
_latency_flush_frames = samples_per_cycle();
|
_latency_flush_frames = samples_per_cycle();
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -1125,9 +1150,15 @@ AudioEngine::stop_latency_detection ()
|
||||||
port_engine().unregister_port (_latency_input_port);
|
port_engine().unregister_port (_latency_input_port);
|
||||||
_latency_input_port = 0;
|
_latency_input_port = 0;
|
||||||
}
|
}
|
||||||
if (_started_for_latency) {
|
|
||||||
stop ();
|
stop (true);
|
||||||
|
|
||||||
|
if (_stopped_for_latency) {
|
||||||
|
start ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_stopped_for_latency = false;
|
||||||
|
_started_for_latency = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -269,3 +269,15 @@ Processor::set_ui (void* p)
|
||||||
{
|
{
|
||||||
_ui_pointer = p;
|
_ui_pointer = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Processor::set_owner (SessionObject* o)
|
||||||
|
{
|
||||||
|
_owner = o;
|
||||||
|
}
|
||||||
|
|
||||||
|
SessionObject*
|
||||||
|
Processor::owner() const
|
||||||
|
{
|
||||||
|
return _owner;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -149,6 +149,7 @@ Route::init ()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
_meter.reset (new PeakMeter (_session, _name));
|
_meter.reset (new PeakMeter (_session, _name));
|
||||||
|
_meter->set_owner (this);
|
||||||
_meter->set_display_to_user (false);
|
_meter->set_display_to_user (false);
|
||||||
_meter->activate ();
|
_meter->activate ();
|
||||||
|
|
||||||
|
|
@ -1011,6 +1012,7 @@ Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<
|
||||||
}
|
}
|
||||||
|
|
||||||
_processors.insert (loc, processor);
|
_processors.insert (loc, processor);
|
||||||
|
processor->set_owner (this);
|
||||||
|
|
||||||
// Set up processor list channels. This will set processor->[input|output]_streams(),
|
// Set up processor list channels. This will set processor->[input|output]_streams(),
|
||||||
// configure redirect ports properly, etc.
|
// configure redirect ports properly, etc.
|
||||||
|
|
@ -1161,6 +1163,7 @@ Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor>
|
||||||
}
|
}
|
||||||
|
|
||||||
_processors.insert (loc, *i);
|
_processors.insert (loc, *i);
|
||||||
|
(*i)->set_owner (this);
|
||||||
|
|
||||||
if ((*i)->active()) {
|
if ((*i)->active()) {
|
||||||
(*i)->activate ();
|
(*i)->activate ();
|
||||||
|
|
@ -2620,6 +2623,7 @@ Route::set_processor_state (const XMLNode& node)
|
||||||
|
|
||||||
for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
|
for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
|
||||||
|
|
||||||
|
(*i)->set_owner (this);
|
||||||
(*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
|
(*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
|
||||||
|
|
||||||
boost::shared_ptr<PluginInsert> pi;
|
boost::shared_ptr<PluginInsert> pi;
|
||||||
|
|
|
||||||
15
libs/ardour/run-session-tests.sh
Normal file → Executable file
15
libs/ardour/run-session-tests.sh
Normal file → Executable file
|
|
@ -8,20 +8,7 @@ if [ ! -f './tempo.cc' ]; then
|
||||||
exit 1;
|
exit 1;
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd ../..
|
. test-env.sh
|
||||||
top=`pwd`
|
|
||||||
cd build
|
|
||||||
|
|
||||||
libs='libs'
|
|
||||||
|
|
||||||
export LD_LIBRARY_PATH=$libs/audiographer:$libs/vamp-sdk:$libs/surfaces:$libs/surfaces/control_protocol:$libs/ardour:$libs/midi++2:$libs/pbd:$libs/rubberband:$libs/soundtouch:$libs/gtkmm2ext:$libs/appleutility:$libs/taglib:$libs/evoral:$libs/evoral/src/libsmf:$libs/timecode:/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH
|
|
||||||
|
|
||||||
export ARDOUR_CONFIG_PATH=$top:$top/gtk2_ardour:$libs/..:$libs/../gtk2_ardour
|
|
||||||
export ARDOUR_PANNER_PATH=$libs/panners/2in2out:$libs/panners/1in2out:$libs/panners/vbap
|
|
||||||
export ARDOUR_SURFACES_PATH=$libs/surfaces/osc:$libs/surfaces/generic_midi:$libs/surfaces/tranzport:$libs/surfaces/powermate:$libs/surfaces/mackie
|
|
||||||
export ARDOUR_MCP_PATH="../mcp"
|
|
||||||
export ARDOUR_DLL_PATH=$libs
|
|
||||||
export ARDOUR_DATA_PATH=$top/gtk2_ardour:$top/build/gtk2_ardour:.
|
|
||||||
|
|
||||||
f=""
|
f=""
|
||||||
if [ "$1" == "--debug" -o "$1" == "--valgrind" ]; then
|
if [ "$1" == "--debug" -o "$1" == "--valgrind" ]; then
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
#
|
#
|
||||||
# Run libardour test suite.
|
# Run libardour test suite.
|
||||||
#
|
#
|
||||||
|
. test-env.sh
|
||||||
|
|
||||||
if [ "$1" == "--single" ] || [ "$2" == "--single" ]; then
|
if [ "$1" == "--single" ] || [ "$2" == "--single" ]; then
|
||||||
if [ "$1" == "--single" ]; then
|
if [ "$1" == "--single" ]; then
|
||||||
|
|
|
||||||
|
|
@ -22,3 +22,4 @@ export ARDOUR_SURFACES_PATH=$libs/surfaces/osc:$libs/surfaces/generic_midi:$libs
|
||||||
export ARDOUR_MCP_PATH="../mcp"
|
export ARDOUR_MCP_PATH="../mcp"
|
||||||
export ARDOUR_DLL_PATH=$libs
|
export ARDOUR_DLL_PATH=$libs
|
||||||
export ARDOUR_DATA_PATH=$top/gtk2_ardour:$top/build/gtk2_ardour:.
|
export ARDOUR_DATA_PATH=$top/gtk2_ardour:$top/build/gtk2_ardour:.
|
||||||
|
export ARDOUR_BACKEND_PATH=$libs/backends/jack
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,6 @@
|
||||||
#include "ardour/region.h"
|
#include "ardour/region.h"
|
||||||
#include "ardour/audioregion.h"
|
#include "ardour/audioregion.h"
|
||||||
#include "audio_region_read_test.h"
|
#include "audio_region_read_test.h"
|
||||||
#include "test_globals.h"
|
|
||||||
|
|
||||||
CPPUNIT_TEST_SUITE_REGISTRATION (AudioRegionReadTest);
|
CPPUNIT_TEST_SUITE_REGISTRATION (AudioRegionReadTest);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,6 @@
|
||||||
#include "ardour/audioregion.h"
|
#include "ardour/audioregion.h"
|
||||||
#include "ardour/audioplaylist.h"
|
#include "ardour/audioplaylist.h"
|
||||||
#include "audio_region_test.h"
|
#include "audio_region_test.h"
|
||||||
#include "test_globals.h"
|
|
||||||
#include "test_common.h"
|
#include "test_common.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
@ -42,7 +41,7 @@ AudioRegionTest::setUp ()
|
||||||
std::string const test_wav_path = Glib::build_filename (new_test_output_dir(), "test.wav");
|
std::string const test_wav_path = Glib::build_filename (new_test_output_dir(), "test.wav");
|
||||||
_playlist = PlaylistFactory::create (DataType::AUDIO, *_session, "test");
|
_playlist = PlaylistFactory::create (DataType::AUDIO, *_session, "test");
|
||||||
_audio_playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_playlist);
|
_audio_playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_playlist);
|
||||||
_source = SourceFactory::createWritable (DataType::AUDIO, *_session, test_wav_path, "", false, Fs);
|
_source = SourceFactory::createWritable (DataType::AUDIO, *_session, test_wav_path, false, get_test_sample_rate ());
|
||||||
|
|
||||||
/* Write a staircase to the source */
|
/* Write a staircase to the source */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,11 +16,15 @@
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <glibmm/fileutils.h>
|
||||||
|
#include <glibmm/miscutils.h>
|
||||||
|
|
||||||
#include "pbd/properties.h"
|
#include "pbd/properties.h"
|
||||||
#include "pbd/stateful_diff_command.h"
|
#include "pbd/stateful_diff_command.h"
|
||||||
#include "ardour/automation_list.h"
|
#include "ardour/automation_list.h"
|
||||||
#include "automation_list_property_test.h"
|
#include "automation_list_property_test.h"
|
||||||
#include "test_util.h"
|
#include "test_util.h"
|
||||||
|
#include "test_common.h"
|
||||||
|
|
||||||
CPPUNIT_TEST_SUITE_REGISTRATION (AutomationListPropertyTest);
|
CPPUNIT_TEST_SUITE_REGISTRATION (AutomationListPropertyTest);
|
||||||
|
|
||||||
|
|
@ -28,6 +32,16 @@ using namespace std;
|
||||||
using namespace PBD;
|
using namespace PBD;
|
||||||
using namespace ARDOUR;
|
using namespace ARDOUR;
|
||||||
|
|
||||||
|
void
|
||||||
|
write_automation_list_xml (XMLNode* node, std::string filename)
|
||||||
|
{
|
||||||
|
// use the same output dir for all of them
|
||||||
|
static std::string test_output_dir = new_test_output_dir ("automation_list_property");
|
||||||
|
std::string output_file = Glib::build_filename (test_output_dir, filename);
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT (write_ref (node, output_file));
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
AutomationListPropertyTest::basicTest ()
|
AutomationListPropertyTest::basicTest ()
|
||||||
{
|
{
|
||||||
|
|
@ -52,9 +66,18 @@ AutomationListPropertyTest::basicTest ()
|
||||||
/* Now it has changed */
|
/* Now it has changed */
|
||||||
CPPUNIT_ASSERT_EQUAL (true, property.changed());
|
CPPUNIT_ASSERT_EQUAL (true, property.changed());
|
||||||
|
|
||||||
|
std::string test_data_filename = "automation_list_property_test1.ref";
|
||||||
|
std::string test_data_file1 = Glib::build_filename (test_search_path().front(), test_data_filename);
|
||||||
|
CPPUNIT_ASSERT (Glib::file_test (test_data_file1, Glib::FILE_TEST_EXISTS));
|
||||||
|
|
||||||
XMLNode* foo = new XMLNode ("test");
|
XMLNode* foo = new XMLNode ("test");
|
||||||
property.get_changes_as_xml (foo);
|
property.get_changes_as_xml (foo);
|
||||||
check_xml (foo, "../libs/ardour/test/data/automation_list_property_test1.ref", ignore_properties);
|
write_automation_list_xml (foo, test_data_filename);
|
||||||
|
check_xml (foo, test_data_file1, ignore_properties);
|
||||||
|
|
||||||
|
test_data_filename = "automation_list_property_test2.ref";
|
||||||
|
std::string test_data_file2 = Glib::build_filename (test_search_path().front(), test_data_filename);
|
||||||
|
CPPUNIT_ASSERT (Glib::file_test (test_data_file2, Glib::FILE_TEST_EXISTS));
|
||||||
|
|
||||||
/* Do some more */
|
/* Do some more */
|
||||||
property.clear_changes ();
|
property.clear_changes ();
|
||||||
|
|
@ -64,7 +87,8 @@ AutomationListPropertyTest::basicTest ()
|
||||||
CPPUNIT_ASSERT_EQUAL (true, property.changed());
|
CPPUNIT_ASSERT_EQUAL (true, property.changed());
|
||||||
foo = new XMLNode ("test");
|
foo = new XMLNode ("test");
|
||||||
property.get_changes_as_xml (foo);
|
property.get_changes_as_xml (foo);
|
||||||
check_xml (foo, "../libs/ardour/test/data/automation_list_property_test2.ref", ignore_properties);
|
write_automation_list_xml (foo, test_data_filename);
|
||||||
|
check_xml (foo, test_data_file2, ignore_properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Here's a StatefulDestructible class that has a AutomationListProperty */
|
/** Here's a StatefulDestructible class that has a AutomationListProperty */
|
||||||
|
|
@ -119,11 +143,21 @@ AutomationListPropertyTest::undoTest ()
|
||||||
sheila->_jim->add (7, 8);
|
sheila->_jim->add (7, 8);
|
||||||
StatefulDiffCommand sdc (sheila);
|
StatefulDiffCommand sdc (sheila);
|
||||||
|
|
||||||
|
std::string test_data_filename = "automation_list_property_test3.ref";
|
||||||
|
std::string test_data_file3 = Glib::build_filename (test_search_path().front(), test_data_filename);
|
||||||
|
CPPUNIT_ASSERT (Glib::file_test (test_data_file3, Glib::FILE_TEST_EXISTS));
|
||||||
|
|
||||||
/* Undo */
|
/* Undo */
|
||||||
sdc.undo ();
|
sdc.undo ();
|
||||||
check_xml (&sheila->get_state(), "../libs/ardour/test/data/automation_list_property_test3.ref", ignore_properties);
|
write_automation_list_xml (&sheila->get_state(), test_data_filename);
|
||||||
|
check_xml (&sheila->get_state(), test_data_file3, ignore_properties);
|
||||||
|
|
||||||
|
test_data_filename = "automation_list_property_test4.ref";
|
||||||
|
std::string test_data_file4 = Glib::build_filename (test_search_path().front(), test_data_filename);
|
||||||
|
CPPUNIT_ASSERT (Glib::file_test (test_data_file4, Glib::FILE_TEST_EXISTS));
|
||||||
|
|
||||||
/* Redo */
|
/* Redo */
|
||||||
sdc.redo ();
|
sdc.redo ();
|
||||||
check_xml (&sheila->get_state(), "../libs/ardour/test/data/automation_list_property_test4.ref", ignore_properties);
|
write_automation_list_xml (&sheila->get_state(), test_data_filename);
|
||||||
|
check_xml (&sheila->get_state(), test_data_file4, ignore_properties);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@
|
||||||
#include "ardour/ardour.h"
|
#include "ardour/ardour.h"
|
||||||
#include "ardour/audioengine.h"
|
#include "ardour/audioengine.h"
|
||||||
#include "ardour/session.h"
|
#include "ardour/session.h"
|
||||||
#include "midi++/manager.h"
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|
||||||
|
|
@ -41,9 +40,8 @@ int main (int argc, char* argv[])
|
||||||
|
|
||||||
AudioEngine::instance()->remove_session ();
|
AudioEngine::instance()->remove_session ();
|
||||||
delete s;
|
delete s;
|
||||||
AudioEngine::instance()->stop (true);
|
AudioEngine::instance()->stop ();
|
||||||
|
|
||||||
MIDI::Manager::destroy ();
|
|
||||||
AudioEngine::destroy ();
|
AudioEngine::destroy ();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@
|
||||||
#include "ardour/audioregion.h"
|
#include "ardour/audioregion.h"
|
||||||
#include "ardour/session.h"
|
#include "ardour/session.h"
|
||||||
#include "playlist_read_test.h"
|
#include "playlist_read_test.h"
|
||||||
#include "test_globals.h"
|
|
||||||
|
|
||||||
CPPUNIT_TEST_SUITE_REGISTRATION (PlaylistReadTest);
|
CPPUNIT_TEST_SUITE_REGISTRATION (PlaylistReadTest);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@
|
||||||
#include "ardour/ardour.h"
|
#include "ardour/ardour.h"
|
||||||
#include "ardour/audioengine.h"
|
#include "ardour/audioengine.h"
|
||||||
#include "ardour/session.h"
|
#include "ardour/session.h"
|
||||||
#include "midi++/manager.h"
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|
||||||
|
|
@ -41,9 +40,8 @@ int main (int argc, char* argv[])
|
||||||
|
|
||||||
AudioEngine::instance()->remove_session ();
|
AudioEngine::instance()->remove_session ();
|
||||||
delete s;
|
delete s;
|
||||||
AudioEngine::instance()->stop (true);
|
AudioEngine::instance()->stop ();
|
||||||
|
|
||||||
MIDI::Manager::destroy ();
|
|
||||||
AudioEngine::destroy ();
|
AudioEngine::destroy ();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include "midi++/manager.h"
|
|
||||||
#include "pbd/textreceiver.h"
|
#include "pbd/textreceiver.h"
|
||||||
#include "pbd/compose.h"
|
#include "pbd/compose.h"
|
||||||
#include "pbd/enumwriter.h"
|
#include "pbd/enumwriter.h"
|
||||||
|
|
@ -31,7 +30,7 @@ main (int argc, char* argv[])
|
||||||
cout << "INFO: " << session->get_routes()->size() << " routes.\n";
|
cout << "INFO: " << session->get_routes()->size() << " routes.\n";
|
||||||
|
|
||||||
for (int i = 0; i < 32768; ++i) {
|
for (int i = 0; i < 32768; ++i) {
|
||||||
session->process (session->engine().frames_per_cycle ());
|
session->process (session->engine().samples_per_cycle ());
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
#include <glibmm/miscutils.h>
|
#include <glibmm/miscutils.h>
|
||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include "midi++/manager.h"
|
|
||||||
#include "pbd/textreceiver.h"
|
#include "pbd/textreceiver.h"
|
||||||
#include "pbd/file_utils.h"
|
#include "pbd/file_utils.h"
|
||||||
#include "ardour/session.h"
|
#include "ardour/session.h"
|
||||||
|
|
@ -33,17 +33,12 @@ SessionTest::setUp ()
|
||||||
text_receiver.listen_to (fatal);
|
text_receiver.listen_to (fatal);
|
||||||
text_receiver.listen_to (warning);
|
text_receiver.listen_to (warning);
|
||||||
|
|
||||||
// this is not a good singleton constructor pattern
|
AudioEngine* engine = AudioEngine::create ();
|
||||||
AudioEngine* engine = 0;
|
|
||||||
|
|
||||||
try {
|
|
||||||
engine = new AudioEngine ("session_test", "");
|
|
||||||
} catch (const AudioEngine::NoBackendAvailable& engine_exception) {
|
|
||||||
cerr << engine_exception.what ();
|
|
||||||
}
|
|
||||||
|
|
||||||
CPPUNIT_ASSERT (engine);
|
CPPUNIT_ASSERT (engine);
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT (engine->set_default_backend());
|
||||||
|
|
||||||
init_post_engine ();
|
init_post_engine ();
|
||||||
|
|
||||||
CPPUNIT_ASSERT (engine->start () == 0);
|
CPPUNIT_ASSERT (engine->start () == 0);
|
||||||
|
|
@ -53,9 +48,8 @@ void
|
||||||
SessionTest::tearDown ()
|
SessionTest::tearDown ()
|
||||||
{
|
{
|
||||||
// this is needed or there is a crash in MIDI::Manager::destroy
|
// this is needed or there is a crash in MIDI::Manager::destroy
|
||||||
AudioEngine::instance()->stop (true);
|
AudioEngine::instance()->stop ();
|
||||||
|
|
||||||
MIDI::Manager::destroy ();
|
|
||||||
AudioEngine::destroy ();
|
AudioEngine::destroy ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,13 +37,14 @@ test_search_path ()
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
new_test_output_dir ()
|
new_test_output_dir (std::string prefix)
|
||||||
{
|
{
|
||||||
std::string tmp_dir = Glib::build_filename (g_get_tmp_dir(), "ardour_test");
|
std::string tmp_dir = Glib::build_filename (g_get_tmp_dir(), "ardour_test");
|
||||||
std::string dir_name;
|
std::string dir_name;
|
||||||
std::string new_test_dir;
|
std::string new_test_dir;
|
||||||
do {
|
do {
|
||||||
ostringstream oss;
|
ostringstream oss;
|
||||||
|
oss << prefix;
|
||||||
oss << g_random_int ();
|
oss << g_random_int ();
|
||||||
dir_name = oss.str();
|
dir_name = oss.str();
|
||||||
new_test_dir = Glib::build_filename (tmp_dir, dir_name);
|
new_test_dir = Glib::build_filename (tmp_dir, dir_name);
|
||||||
|
|
@ -51,3 +52,9 @@ new_test_output_dir ()
|
||||||
} while (g_mkdir_with_parents (new_test_dir.c_str(), 0755) != 0);
|
} while (g_mkdir_with_parents (new_test_dir.c_str(), 0755) != 0);
|
||||||
return new_test_dir;
|
return new_test_dir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
get_test_sample_rate ()
|
||||||
|
{
|
||||||
|
return 44100;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,8 @@
|
||||||
|
|
||||||
PBD::Searchpath test_search_path ();
|
PBD::Searchpath test_search_path ();
|
||||||
|
|
||||||
std::string new_test_output_dir ();
|
std::string new_test_output_dir (std::string prefix = "");
|
||||||
|
|
||||||
|
int get_test_sample_rate ();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
#include "test_globals.h"
|
|
||||||
|
|
||||||
int const Fs = 44100;
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
|
|
||||||
extern int const Fs;
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
#include <glibmm/miscutils.h>
|
#include <glibmm/miscutils.h>
|
||||||
|
|
||||||
#include "midi++/manager.h"
|
|
||||||
#include "pbd/compose.h"
|
#include "pbd/compose.h"
|
||||||
#include "pbd/enumwriter.h"
|
#include "pbd/enumwriter.h"
|
||||||
#include "ardour/session.h"
|
#include "ardour/session.h"
|
||||||
|
|
@ -26,8 +25,7 @@ TestNeedingSession::tearDown ()
|
||||||
{
|
{
|
||||||
AudioEngine::instance()->remove_session ();
|
AudioEngine::instance()->remove_session ();
|
||||||
delete _session;
|
delete _session;
|
||||||
AudioEngine::instance()->stop (true);
|
AudioEngine::instance()->stop ();
|
||||||
|
|
||||||
MIDI::Manager::destroy ();
|
|
||||||
AudioEngine::destroy ();
|
AudioEngine::destroy ();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -60,12 +60,12 @@ check_xml (XMLNode* node, string ref_file, list<string> const & ignore_propertie
|
||||||
check_nodes (p, q, ignore_properties);
|
check_nodes (p, q, ignore_properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
bool
|
||||||
write_ref (XMLNode* node, string ref_file)
|
write_ref (XMLNode* node, string ref_file)
|
||||||
{
|
{
|
||||||
XMLTree ref;
|
XMLTree ref;
|
||||||
ref.set_root (node);
|
ref.set_root (node);
|
||||||
ref.write (ref_file);
|
return ref.write (ref_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
class TestReceiver : public Receiver
|
class TestReceiver : public Receiver
|
||||||
|
|
@ -124,7 +124,10 @@ load_session (string dir, string state)
|
||||||
*/
|
*/
|
||||||
Config->set_use_lxvst (false);
|
Config->set_use_lxvst (false);
|
||||||
|
|
||||||
AudioEngine* engine = new AudioEngine ("test", "");
|
AudioEngine* engine = AudioEngine::create ();
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT (engine->set_default_backend ());
|
||||||
|
|
||||||
init_post_engine ();
|
init_post_engine ();
|
||||||
|
|
||||||
CPPUNIT_ASSERT (engine->start () == 0);
|
CPPUNIT_ASSERT (engine->start () == 0);
|
||||||
|
|
|
||||||
|
|
@ -8,5 +8,5 @@ namespace ARDOUR {
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void check_xml (XMLNode *, std::string, std::list<std::string> const &);
|
extern void check_xml (XMLNode *, std::string, std::list<std::string> const &);
|
||||||
extern void write_ref (XMLNode *, std::string);
|
extern bool write_ref (XMLNode *, std::string);
|
||||||
extern ARDOUR::Session* load_session (std::string, std::string);
|
extern ARDOUR::Session* load_session (std::string, std::string);
|
||||||
|
|
|
||||||
|
|
@ -402,7 +402,7 @@ def build(bld):
|
||||||
# only build these common sources once
|
# only build these common sources once
|
||||||
testcommon = bld(features = 'cxx')
|
testcommon = bld(features = 'cxx')
|
||||||
testcommon.includes = obj.includes + ['test', '../pbd', '..']
|
testcommon.includes = obj.includes + ['test', '../pbd', '..']
|
||||||
testcommon.source = ['test/test_globals.cc', 'test/testrunner.cc', 'test/test_needing_session.cc',
|
testcommon.source = ['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']
|
'test/test_common.cc', 'test/dummy_lxvst.cc', 'test/audio_region_test.cc', 'test/test_util.cc']
|
||||||
testcommon.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD',
|
testcommon.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD',
|
||||||
'SAMPLERATE','XML','LRDF','COREAUDIO']
|
'SAMPLERATE','XML','LRDF','COREAUDIO']
|
||||||
|
|
|
||||||
|
|
@ -409,6 +409,12 @@ JACKAudioBackend::interleaved () const
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string
|
||||||
|
JACKAudioBackend::midi_option () const
|
||||||
|
{
|
||||||
|
return _target_midi_option;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t
|
uint32_t
|
||||||
JACKAudioBackend::input_channels () const
|
JACKAudioBackend::input_channels () const
|
||||||
{
|
{
|
||||||
|
|
@ -465,7 +471,7 @@ JACKAudioBackend::raw_buffer_size(DataType t)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
JACKAudioBackend::setup_jack_startup_command ()
|
JACKAudioBackend::setup_jack_startup_command (bool for_latency_measurement)
|
||||||
{
|
{
|
||||||
/* first we map the parameters that have been set onto a
|
/* first we map the parameters that have been set onto a
|
||||||
* JackCommandLineOptions object.
|
* JackCommandLineOptions object.
|
||||||
|
|
@ -490,6 +496,8 @@ JACKAudioBackend::setup_jack_startup_command ()
|
||||||
options.realtime = true;
|
options.realtime = true;
|
||||||
options.ports_max = 2048;
|
options.ports_max = 2048;
|
||||||
|
|
||||||
|
ARDOUR::set_midi_option (options, _target_midi_option);
|
||||||
|
|
||||||
/* this must always be true for any server instance we start ourselves
|
/* this must always be true for any server instance we start ourselves
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
@ -497,7 +505,7 @@ JACKAudioBackend::setup_jack_startup_command ()
|
||||||
|
|
||||||
string cmdline;
|
string cmdline;
|
||||||
|
|
||||||
if (!get_jack_command_line_string (options, cmdline)) {
|
if (!get_jack_command_line_string (options, cmdline, for_latency_measurement)) {
|
||||||
/* error, somehow - we will still try to start JACK
|
/* error, somehow - we will still try to start JACK
|
||||||
* automatically but it will be without our preferred options
|
* automatically but it will be without our preferred options
|
||||||
*/
|
*/
|
||||||
|
|
@ -512,7 +520,7 @@ JACKAudioBackend::setup_jack_startup_command ()
|
||||||
/* ---- BASIC STATE CONTROL API: start/stop/pause/freewheel --- */
|
/* ---- BASIC STATE CONTROL API: start/stop/pause/freewheel --- */
|
||||||
|
|
||||||
int
|
int
|
||||||
JACKAudioBackend::start ()
|
JACKAudioBackend::_start (bool for_latency_measurement)
|
||||||
{
|
{
|
||||||
if (!available()) {
|
if (!available()) {
|
||||||
|
|
||||||
|
|
@ -520,7 +528,7 @@ JACKAudioBackend::start ()
|
||||||
/* we will be starting JACK, so set up the
|
/* we will be starting JACK, so set up the
|
||||||
command that JACK will use when it (auto-)starts
|
command that JACK will use when it (auto-)starts
|
||||||
*/
|
*/
|
||||||
setup_jack_startup_command ();
|
setup_jack_startup_command (for_latency_measurement);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_jack_connection->open ()) {
|
if (_jack_connection->open ()) {
|
||||||
|
|
@ -597,7 +605,7 @@ JACKAudioBackend::freewheel (bool onoff)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (jack_set_freewheel (_priv_jack, onoff) == 0) {
|
if (jack_set_freewheel (_priv_jack, onoff) == 0) {
|
||||||
_freewheeling = true;
|
_freewheeling = onoff;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1110,3 +1118,16 @@ JACKAudioBackend::launch_control_app ()
|
||||||
args.push_back (appname);
|
args.push_back (appname);
|
||||||
Glib::spawn_async ("", args, Glib::SPAWN_SEARCH_PATH);
|
Glib::spawn_async ("", args, Glib::SPAWN_SEARCH_PATH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vector<string>
|
||||||
|
JACKAudioBackend::enumerate_midi_options () const
|
||||||
|
{
|
||||||
|
return ARDOUR::enumerate_midi_options ();
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
JACKAudioBackend::set_midi_option (const string& opt)
|
||||||
|
{
|
||||||
|
_target_midi_option = opt;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -89,7 +89,7 @@ class JACKAudioBackend : public AudioBackend {
|
||||||
std::string control_app_name () const;
|
std::string control_app_name () const;
|
||||||
void launch_control_app ();
|
void launch_control_app ();
|
||||||
|
|
||||||
int start ();
|
int _start (bool for_latency_measurement);
|
||||||
int stop ();
|
int stop ();
|
||||||
int pause ();
|
int pause ();
|
||||||
int freewheel (bool);
|
int freewheel (bool);
|
||||||
|
|
@ -149,6 +149,10 @@ class JACKAudioBackend : public AudioBackend {
|
||||||
|
|
||||||
/* MIDI */
|
/* MIDI */
|
||||||
|
|
||||||
|
std::vector<std::string> enumerate_midi_options () const;
|
||||||
|
int set_midi_option (const std::string&);
|
||||||
|
std::string midi_option () const;
|
||||||
|
|
||||||
int midi_event_get (pframes_t& timestamp, size_t& size, uint8_t** buf, void* port_buffer, uint32_t event_index);
|
int midi_event_get (pframes_t& timestamp, size_t& size, uint8_t** buf, void* port_buffer, uint32_t event_index);
|
||||||
int midi_event_put (void* port_buffer, pframes_t timestamp, const uint8_t* buffer, size_t size);
|
int midi_event_put (void* port_buffer, pframes_t timestamp, const uint8_t* buffer, size_t size);
|
||||||
uint32_t get_midi_event_count (void* port_buffer);
|
uint32_t get_midi_event_count (void* port_buffer);
|
||||||
|
|
@ -221,7 +225,7 @@ class JACKAudioBackend : public AudioBackend {
|
||||||
void* process_thread ();
|
void* process_thread ();
|
||||||
static void* _start_process_thread (void*);
|
static void* _start_process_thread (void*);
|
||||||
|
|
||||||
void setup_jack_startup_command ();
|
void setup_jack_startup_command (bool for_latency_measurement);
|
||||||
|
|
||||||
/* pffooo */
|
/* pffooo */
|
||||||
|
|
||||||
|
|
@ -237,6 +241,7 @@ class JACKAudioBackend : public AudioBackend {
|
||||||
uint32_t _target_systemic_output_latency;
|
uint32_t _target_systemic_output_latency;
|
||||||
uint32_t _current_sample_rate;
|
uint32_t _current_sample_rate;
|
||||||
uint32_t _current_buffer_size;
|
uint32_t _current_buffer_size;
|
||||||
|
std::string _target_midi_option;
|
||||||
|
|
||||||
typedef std::set<std::string> DeviceList;
|
typedef std::set<std::string> DeviceList;
|
||||||
typedef std::map<std::string,DeviceList> DriverDeviceMap;
|
typedef std::map<std::string,DeviceList> DriverDeviceMap;
|
||||||
|
|
|
||||||
|
|
@ -83,6 +83,7 @@ namespace {
|
||||||
const char * const dummy_driver_command_line_name = X_("dummy");
|
const char * const dummy_driver_command_line_name = X_("dummy");
|
||||||
|
|
||||||
// should we provide more "pretty" names like above?
|
// should we provide more "pretty" names like above?
|
||||||
|
const char * const alsaint_midi_driver_name = X_("alsa");
|
||||||
const char * const alsaseq_midi_driver_name = X_("seq");
|
const char * const alsaseq_midi_driver_name = X_("seq");
|
||||||
const char * const alsaraw_midi_driver_name = X_("raw");
|
const char * const alsaraw_midi_driver_name = X_("raw");
|
||||||
const char * const winmme_midi_driver_name = X_("winmme");
|
const char * const winmme_midi_driver_name = X_("winmme");
|
||||||
|
|
@ -92,6 +93,8 @@ namespace {
|
||||||
const char * const default_device_name = X_("Default");
|
const char * const default_device_name = X_("Default");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ARDOUR::MidiOptions midi_options;
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
get_none_string ()
|
get_none_string ()
|
||||||
{
|
{
|
||||||
|
|
@ -682,7 +685,7 @@ ARDOUR::JackCommandLineOptions::JackCommandLineOptions ()
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ARDOUR::get_jack_command_line_string (JackCommandLineOptions& options, string& command_line)
|
ARDOUR::get_jack_command_line_string (JackCommandLineOptions& options, string& command_line, bool for_latency_measurement)
|
||||||
{
|
{
|
||||||
vector<string> args;
|
vector<string> args;
|
||||||
|
|
||||||
|
|
@ -740,6 +743,13 @@ ARDOUR::get_jack_command_line_string (JackCommandLineOptions& options, string& c
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (options.driver == alsa_driver_name) {
|
||||||
|
if (options.midi_driver == alsaint_midi_driver_name) {
|
||||||
|
args.push_back ("-I");
|
||||||
|
args.push_back ("alsa_midi");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
string command_line_driver_name;
|
string command_line_driver_name;
|
||||||
|
|
||||||
if (!get_jack_command_line_audio_driver_name (options.driver, command_line_driver_name)) {
|
if (!get_jack_command_line_audio_driver_name (options.driver, command_line_driver_name)) {
|
||||||
|
|
@ -811,7 +821,7 @@ ARDOUR::get_jack_command_line_string (JackCommandLineOptions& options, string& c
|
||||||
args.push_back ("-p");
|
args.push_back ("-p");
|
||||||
args.push_back (to_string (options.period_size, std::dec));
|
args.push_back (to_string (options.period_size, std::dec));
|
||||||
|
|
||||||
if (get_jack_audio_driver_supports_latency_adjustment (options.driver)) {
|
if (!for_latency_measurement && get_jack_audio_driver_supports_latency_adjustment (options.driver)) {
|
||||||
if (options.input_latency) {
|
if (options.input_latency) {
|
||||||
args.push_back ("-I");
|
args.push_back ("-I");
|
||||||
args.push_back (to_string (options.input_latency, std::dec));
|
args.push_back (to_string (options.input_latency, std::dec));
|
||||||
|
|
@ -846,12 +856,17 @@ ARDOUR::get_jack_command_line_string (JackCommandLineOptions& options, string& c
|
||||||
if (options.soft_mode) {
|
if (options.soft_mode) {
|
||||||
args.push_back ("-s");
|
args.push_back ("-s");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.driver == alsa_driver_name || options.driver == coreaudio_driver_name) {
|
||||||
|
|
||||||
|
if (options.midi_driver != alsaint_midi_driver_name) {
|
||||||
if (!options.midi_driver.empty() && options.midi_driver != get_none_string ()) {
|
if (!options.midi_driver.empty() && options.midi_driver != get_none_string ()) {
|
||||||
args.push_back ("-X");
|
args.push_back ("-X");
|
||||||
args.push_back (options.midi_driver);
|
args.push_back (options.midi_driver);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ostringstream oss;
|
ostringstream oss;
|
||||||
|
|
||||||
|
|
@ -900,3 +915,53 @@ ARDOUR::write_jack_config_file (const std::string& config_file_path, const strin
|
||||||
jackdrc.close ();
|
jackdrc.close ();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vector<string>
|
||||||
|
ARDOUR::enumerate_midi_options ()
|
||||||
|
{
|
||||||
|
if (midi_options.empty()) {
|
||||||
|
#ifdef HAVE_ALSA
|
||||||
|
midi_options.push_back (make_pair (_("ALSA"), alsaint_midi_driver_name));
|
||||||
|
midi_options.push_back (make_pair (_("(legacy) ALSA raw devices"), alsaraw_midi_driver_name));
|
||||||
|
midi_options.push_back (make_pair (_("(legacy) ALSA sequencer"), alsaseq_midi_driver_name));
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_PORTAUDIO
|
||||||
|
/* Windows folks: what name makes sense here? Are there other
|
||||||
|
choices as well ?
|
||||||
|
*/
|
||||||
|
midi_options.push_back (make_pair (_("Multimedia Extension"), winmme_midi_driver_name));
|
||||||
|
#endif
|
||||||
|
#ifdef __APPLE__
|
||||||
|
midi_options.push_back (make_pair (_("CoreMIDI"), coremidi_midi_driver_name));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<string> v;
|
||||||
|
|
||||||
|
v.push_back (get_none_string());
|
||||||
|
|
||||||
|
for (MidiOptions::const_iterator i = midi_options.begin(); i != midi_options.end(); ++i) {
|
||||||
|
v.push_back (i->first);
|
||||||
|
}
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ARDOUR::set_midi_option (ARDOUR::JackCommandLineOptions& options, const string& opt)
|
||||||
|
{
|
||||||
|
if (opt.empty() || opt == get_none_string()) {
|
||||||
|
options.midi_driver = "";
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (MidiOptions::const_iterator i = midi_options.begin(); i != midi_options.end(); ++i) {
|
||||||
|
if (i->first == opt) {
|
||||||
|
options.midi_driver = i->second;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -180,6 +180,8 @@ namespace ARDOUR {
|
||||||
*/
|
*/
|
||||||
bool get_jack_default_server_path (std::string& server_path);
|
bool get_jack_default_server_path (std::string& server_path);
|
||||||
|
|
||||||
|
typedef std::vector<std::pair<std::string,std::string> > MidiOptions;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The name of the jack server config file
|
* @return The name of the jack server config file
|
||||||
*/
|
*/
|
||||||
|
|
@ -228,8 +230,11 @@ namespace ARDOUR {
|
||||||
std::string midi_driver;
|
std::string midi_driver;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
std::vector<std::string> enumerate_midi_options ();
|
||||||
|
int set_midi_option (ARDOUR::JackCommandLineOptions&, const std::string& opt);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true if able to build a valid command line based on options
|
* @return true if able to build a valid command line based on options
|
||||||
*/
|
*/
|
||||||
bool get_jack_command_line_string (JackCommandLineOptions& options, std::string& command_line);
|
bool get_jack_command_line_string (JackCommandLineOptions& options, std::string& command_line, bool for_latency_measurement);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -104,11 +104,10 @@ ControllableDescriptor::set (const std::string& str)
|
||||||
}
|
}
|
||||||
} else if (path[1] == "send") {
|
} else if (path[1] == "send") {
|
||||||
|
|
||||||
if (path.size() == 3 && rest.size() == 3) {
|
if (path.size() == 3 && rest.size() == 2) {
|
||||||
if (path[2] == "gain") {
|
if (path[2] == "gain") {
|
||||||
_subtype = SendGain;
|
_subtype = SendGain;
|
||||||
_target.push_back (atoi (rest[1]));
|
_target.push_back (atoi (rest[1]));
|
||||||
_target.push_back (atoi (rest[2]));
|
|
||||||
} else {
|
} else {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -150,6 +150,7 @@ Shared=$APPDIR/share
|
||||||
Plugins=$APPLIB/plugins
|
Plugins=$APPLIB/plugins
|
||||||
Surfaces=$APPLIB/surfaces
|
Surfaces=$APPLIB/surfaces
|
||||||
Panners=$APPLIB/panners
|
Panners=$APPLIB/panners
|
||||||
|
Backends=$APPLIB/backends
|
||||||
|
|
||||||
Modules=$Libraries/modules
|
Modules=$Libraries/modules
|
||||||
Loaders=$Libraries/loaders
|
Loaders=$Libraries/loaders
|
||||||
|
|
@ -197,6 +198,7 @@ mkdir -p $PatchFiles
|
||||||
mkdir -p $MackieControl
|
mkdir -p $MackieControl
|
||||||
mkdir -p $ExportFormats
|
mkdir -p $ExportFormats
|
||||||
mkdir -p $Panners
|
mkdir -p $Panners
|
||||||
|
mkdir -p $Backends
|
||||||
mkdir -p $Templates
|
mkdir -p $Templates
|
||||||
mkdir -p $Shared/doc
|
mkdir -p $Shared/doc
|
||||||
|
|
||||||
|
|
@ -382,6 +384,9 @@ done
|
||||||
# Panners
|
# Panners
|
||||||
cp $BUILD_ROOT/libs/panners/*/lib*.so* $Panners
|
cp $BUILD_ROOT/libs/panners/*/lib*.so* $Panners
|
||||||
|
|
||||||
|
# Backends
|
||||||
|
cp $BUILD_ROOT/libs/backends/*/lib*.so* $Backends
|
||||||
|
|
||||||
# VAMP plugins that we use
|
# VAMP plugins that we use
|
||||||
cp $BUILD_ROOT/libs/vamp-plugins/libardourvampplugins.so* $Libraries
|
cp $BUILD_ROOT/libs/vamp-plugins/libardourvampplugins.so* $Libraries
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ fi
|
||||||
|
|
||||||
SAE=
|
SAE=
|
||||||
MIXBUS=
|
MIXBUS=
|
||||||
WITH_HARVID=
|
WITH_HARVID=1
|
||||||
WITH_LADSPA=1
|
WITH_LADSPA=1
|
||||||
STRIP=1
|
STRIP=1
|
||||||
PRINT_SYSDEPS=
|
PRINT_SYSDEPS=
|
||||||
|
|
@ -61,7 +61,7 @@ while [ $# -gt 0 ] ; do
|
||||||
# specific build flags
|
# specific build flags
|
||||||
#
|
#
|
||||||
|
|
||||||
--harvid) WITH_HARVID=1 ; shift ;;
|
--noharvid) WITH_HARVID= ; shift ;;
|
||||||
--noladspa) WITH_LADSPA= ; shift ;;
|
--noladspa) WITH_LADSPA= ; shift ;;
|
||||||
--nostrip) STRIP= ; shift ;;
|
--nostrip) STRIP= ; shift ;;
|
||||||
--sysdeps) PRINT_SYSDEPS=1; shift ;;
|
--sysdeps) PRINT_SYSDEPS=1; shift ;;
|
||||||
|
|
@ -99,6 +99,7 @@ Locale=$Resources/locale
|
||||||
Plugins=$APPROOT/Plugins
|
Plugins=$APPROOT/Plugins
|
||||||
Surfaces=$Frameworks/surfaces
|
Surfaces=$Frameworks/surfaces
|
||||||
Panners=$Frameworks/panners
|
Panners=$Frameworks/panners
|
||||||
|
Backends=$Frameworks/backends
|
||||||
MidiMaps=$Shared/midi_maps
|
MidiMaps=$Shared/midi_maps
|
||||||
ExportFormats=$Shared/export
|
ExportFormats=$Shared/export
|
||||||
Templates=$Shared/templates
|
Templates=$Shared/templates
|
||||||
|
|
@ -132,6 +133,7 @@ mkdir -p $APPROOT/Resources
|
||||||
mkdir -p $Plugins
|
mkdir -p $Plugins
|
||||||
mkdir -p $Surfaces
|
mkdir -p $Surfaces
|
||||||
mkdir -p $Panners
|
mkdir -p $Panners
|
||||||
|
mkdir -p $Backends
|
||||||
mkdir -p $MidiMaps
|
mkdir -p $MidiMaps
|
||||||
mkdir -p $ExportFormats
|
mkdir -p $ExportFormats
|
||||||
mkdir -p $Templates
|
mkdir -p $Templates
|
||||||
|
|
@ -308,6 +310,8 @@ cp $BUILD_ROOT/libs/surfaces/control_protocol/libardourcp*.dylib $Frameworks
|
||||||
# Panners
|
# Panners
|
||||||
cp $BUILD_ROOT/libs/panners/*/lib*.dylib $Panners
|
cp $BUILD_ROOT/libs/panners/*/lib*.dylib $Panners
|
||||||
|
|
||||||
|
# Backends
|
||||||
|
cp $BUILD_ROOT/libs/backends/*/lib*.dylib $Backends
|
||||||
|
|
||||||
# Export Formats/Presets
|
# Export Formats/Presets
|
||||||
for f in $BUILD_ROOT/../export/*.preset $BUILD_ROOT/../export/*.format ; do
|
for f in $BUILD_ROOT/../export/*.preset $BUILD_ROOT/../export/*.format ; do
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue