mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-23 15:16:25 +01:00
[Summary] Reworked master track behavior according to PRD
This commit is contained in:
parent
33349b260d
commit
dd78cce7b7
10 changed files with 56 additions and 130 deletions
|
|
@ -50,6 +50,7 @@ vector<RefPtr<Gtk::Action> > ActionManager::write_sensitive_actions;
|
||||||
vector<RefPtr<Gtk::Action> > ActionManager::region_list_selection_sensitive_actions;
|
vector<RefPtr<Gtk::Action> > ActionManager::region_list_selection_sensitive_actions;
|
||||||
vector<RefPtr<Gtk::Action> > ActionManager::plugin_selection_sensitive_actions;
|
vector<RefPtr<Gtk::Action> > ActionManager::plugin_selection_sensitive_actions;
|
||||||
vector<RefPtr<Gtk::Action> > ActionManager::track_selection_sensitive_actions;
|
vector<RefPtr<Gtk::Action> > ActionManager::track_selection_sensitive_actions;
|
||||||
|
vector<RefPtr<Gtk::Action> > ActionManager::actions_forbiden_for_master_track;
|
||||||
vector<RefPtr<Gtk::Action> > ActionManager::point_selection_sensitive_actions;
|
vector<RefPtr<Gtk::Action> > ActionManager::point_selection_sensitive_actions;
|
||||||
vector<RefPtr<Gtk::Action> > ActionManager::time_selection_sensitive_actions;
|
vector<RefPtr<Gtk::Action> > ActionManager::time_selection_sensitive_actions;
|
||||||
vector<RefPtr<Gtk::Action> > ActionManager::line_selection_sensitive_actions;
|
vector<RefPtr<Gtk::Action> > ActionManager::line_selection_sensitive_actions;
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,7 @@ namespace ActionManager {
|
||||||
extern std::vector<Glib::RefPtr<Gtk::Action> > plugin_selection_sensitive_actions;
|
extern std::vector<Glib::RefPtr<Gtk::Action> > plugin_selection_sensitive_actions;
|
||||||
|
|
||||||
extern std::vector<Glib::RefPtr<Gtk::Action> > track_selection_sensitive_actions;
|
extern std::vector<Glib::RefPtr<Gtk::Action> > track_selection_sensitive_actions;
|
||||||
|
extern std::vector<Glib::RefPtr<Gtk::Action> > actions_forbiden_for_master_track;
|
||||||
extern std::vector<Glib::RefPtr<Gtk::Action> > point_selection_sensitive_actions;
|
extern std::vector<Glib::RefPtr<Gtk::Action> > point_selection_sensitive_actions;
|
||||||
extern std::vector<Glib::RefPtr<Gtk::Action> > time_selection_sensitive_actions;
|
extern std::vector<Glib::RefPtr<Gtk::Action> > time_selection_sensitive_actions;
|
||||||
extern std::vector<Glib::RefPtr<Gtk::Action> > line_selection_sensitive_actions;
|
extern std::vector<Glib::RefPtr<Gtk::Action> > line_selection_sensitive_actions;
|
||||||
|
|
|
||||||
|
|
@ -133,7 +133,7 @@ CompactMeterStrip::update_tooltip ()
|
||||||
boost::shared_ptr<AudioTrack> t;
|
boost::shared_ptr<AudioTrack> t;
|
||||||
t = boost::dynamic_pointer_cast<AudioTrack>( _route );
|
t = boost::dynamic_pointer_cast<AudioTrack>( _route );
|
||||||
|
|
||||||
if( t!=NULL && t->is_master_track () )
|
if( t != NULL && t->is_master_track () )
|
||||||
{
|
{
|
||||||
this->set_tooltip_text (_route->name () + "\n" + record_status);
|
this->set_tooltip_text (_route->name () + "\n" + record_status);
|
||||||
} else
|
} else
|
||||||
|
|
|
||||||
|
|
@ -5069,13 +5069,9 @@ Editor::add_routes (RouteList& routes)
|
||||||
throw unknown_type();
|
throw unknown_type();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rtv->is_master_track() ) {
|
|
||||||
new_views.push_front (rtv);
|
new_views.push_back (rtv);
|
||||||
track_views.push_front (rtv);
|
track_views.push_back (rtv);
|
||||||
} else {
|
|
||||||
new_views.push_back (rtv);
|
|
||||||
track_views.push_back (rtv);
|
|
||||||
}
|
|
||||||
|
|
||||||
rtv->effective_gain_display ();
|
rtv->effective_gain_display ();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1725,7 +1725,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
|
||||||
void time_selection_changed ();
|
void time_selection_changed ();
|
||||||
void update_time_selection_display ();
|
void update_time_selection_display ();
|
||||||
void track_selection_changed ();
|
void track_selection_changed ();
|
||||||
bool non_master_track_selected ();
|
bool track_selected ();
|
||||||
void output_connection_mode_changed ();
|
void output_connection_mode_changed ();
|
||||||
void region_selection_changed ();
|
void region_selection_changed ();
|
||||||
sigc::connection editor_regions_selection_changed_connection;
|
sigc::connection editor_regions_selection_changed_connection;
|
||||||
|
|
|
||||||
|
|
@ -279,6 +279,7 @@ Editor::register_actions ()
|
||||||
|
|
||||||
act = reg_sens (editor_actions, "DeleteSelectedTracks", _("Delete Selected"), sigc::mem_fun(ARDOUR_UI::instance(), &ARDOUR_UI::delete_selected_tracks));
|
act = reg_sens (editor_actions, "DeleteSelectedTracks", _("Delete Selected"), sigc::mem_fun(ARDOUR_UI::instance(), &ARDOUR_UI::delete_selected_tracks));
|
||||||
ActionManager::track_selection_sensitive_actions.push_back (act);
|
ActionManager::track_selection_sensitive_actions.push_back (act);
|
||||||
|
ActionManager::actions_forbiden_for_master_track.push_back (act);
|
||||||
act = reg_sens (editor_actions, "move-selected-tracks-up", _("Move Up"), sigc::bind (sigc::mem_fun(*_routes, &EditorRoutes::move_selected_tracks), true));
|
act = reg_sens (editor_actions, "move-selected-tracks-up", _("Move Up"), sigc::bind (sigc::mem_fun(*_routes, &EditorRoutes::move_selected_tracks), true));
|
||||||
ActionManager::track_selection_sensitive_actions.push_back (act);
|
ActionManager::track_selection_sensitive_actions.push_back (act);
|
||||||
act = reg_sens (editor_actions, "move-selected-tracks-down", _("Move Down"), sigc::bind (sigc::mem_fun(*_routes, &EditorRoutes::move_selected_tracks), false));
|
act = reg_sens (editor_actions, "move-selected-tracks-down", _("Move Down"), sigc::bind (sigc::mem_fun(*_routes, &EditorRoutes::move_selected_tracks), false));
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,6 @@
|
||||||
|
|
||||||
#include "ardour/debug.h"
|
#include "ardour/debug.h"
|
||||||
#include "ardour/route.h"
|
#include "ardour/route.h"
|
||||||
#include "ardour/audio_track.h"
|
|
||||||
#include "ardour/midi_track.h"
|
#include "ardour/midi_track.h"
|
||||||
#include "ardour/session.h"
|
#include "ardour/session.h"
|
||||||
|
|
||||||
|
|
@ -1474,17 +1473,7 @@ EditorRoutes::move_selected_tracks (bool up)
|
||||||
++leading;
|
++leading;
|
||||||
|
|
||||||
while (leading != view_routes.end()) {
|
while (leading != view_routes.end()) {
|
||||||
|
if (_editor->selection->selected (leading->first)) {
|
||||||
//skip master track if it's in scope
|
|
||||||
bool master_track_in_scope = false;
|
|
||||||
AudioTrack* atr_l = dynamic_cast<AudioTrack*>(leading->second.get() );
|
|
||||||
AudioTrack* atr_t = dynamic_cast<AudioTrack*>(trailing->second.get() );
|
|
||||||
|
|
||||||
if ((atr_l && atr_l->is_master_track() ) || (atr_t && atr_t->is_master_track() ) ) {
|
|
||||||
master_track_in_scope = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_editor->selection->selected (leading->first) && !master_track_in_scope ) {
|
|
||||||
view_routes.insert (trailing, ViewRoute (leading->first, leading->second));
|
view_routes.insert (trailing, ViewRoute (leading->first, leading->second));
|
||||||
leading = view_routes.erase (leading);
|
leading = view_routes.erase (leading);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -1509,16 +1498,7 @@ EditorRoutes::move_selected_tracks (bool up)
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
|
||||||
//skip master track if it's in scope
|
if (_editor->selection->selected (leading->first)) {
|
||||||
bool master_track_in_scope = false;
|
|
||||||
AudioTrack* atr_l = dynamic_cast<AudioTrack*>(leading->second.get() );
|
|
||||||
AudioTrack* atr_t = dynamic_cast<AudioTrack*>(trailing->second.get() );
|
|
||||||
|
|
||||||
if ((atr_l && atr_l->is_master_track() ) || (atr_t && atr_t->is_master_track() ) ) {
|
|
||||||
master_track_in_scope = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_editor->selection->selected (leading->first) && !master_track_in_scope ) {
|
|
||||||
list<ViewRoute>::iterator tmp;
|
list<ViewRoute>::iterator tmp;
|
||||||
|
|
||||||
/* need to insert *after* trailing, not *before* it,
|
/* need to insert *after* trailing, not *before* it,
|
||||||
|
|
@ -1610,18 +1590,13 @@ EditorRoutes::move_selected_tracks_relatively (const PBD::ID& source_track_id, c
|
||||||
|
|
||||||
// selected tracks: add to the move list but if it's not a target
|
// selected tracks: add to the move list but if it's not a target
|
||||||
if (selection.selected(tv) &&
|
if (selection.selected(tv) &&
|
||||||
route->id() != target_track_id &&
|
route->id() != target_track_id ) {
|
||||||
!rtv->is_master_track() ) {
|
|
||||||
routes_to_move.push_back(route);
|
routes_to_move.push_back(route);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// master track should always be the first
|
// other tracks
|
||||||
if (rtv->is_master_track() ) {
|
routes.push_back (route);
|
||||||
routes.push_front(route);
|
|
||||||
} else {
|
|
||||||
routes.push_back (route);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RouteList::iterator insert_position;
|
RouteList::iterator insert_position;
|
||||||
|
|
|
||||||
|
|
@ -944,24 +944,11 @@ Editor::set_selected_regionview_from_map_event (GdkEventAny* /*ev*/, StreamView*
|
||||||
Otherwise return false
|
Otherwise return false
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
Editor::non_master_track_selected ()
|
Editor::track_selected ()
|
||||||
{
|
{
|
||||||
if( selection->tracks.empty() )
|
if( !selection->tracks.empty() )
|
||||||
return false;
|
|
||||||
|
|
||||||
if( selection->tracks.size() >=2 )
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
TimeAxisView* tv = selection->tracks.front();
|
|
||||||
RouteTimeAxisView* rtv = dynamic_cast <RouteTimeAxisView*> (tv);
|
|
||||||
if (rtv) {
|
|
||||||
AudioTrack* atr = dynamic_cast <AudioTrack*> (rtv->route().get() );
|
|
||||||
if (atr && _session && atr->is_master_track() )
|
|
||||||
return false;
|
|
||||||
else
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -970,26 +957,6 @@ Editor::track_selection_changed ()
|
||||||
{
|
{
|
||||||
if (!selection->tracks.empty() ) {
|
if (!selection->tracks.empty() ) {
|
||||||
set_selected_mixer_strip (*(selection->tracks.front()));
|
set_selected_mixer_strip (*(selection->tracks.front()));
|
||||||
// the commented out implementation shows master bus in the inspector
|
|
||||||
// when master track is selected. Requirements chenged for this case
|
|
||||||
/*
|
|
||||||
bool master_bus_set = false;
|
|
||||||
TimeAxisView* tv = selection->tracks.front();
|
|
||||||
RouteTimeAxisView* rtv = dynamic_cast <RouteTimeAxisView*> (tv);
|
|
||||||
if (rtv) {
|
|
||||||
AudioTrack* atr = dynamic_cast <AudioTrack*> (rtv->route().get() );
|
|
||||||
if (atr && _session && atr->is_master_track() ) {
|
|
||||||
TimeAxisView* master_bus_tv = axis_view_from_route (_session->master_out() );
|
|
||||||
if (master_bus_tv) {
|
|
||||||
set_selected_mixer_strip (*master_bus_tv);
|
|
||||||
master_bus_set = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!master_bus_set) {
|
|
||||||
set_selected_mixer_strip(*tv);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
|
@ -1024,6 +991,7 @@ Editor::track_selection_changed ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool master_track_selected = false;
|
||||||
RouteNotificationListPtr routes (new RouteNotificationList);
|
RouteNotificationListPtr routes (new RouteNotificationList);
|
||||||
|
|
||||||
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
|
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
|
||||||
|
|
@ -1048,14 +1016,27 @@ Editor::track_selection_changed ()
|
||||||
RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (*i);
|
RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (*i);
|
||||||
if (rtav) {
|
if (rtav) {
|
||||||
routes->push_back (rtav->route());
|
routes->push_back (rtav->route());
|
||||||
|
|
||||||
|
boost::shared_ptr<AudioTrack> atr = boost::dynamic_pointer_cast<AudioTrack> (rtav->route());
|
||||||
|
if (atr && atr->is_master_track() ) {
|
||||||
|
master_track_selected = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ActionManager::set_sensitive (ActionManager::track_selection_sensitive_actions, non_master_track_selected());
|
// check if we should enable track selectin sensitive actions
|
||||||
|
ActionManager::set_sensitive (ActionManager::track_selection_sensitive_actions, track_selected() );
|
||||||
|
|
||||||
|
// check if we should disable actions forbiden when only master track is selected
|
||||||
|
if( master_track_selected &&
|
||||||
|
track_selected() &&
|
||||||
|
selection->tracks.size() < 2 ) {
|
||||||
|
|
||||||
|
ActionManager::set_sensitive (ActionManager::actions_forbiden_for_master_track, false);
|
||||||
|
}
|
||||||
|
|
||||||
/* notify control protocols */
|
/* notify control protocols */
|
||||||
|
|
||||||
ControlProtocol::TrackSelectionChanged (routes);
|
ControlProtocol::TrackSelectionChanged (routes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -172,12 +172,7 @@ RouteTimeAxisView::set_route (boost::shared_ptr<Route> rt)
|
||||||
track()->PlaylistChanged.connect (*this, invalidator (*this), ui_bind(&RouteTimeAxisView::update_playlist_tip, this), gui_context());
|
track()->PlaylistChanged.connect (*this, invalidator (*this), ui_bind(&RouteTimeAxisView::update_playlist_tip, this), gui_context());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_master_track() ) {
|
enable_header_dnd ();
|
||||||
// do not display number for master track
|
|
||||||
_number_is_hidden = true;
|
|
||||||
} else {
|
|
||||||
enable_header_dnd ();
|
|
||||||
}
|
|
||||||
|
|
||||||
playlist_button.set_visible(is_track() && track()->mode() == ARDOUR::Normal);
|
playlist_button.set_visible(is_track() && track()->mode() == ARDOUR::Normal);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -385,11 +385,6 @@ Session::Session (AudioEngine &eng,
|
||||||
|
|
||||||
EngineStateController::instance()->set_session(this);
|
EngineStateController::instance()->set_session(this);
|
||||||
|
|
||||||
// Waves Tracks: always create master track
|
|
||||||
if ( ARDOUR::Profile->get_trx () ) {
|
|
||||||
create_master_track();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Waves Tracks: fill session with tracks basing on the amount of inputs.
|
/* Waves Tracks: fill session with tracks basing on the amount of inputs.
|
||||||
* each available input must have corresponding track when session starts.
|
* each available input must have corresponding track when session starts.
|
||||||
*/
|
*/
|
||||||
|
|
@ -431,6 +426,11 @@ Session::Session (AudioEngine &eng,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Waves Tracks: always create master track at the end
|
||||||
|
if ( ARDOUR::Profile->get_trx () ) {
|
||||||
|
create_master_track();
|
||||||
|
}
|
||||||
|
|
||||||
_is_new = false;
|
_is_new = false;
|
||||||
|
|
||||||
SessionLoaded();
|
SessionLoaded();
|
||||||
|
|
@ -2326,35 +2326,28 @@ Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool r
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*rIter == _master_track && !reconnect_master ) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (reconnectIputs) {
|
if (reconnectIputs) {
|
||||||
(*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
|
(*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
|
||||||
|
|
||||||
if (*rIter != _master_track) { // do not connect master to phys inputs ever
|
for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
|
||||||
for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
|
|
||||||
|
|
||||||
if (Config->get_input_auto_connect() & AutoConnectPhysical) {
|
if (Config->get_input_auto_connect() & AutoConnectPhysical) {
|
||||||
|
|
||||||
if ( input_n == physinputs.size() ) {
|
if ( input_n == physinputs.size() ) {
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
string port = physinputs[input_n];
|
|
||||||
|
|
||||||
if (port.empty() ) {
|
|
||||||
error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
|
|
||||||
}
|
|
||||||
|
|
||||||
//GZ: check this; could be heavy
|
|
||||||
(*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
|
|
||||||
++input_n;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string port = physinputs[input_n];
|
||||||
|
|
||||||
|
if (port.empty() ) {
|
||||||
|
error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
//GZ: check this; could be heavy
|
||||||
|
(*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
|
||||||
|
++input_n;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reconnectOutputs) {
|
if (reconnectOutputs) {
|
||||||
|
|
@ -2385,16 +2378,10 @@ Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool r
|
||||||
error << error << "Master bus is not available" << endmsg;
|
error << error << "Master bus is not available" << endmsg;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_master_track) {
|
|
||||||
error << error << "Master track is not available" << endmsg;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
|
for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
|
||||||
if ((Config->get_output_auto_connect() & AutoConnectPhysical) &&
|
if ((Config->get_output_auto_connect() & AutoConnectPhysical) ) {
|
||||||
*rIter != _master_track ) {
|
|
||||||
|
|
||||||
if ( output_n == physoutputs.size() ) {
|
if ( output_n == physoutputs.size() ) {
|
||||||
break;
|
break;
|
||||||
|
|
@ -2427,17 +2414,6 @@ Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool r
|
||||||
//GZ: check this; could be heavy
|
//GZ: check this; could be heavy
|
||||||
(*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
|
(*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
|
||||||
|
|
||||||
// connect to master track
|
|
||||||
if (*rIter != _master_track) { // do not connect Master Track to itself
|
|
||||||
port = _master_track->input()->ports().port(DataType::AUDIO, route_output_n)->name();
|
|
||||||
|
|
||||||
if (port.empty() ) {
|
|
||||||
error << "MasterTrack Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
|
|
||||||
}
|
|
||||||
|
|
||||||
//GZ: check this; could be heavy
|
|
||||||
(*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2678,8 +2654,8 @@ Session::create_master_track ()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// master track I/O is stereo
|
||||||
uint32_t input_channels = _master_out->n_inputs().get(DataType::AUDIO);
|
uint32_t input_channels = _master_out->n_inputs().get(DataType::AUDIO);
|
||||||
// use the same amount of autputs because master track will be connected to master bus
|
|
||||||
uint32_t output_channels = input_channels;
|
uint32_t output_channels = input_channels;
|
||||||
|
|
||||||
std::string track_name = "Master Track";
|
std::string track_name = "Master Track";
|
||||||
|
|
@ -2688,7 +2664,7 @@ Session::create_master_track ()
|
||||||
boost::shared_ptr<AudioTrack> track;
|
boost::shared_ptr<AudioTrack> track;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
track.reset (new AudioTrack (*this, track_name, Route::MasterTrack, Normal));
|
track.reset (new AudioTrack (*this, track_name, Route::MasterTrack, Normal) );
|
||||||
|
|
||||||
if (track->init ()) {
|
if (track->init ()) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue