2014-05-27 21:46:05 -04:00
/*
2014-04-29 01:07:37 -05:00
Copyright ( C ) 2014 Waves Audio Ltd .
2014-05-27 21:46:05 -04:00
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include <stdlib.h>
2014-05-15 06:53:24 -05:00
# include <string>
2014-05-27 21:46:05 -04:00
# include "tracks_control_panel.h"
# include "waves_button.h"
# include "pbd/unwind.h"
# include <gtkmm2ext/utils.h>
2014-05-19 18:04:58 -05:00
# include "ardour/engine_state_controller.h"
2014-04-16 04:41:22 -05:00
# include "ardour/rc_configuration.h"
2014-05-19 18:04:58 -05:00
2014-06-06 05:01:31 -05:00
# include "ardour/utils.h"
2014-05-27 21:46:05 -04:00
# include "ardour_ui.h"
# include "gui_thread.h"
# include "utils.h"
# include "i18n.h"
2014-05-01 06:06:16 -05:00
# include "pbd/convert.h"
2014-05-27 21:46:05 -04:00
2014-05-22 03:10:26 -05:00
# include "open_file_dialog_proxy.h"
2014-05-20 05:29:32 -05:00
2014-05-13 07:47:00 -05:00
using namespace ARDOUR ;
2014-05-27 21:46:05 -04:00
using namespace Gtk ;
using namespace Gtkmm2ext ;
using namespace PBD ;
using namespace Glib ;
# define dbg_msg(a) MessageDialog (a, PROGRAM_NAME).run();
2014-05-22 08:42:52 -05:00
namespace {
2014-06-06 05:01:31 -05:00
2014-06-23 11:59:59 +03:00
static const char * audio_capture_name_prefix = " system:capture: " ;
static const char * audio_playback_name_prefix = " system:playback: " ;
2014-06-03 02:00:17 -05:00
static const char * midi_port_name_prefix = " system_midi: " ;
static const char * midi_capture_suffix = " capture " ;
static const char * midi_playback_suffix = " playback " ;
struct MidiDeviceDescriptor {
std : : string name ;
std : : string capture_name ;
bool capture_active ;
std : : string playback_name ;
bool playback_active ;
MidiDeviceDescriptor ( const std : : string & name ) :
name ( name ) ,
capture_name ( " " ) ,
capture_active ( false ) ,
playback_name ( " " ) ,
playback_active ( false )
{ }
bool operator = = ( const MidiDeviceDescriptor & rhs ) {
return name = = rhs . name ;
}
} ;
typedef std : : vector < MidiDeviceDescriptor > MidiDeviceDescriptorVec ;
2014-05-22 08:42:52 -05:00
}
2014-05-27 21:46:05 -04:00
void
TracksControlPanel : : init ( )
{
2014-05-01 06:06:16 -05:00
_ok_button . signal_clicked . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_ok ) ) ;
_cancel_button . signal_clicked . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_cancel ) ) ;
_apply_button . signal_clicked . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_apply ) ) ;
_audio_settings_tab_button . signal_clicked . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_audio_settings ) ) ;
_midi_settings_tab_button . signal_clicked . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_midi_settings ) ) ;
_session_settings_tab_button . signal_clicked . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_session_settings ) ) ;
_control_panel_button . signal_clicked . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_control_panel ) ) ;
2014-04-16 04:41:22 -05:00
2014-05-26 08:54:26 -05:00
_all_inputs_on_button . signal_clicked . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_all_inputs_on_button ) ) ;
_all_inputs_off_button . signal_clicked . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_all_inputs_off_button ) ) ;
_all_outputs_on_button . signal_clicked . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_all_outputs_on_button ) ) ;
_all_outputs_off_button . signal_clicked . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_all_outputs_off_button ) ) ;
2014-05-01 06:06:16 -05:00
_multi_out_button . signal_clicked . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_multi_out ) ) ;
_stereo_out_button . signal_clicked . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_stereo_out ) ) ;
2014-04-16 04:41:22 -05:00
2014-05-21 17:41:12 -05:00
_browse_button . signal_clicked . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_browse_button ) ) ;
2014-05-13 07:47:00 -05:00
2014-05-19 18:04:58 -05:00
EngineStateController : : instance ( ) - > EngineRunning . connect ( running_connection , MISSING_INVALIDATOR , boost : : bind ( & TracksControlPanel : : engine_running , this ) , gui_context ( ) ) ;
EngineStateController : : instance ( ) - > EngineStopped . connect ( stopped_connection , MISSING_INVALIDATOR , boost : : bind ( & TracksControlPanel : : engine_stopped , this ) , gui_context ( ) ) ;
EngineStateController : : instance ( ) - > EngineHalted . connect ( stopped_connection , MISSING_INVALIDATOR , boost : : bind ( & TracksControlPanel : : engine_stopped , this ) , gui_context ( ) ) ;
2014-05-27 21:46:05 -04:00
2014-05-19 18:04:58 -05:00
/* Subscribe for udpates from EngineStateController */
2014-05-29 04:22:08 -05:00
EngineStateController : : instance ( ) - > PortRegistrationChanged . connect ( update_connections , MISSING_INVALIDATOR , boost : : bind ( & TracksControlPanel : : on_port_registration_update , this ) , gui_context ( ) ) ;
2014-05-15 07:57:07 -05:00
EngineStateController : : instance ( ) - > BufferSizeChanged . connect ( update_connections , MISSING_INVALIDATOR , boost : : bind ( & TracksControlPanel : : on_buffer_size_update , this ) , gui_context ( ) ) ;
EngineStateController : : instance ( ) - > DeviceListChanged . connect ( update_connections , MISSING_INVALIDATOR , boost : : bind ( & TracksControlPanel : : on_device_list_update , this , _1 ) , gui_context ( ) ) ;
2014-06-03 02:00:17 -05:00
EngineStateController : : instance ( ) - > InputConfigChanged . connect ( update_connections , MISSING_INVALIDATOR , boost : : bind ( & TracksControlPanel : : on_audio_input_configuration_changed , this ) , gui_context ( ) ) ;
EngineStateController : : instance ( ) - > OutputConfigChanged . connect ( update_connections , MISSING_INVALIDATOR , boost : : bind ( & TracksControlPanel : : on_audio_output_configuration_changed , this ) , gui_context ( ) ) ;
EngineStateController : : instance ( ) - > MIDIInputConfigChanged . connect ( update_connections , MISSING_INVALIDATOR , boost : : bind ( & TracksControlPanel : : on_midi_input_configuration_changed , this ) , gui_context ( ) ) ;
EngineStateController : : instance ( ) - > MIDIOutputConfigChanged . connect ( update_connections , MISSING_INVALIDATOR , boost : : bind ( & TracksControlPanel : : on_midi_output_configuration_changed , this ) , gui_context ( ) ) ;
2014-05-19 18:04:58 -05:00
/* Global configuration parameters update */
2014-05-15 10:41:30 -05:00
Config - > ParameterChanged . connect ( update_connections , MISSING_INVALIDATOR , boost : : bind ( & TracksControlPanel : : on_parameter_changed , this , _1 ) , gui_context ( ) ) ;
2014-05-01 06:06:16 -05:00
_engine_combo . signal_changed ( ) . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : engine_changed ) ) ;
2014-05-15 06:53:24 -05:00
_device_combo . signal_changed ( ) . connect ( sigc : : bind ( sigc : : mem_fun ( * this , & TracksControlPanel : : device_changed ) , true ) ) ;
2014-05-01 06:06:16 -05:00
_sample_rate_combo . signal_changed ( ) . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : sample_rate_changed ) ) ;
_buffer_size_combo . signal_changed ( ) . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : buffer_size_changed ) ) ;
2014-05-27 21:46:05 -04:00
2014-06-02 10:08:12 -05:00
_name_tracks_after_driver . signal_clicked . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_name_tracks_after_driver ) ) ;
_reset_tracks_name_to_default . signal_clicked . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_reset_tracks_name_to_default ) ) ;
2014-06-10 04:27:03 -05:00
_control_panel_button . signal_clicked . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_control_panel_button ) ) ;
2014-06-06 08:45:01 -05:00
_yes_button . signal_clicked . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_yes_button ) ) ;
_no_button . signal_clicked . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_no_button ) ) ;
_yes_button . set_visible ( false ) ;
_no_button . set_visible ( false ) ;
2014-06-02 10:08:12 -05:00
2014-05-27 21:46:05 -04:00
populate_engine_combo ( ) ;
2014-05-13 07:47:00 -05:00
populate_output_mode ( ) ;
2014-05-19 18:04:58 -05:00
populate_input_channels ( ) ;
populate_output_channels ( ) ;
2014-06-03 08:26:32 -05:00
populate_midi_ports ( ) ;
2014-05-21 06:44:57 -05:00
populate_default_session_path ( ) ;
2014-05-19 18:04:58 -05:00
2014-05-01 06:06:16 -05:00
_audio_settings_tab_button . set_active ( true ) ;
2014-05-27 21:46:05 -04:00
}
2014-06-03 02:00:17 -05:00
DeviceConnectionControl & TracksControlPanel : : add_device_capture_control ( std : : string port_name , bool active , uint16_t capture_number , std : : string track_name )
2014-05-06 03:21:18 -05:00
{
2014-06-03 02:00:17 -05:00
std : : string device_capture_name ( " " ) ;
2014-06-23 11:59:59 +03:00
std : : string pattern ( audio_capture_name_prefix ) ;
2014-06-03 02:00:17 -05:00
remove_pattern_from_string ( port_name , pattern , device_capture_name ) ;
2014-05-22 08:42:52 -05:00
2014-06-03 02:00:17 -05:00
DeviceConnectionControl & capture_control = * manage ( new DeviceConnectionControl ( device_capture_name , active , capture_number , track_name ) ) ;
2014-05-22 08:42:52 -05:00
2014-06-03 02:00:17 -05:00
char * id_str = new char [ port_name . length ( ) + 1 ] ;
std : : strcpy ( id_str , port_name . c_str ( ) ) ;
2014-05-22 08:42:52 -05:00
capture_control . set_data ( DeviceConnectionControl : : id_name , id_str ) ;
_device_capture_list . pack_start ( capture_control , false , false ) ;
2014-05-06 03:21:18 -05:00
capture_control . signal_active_changed . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_capture_active_changed ) ) ;
return capture_control ;
}
2014-06-03 02:00:17 -05:00
DeviceConnectionControl & TracksControlPanel : : add_device_playback_control ( std : : string port_name , bool active , uint16_t playback_number )
2014-05-06 03:21:18 -05:00
{
2014-06-03 02:00:17 -05:00
std : : string device_playback_name ( " " ) ;
2014-06-23 11:59:59 +03:00
std : : string pattern ( audio_playback_name_prefix ) ;
2014-06-03 02:00:17 -05:00
remove_pattern_from_string ( port_name , pattern , device_playback_name ) ;
2014-05-22 08:42:52 -05:00
2014-06-03 02:00:17 -05:00
DeviceConnectionControl & playback_control = * manage ( new DeviceConnectionControl ( device_playback_name , active , playback_number ) ) ;
2014-05-22 08:42:52 -05:00
2014-06-03 02:00:17 -05:00
char * id_str = new char [ port_name . length ( ) + 1 ] ;
std : : strcpy ( id_str , port_name . c_str ( ) ) ;
2014-05-22 08:42:52 -05:00
playback_control . set_data ( DeviceConnectionControl : : id_name , id_str ) ;
2014-05-06 03:21:18 -05:00
_device_playback_list . pack_start ( playback_control , false , false ) ;
playback_control . signal_active_changed . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_playback_active_changed ) ) ;
return playback_control ;
}
2014-06-03 02:00:17 -05:00
MidiDeviceConnectionControl & TracksControlPanel : : add_midi_device_control ( const std : : string & midi_device_name ,
const std : : string & capture_name , bool capture_active ,
const std : : string & playback_name , bool playback_active )
2014-05-12 09:21:16 -05:00
{
2014-06-03 02:00:17 -05:00
MidiDeviceConnectionControl & midi_device_control = * manage ( new MidiDeviceConnectionControl ( midi_device_name , ! capture_name . empty ( ) , capture_active , ! playback_name . empty ( ) , playback_active ) ) ;
if ( ! capture_name . empty ( ) ) {
char * capture_id_str = new char [ capture_name . length ( ) + 1 ] ;
std : : strcpy ( capture_id_str , capture_name . c_str ( ) ) ;
midi_device_control . set_data ( MidiDeviceConnectionControl : : capture_id_name , capture_id_str ) ;
}
if ( ! playback_name . empty ( ) ) {
char * playback_id_str = new char [ playback_name . length ( ) + 1 ] ;
std : : strcpy ( playback_id_str , playback_name . c_str ( ) ) ;
midi_device_control . set_data ( MidiDeviceConnectionControl : : playback_id_name , playback_id_str ) ;
}
_midi_device_list . pack_start ( midi_device_control , false , false ) ;
midi_device_control . signal_capture_active_changed . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_midi_capture_active_changed ) ) ;
midi_device_control . signal_playback_active_changed . connect ( sigc : : mem_fun ( * this , & TracksControlPanel : : on_midi_playback_active_changed ) ) ;
return midi_device_control ;
2014-05-12 09:21:16 -05:00
}
2014-05-21 06:44:57 -05:00
void
TracksControlPanel : : populate_default_session_path ( )
{
std : : string std_path = Config - > get_default_open_path ( ) ;
bool folderExist = Glib : : file_test ( std_path , FILE_TEST_EXISTS ) ;
if ( ! folderExist )
Config - > set_default_open_path ( Glib : : get_home_dir ( ) ) ;
_default_open_path . set_text ( Config - > get_default_open_path ( ) ) ;
}
2014-05-27 21:46:05 -04:00
void
TracksControlPanel : : populate_engine_combo ( )
{
if ( _ignore_changes ) {
return ;
}
2014-05-01 06:06:16 -05:00
std : : vector < std : : string > strings ;
2014-05-13 07:47:00 -05:00
std : : vector < const AudioBackendInfo * > backends ;
EngineStateController : : instance ( ) - > available_backends ( backends ) ;
2014-05-27 21:46:05 -04:00
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 ( ) ;
}
2014-05-13 07:47:00 -05:00
for ( std : : vector < const AudioBackendInfo * > : : const_iterator b = backends . begin ( ) ; b ! = backends . end ( ) ; + + b ) {
2014-05-27 21:46:05 -04:00
strings . push_back ( ( * b ) - > name ) ;
}
{
// set _ignore_changes flag to ignore changes in combo-box callbacks
PBD : : Unwinder < uint32_t > protect_ignore_changes ( _ignore_changes , _ignore_changes + 1 ) ;
2014-05-01 06:06:16 -05:00
set_popdown_strings ( _engine_combo , strings ) ;
_engine_combo . set_sensitive ( strings . size ( ) > 1 ) ;
2014-05-27 21:46:05 -04:00
}
if ( ! strings . empty ( ) )
{
2014-05-13 07:47:00 -05:00
_engine_combo . set_active_text ( EngineStateController : : instance ( ) - > get_current_backend_name ( ) ) ;
2014-05-27 21:46:05 -04:00
}
}
void
TracksControlPanel : : populate_device_combo ( )
{
2014-05-13 07:47:00 -05:00
std : : vector < AudioBackend : : DeviceStatus > all_devices ;
EngineStateController : : instance ( ) - > enumerate_devices ( all_devices ) ;
2014-05-27 21:46:05 -04:00
2014-05-13 07:47:00 -05:00
std : : vector < std : : string > available_devices ;
2014-05-27 21:46:05 -04:00
2014-05-13 07:47:00 -05:00
for ( std : : vector < AudioBackend : : DeviceStatus > : : const_iterator i = all_devices . begin ( ) ; i ! = all_devices . end ( ) ; + + i ) {
2014-05-27 21:46:05 -04:00
available_devices . push_back ( i - > name ) ;
}
{
// set _ignore_changes flag to ignore changes in combo-box callbacks
PBD : : Unwinder < uint32_t > protect_ignore_changes ( _ignore_changes , _ignore_changes + 1 ) ;
2014-05-01 06:06:16 -05:00
set_popdown_strings ( _device_combo , available_devices ) ;
_device_combo . set_sensitive ( available_devices . size ( ) > 1 ) ;
2014-05-15 06:53:24 -05:00
if ( ! available_devices . empty ( ) ) {
_device_combo . set_active_text ( EngineStateController : : instance ( ) - > get_current_device_name ( ) ) ;
}
}
if ( ! available_devices . empty ( ) ) {
device_changed ( false ) ;
}
2014-05-27 21:46:05 -04:00
}
void
TracksControlPanel : : populate_sample_rate_combo ( )
{
2014-05-13 07:47:00 -05:00
std : : vector < float > sample_rates ;
EngineStateController : : instance ( ) - > available_sample_rates_for_current_device ( sample_rates ) ;
2014-05-27 21:46:05 -04:00
std : : vector < std : : string > s ;
2014-05-13 07:47:00 -05:00
for ( std : : vector < float > : : const_iterator x = sample_rates . begin ( ) ; x ! = sample_rates . end ( ) ; + + x ) {
2014-05-27 21:46:05 -04:00
s . push_back ( rate_as_string ( * x ) ) ;
}
{
// set _ignore_changes flag to ignore changes in combo-box callbacks
PBD : : Unwinder < uint32_t > protect_ignore_changes ( _ignore_changes , _ignore_changes + 1 ) ;
2014-05-01 06:06:16 -05:00
set_popdown_strings ( _sample_rate_combo , s ) ;
_sample_rate_combo . set_sensitive ( s . size ( ) > 1 ) ;
2014-05-27 21:46:05 -04:00
}
if ( ! s . empty ( ) ) {
2014-05-13 07:47:00 -05:00
std : : string active_sr = rate_as_string ( EngineStateController : : instance ( ) - > get_current_sample_rate ( ) ) ;
2014-05-01 06:06:16 -05:00
_sample_rate_combo . set_active_text ( active_sr ) ;
2014-05-27 21:46:05 -04:00
}
}
void
TracksControlPanel : : populate_buffer_size_combo ( )
{
2014-05-13 07:47:00 -05:00
std : : vector < std : : string > s ;
std : : vector < pframes_t > buffer_sizes ;
2014-05-27 21:46:05 -04:00
2014-05-13 07:47:00 -05:00
EngineStateController : : instance ( ) - > available_buffer_sizes_for_current_device ( buffer_sizes ) ;
for ( std : : vector < pframes_t > : : const_iterator x = buffer_sizes . begin ( ) ; x ! = buffer_sizes . end ( ) ; + + x ) {
2014-05-27 21:46:05 -04:00
s . push_back ( bufsize_as_string ( * x ) ) ;
}
{
// set _ignore_changes flag to ignore changes in combo-box callbacks
PBD : : Unwinder < uint32_t > protect_ignore_changes ( _ignore_changes , _ignore_changes + 1 ) ;
2014-05-01 06:06:16 -05:00
set_popdown_strings ( _buffer_size_combo , s ) ;
_buffer_size_combo . set_sensitive ( s . size ( ) > 1 ) ;
2014-05-27 21:46:05 -04:00
}
if ( ! s . empty ( ) ) {
2014-05-13 07:47:00 -05:00
std : : string active_bs = bufsize_as_string ( EngineStateController : : instance ( ) - > get_current_buffer_size ( ) ) ;
2014-05-01 06:06:16 -05:00
_buffer_size_combo . set_active_text ( active_bs ) ;
2014-05-27 21:46:05 -04:00
}
}
2014-05-13 07:47:00 -05:00
void
TracksControlPanel : : populate_output_mode ( )
{
_multi_out_button . set_active ( Config - > get_output_auto_connect ( ) & AutoConnectPhysical ) ;
_stereo_out_button . set_active ( Config - > get_output_auto_connect ( ) & AutoConnectMaster ) ;
2014-05-26 08:54:26 -05:00
_all_outputs_on_button . set_sensitive ( Config - > get_output_auto_connect ( ) & AutoConnectPhysical ) ;
_all_outputs_off_button . set_sensitive ( Config - > get_output_auto_connect ( ) & AutoConnectPhysical ) ;
2014-05-13 07:47:00 -05:00
}
2014-05-19 18:04:58 -05:00
2014-05-27 21:46:05 -04:00
void
2014-05-19 18:04:58 -05:00
TracksControlPanel : : populate_input_channels ( )
2014-05-27 21:46:05 -04:00
{
2014-05-19 18:04:58 -05:00
cleanup_input_channels_list ( ) ;
// process captures (inputs)
2014-06-03 08:26:32 -05:00
std : : vector < EngineStateController : : PortState > input_states ;
2014-05-19 18:04:58 -05:00
EngineStateController : : instance ( ) - > get_physical_audio_input_states ( input_states ) ;
2014-06-03 08:26:32 -05:00
std : : vector < EngineStateController : : PortState > : : const_iterator input_iter ;
2014-05-19 18:04:58 -05:00
uint16_t number_count = 1 ;
for ( input_iter = input_states . begin ( ) ; input_iter ! = input_states . end ( ) ; + + input_iter ) {
uint16_t number = DeviceConnectionControl : : NoNumber ;
2014-05-26 07:39:06 -05:00
std : : string track_name ;
2014-05-22 08:42:52 -05:00
2014-05-19 18:04:58 -05:00
if ( input_iter - > active ) {
2014-05-26 07:39:06 -05:00
std : : string port_name ( " " ) ;
2014-06-23 11:59:59 +03:00
std : : string pattern ( audio_capture_name_prefix ) ;
2014-05-26 07:39:06 -05:00
remove_pattern_from_string ( input_iter - > name , pattern , port_name ) ;
2014-05-19 18:04:58 -05:00
number = number_count + + ;
if ( Config - > get_tracks_auto_naming ( ) & UseDefaultNames ) {
2014-05-26 07:39:06 -05:00
track_name = string_compose ( " %1 %2 " , Session : : default_trx_track_name_pattern , number ) ;
2014-05-19 18:04:58 -05:00
} else if ( Config - > get_tracks_auto_naming ( ) & NameAfterDriver ) {
2014-05-20 10:08:20 -05:00
track_name = port_name ;
2014-05-19 18:04:58 -05:00
}
}
2014-05-22 08:42:52 -05:00
add_device_capture_control ( input_iter - > name , input_iter - > active , number , track_name ) ;
2014-05-28 09:55:20 -05:00
}
_all_inputs_on_button . set_sensitive ( ! input_states . empty ( ) ) ;
_all_inputs_off_button . set_sensitive ( ! input_states . empty ( ) ) ;
2014-05-19 18:04:58 -05:00
}
void
TracksControlPanel : : populate_output_channels ( )
{
cleanup_output_channels_list ( ) ;
// process captures (outputs)
2014-06-03 08:26:32 -05:00
std : : vector < EngineStateController : : PortState > output_states ;
2014-05-19 18:04:58 -05:00
EngineStateController : : instance ( ) - > get_physical_audio_output_states ( output_states ) ;
2014-06-03 08:26:32 -05:00
std : : vector < EngineStateController : : PortState > : : const_iterator output_iter ;
2014-05-19 18:04:58 -05:00
uint16_t number_count = 1 ;
for ( output_iter = output_states . begin ( ) ; output_iter ! = output_states . end ( ) ; + + output_iter ) {
uint16_t number = DeviceConnectionControl : : NoNumber ;
if ( output_iter - > active ) {
number = number_count + + ;
}
2014-05-22 08:42:52 -05:00
add_device_playback_control ( output_iter - > name , output_iter - > active , number ) ;
2014-05-19 18:04:58 -05:00
}
2014-05-28 09:55:20 -05:00
bool stereo_out_disabled = ( Config - > get_output_auto_connect ( ) & AutoConnectPhysical ) ;
_all_outputs_on_button . set_sensitive ( ! output_states . empty ( ) & & stereo_out_disabled ) ;
_all_outputs_off_button . set_sensitive ( ! output_states . empty ( ) & & stereo_out_disabled ) ;
2014-05-19 18:04:58 -05:00
}
2014-06-03 02:00:17 -05:00
void
2014-06-03 08:26:32 -05:00
TracksControlPanel : : populate_midi_ports ( )
2014-05-19 18:04:58 -05:00
{
2014-06-03 02:00:17 -05:00
cleanup_midi_device_list ( ) ;
2014-05-19 18:04:58 -05:00
2014-06-03 08:26:32 -05:00
std : : vector < EngineStateController : : PortState > midi_input_states , midi_output_states ;
2014-06-03 02:00:17 -05:00
EngineStateController : : instance ( ) - > get_physical_midi_input_states ( midi_input_states ) ;
EngineStateController : : instance ( ) - > get_physical_midi_output_states ( midi_output_states ) ;
// now group corresponding inputs and outputs into a vector of midi device descriptors
MidiDeviceDescriptorVec midi_device_descriptors ;
2014-06-03 08:26:32 -05:00
std : : vector < EngineStateController : : PortState > : : const_iterator state_iter ;
2014-06-03 02:00:17 -05:00
// process inputs
for ( state_iter = midi_input_states . begin ( ) ; state_iter ! = midi_input_states . end ( ) ; + + state_iter ) {
// strip the device name from input port name
std : : string device_name ( " " ) ;
remove_pattern_from_string ( state_iter - > name , midi_port_name_prefix , device_name ) ;
remove_pattern_from_string ( device_name , midi_capture_suffix , device_name ) ;
MidiDeviceDescriptor device_descriptor ( device_name ) ;
device_descriptor . capture_name = state_iter - > name ;
device_descriptor . capture_active = state_iter - > active ;
midi_device_descriptors . push_back ( device_descriptor ) ;
}
// process outputs
for ( state_iter = midi_output_states . begin ( ) ; state_iter ! = midi_output_states . end ( ) ; + + state_iter ) {
// strip the device name from input port name
std : : string device_name ( " " ) ;
remove_pattern_from_string ( state_iter - > name , midi_port_name_prefix , device_name ) ;
remove_pattern_from_string ( device_name , midi_playback_suffix , device_name ) ;
// check if we already have descriptor for this device
MidiDeviceDescriptor device_descriptor ( device_name ) ;
MidiDeviceDescriptorVec : : iterator found_iter ;
found_iter = std : : find ( midi_device_descriptors . begin ( ) , midi_device_descriptors . end ( ) , device_descriptor ) ;
if ( found_iter ! = midi_device_descriptors . end ( ) ) {
found_iter - > playback_name = state_iter - > name ;
found_iter - > playback_active = state_iter - > active ;
} else {
device_descriptor . capture_name . clear ( ) ;
device_descriptor . playback_name = state_iter - > name ;
device_descriptor . playback_active = state_iter - > active ;
midi_device_descriptors . push_back ( device_descriptor ) ;
}
}
2014-05-19 18:04:58 -05:00
2014-06-03 02:00:17 -05:00
// now add midi device controls
MidiDeviceDescriptorVec : : iterator iter ;
for ( iter = midi_device_descriptors . begin ( ) ; iter ! = midi_device_descriptors . end ( ) ; + + iter ) {
2014-06-03 10:30:06 -05:00
add_midi_device_control ( iter - > name , iter - > capture_name , iter - > capture_active ,
iter - > playback_name , iter - > playback_active ) ;
2014-06-03 02:00:17 -05:00
}
2014-05-19 18:04:58 -05:00
}
2014-05-12 09:21:16 -05:00
2014-05-19 18:04:58 -05:00
void
TracksControlPanel : : cleanup_input_channels_list ( )
{
std : : vector < Gtk : : Widget * > capture_controls = _device_capture_list . get_children ( ) ;
while ( capture_controls . size ( ) ! = 0 ) {
Gtk : : Widget * item = capture_controls . back ( ) ;
2014-05-22 08:42:52 -05:00
DeviceConnectionControl * control = dynamic_cast < DeviceConnectionControl * > ( item ) ;
if ( control ) {
control - > remove_data ( DeviceConnectionControl : : id_name ) ;
}
2014-05-19 18:04:58 -05:00
capture_controls . pop_back ( ) ;
_device_capture_list . remove ( * item ) ;
delete item ;
}
}
void
TracksControlPanel : : cleanup_output_channels_list ( )
{
std : : vector < Gtk : : Widget * > playback_controls = _device_playback_list . get_children ( ) ;
while ( playback_controls . size ( ) ! = 0 ) {
Gtk : : Widget * item = playback_controls . back ( ) ;
2014-05-22 08:42:52 -05:00
DeviceConnectionControl * control = dynamic_cast < DeviceConnectionControl * > ( item ) ;
if ( control ) {
control - > remove_data ( DeviceConnectionControl : : id_name ) ;
}
2014-05-19 18:04:58 -05:00
playback_controls . pop_back ( ) ;
_device_capture_list . remove ( * item ) ;
delete item ;
}
}
2014-06-03 02:00:17 -05:00
void
TracksControlPanel : : cleanup_midi_device_list ( )
{
std : : vector < Gtk : : Widget * > midi_device_controls = _midi_device_list . get_children ( ) ;
while ( midi_device_controls . size ( ) ! = 0 ) {
Gtk : : Widget * item = midi_device_controls . back ( ) ;
MidiDeviceConnectionControl * control = dynamic_cast < MidiDeviceConnectionControl * > ( item ) ;
if ( control ) {
control - > remove_data ( MidiDeviceConnectionControl : : capture_id_name ) ;
2014-06-03 06:11:32 -05:00
control - > remove_data ( MidiDeviceConnectionControl : : playback_id_name ) ;
2014-06-03 02:00:17 -05:00
}
midi_device_controls . pop_back ( ) ;
_midi_device_list . remove ( * item ) ;
delete item ;
}
}
2014-05-19 18:04:58 -05:00
void
TracksControlPanel : : on_control_panel ( WavesButton * )
{
2014-05-27 21:46:05 -04:00
}
void TracksControlPanel : : engine_changed ( )
{
if ( _ignore_changes ) {
return ;
}
2014-05-13 07:47:00 -05:00
std : : string backend_name = _engine_combo . get_active_text ( ) ;
if ( EngineStateController : : instance ( ) - > set_new_backend_as_current ( backend_name ) )
2014-05-27 21:46:05 -04:00
{
2014-05-13 07:47:00 -05:00
_have_control = EngineStateController : : instance ( ) - > is_setup_required ( ) ;
populate_device_combo ( ) ;
return ;
2014-05-27 21:46:05 -04:00
}
2014-05-13 07:47:00 -05:00
std : : cerr < < " \t failed to set backend [ " < < backend_name < < " ] \n " ;
2014-05-27 21:46:05 -04:00
}
2014-05-15 06:53:24 -05:00
void TracksControlPanel : : device_changed ( bool show_confirm_dial /*=true*/ )
2014-05-27 21:46:05 -04:00
{
if ( _ignore_changes ) {
return ;
}
2014-05-13 07:47:00 -05:00
std : : string device_name = _device_combo . get_active_text ( ) ;
2014-05-15 06:53:24 -05:00
if ( show_confirm_dial )
{
2014-05-16 03:26:17 -05:00
std : : string message = _ ( " Would you like to switch to " ) + device_name ;
2014-05-15 06:53:24 -05:00
MessageDialog msg ( message ,
false ,
Gtk : : MESSAGE_WARNING ,
Gtk : : BUTTONS_YES_NO ,
true ) ;
msg . set_position ( Gtk : : WIN_POS_MOUSE ) ;
2014-06-02 10:08:12 -05:00
msg . set_keep_above ( true ) ;
2014-05-21 08:27:14 -05:00
2014-05-15 06:53:24 -05:00
switch ( msg . run ( ) ) {
case RESPONSE_NO :
// set _ignore_changes flag to ignore changes in combo-box callbacks
PBD : : Unwinder < uint32_t > protect_ignore_changes ( _ignore_changes , _ignore_changes + 1 ) ;
_device_combo . set_active_text ( EngineStateController : : instance ( ) - > get_current_device_name ( ) ) ;
2014-06-02 10:08:12 -05:00
2014-05-15 06:53:24 -05:00
return ;
2014-05-21 08:27:14 -05:00
}
2014-05-15 06:53:24 -05:00
}
2014-05-15 10:41:30 -05:00
if ( EngineStateController : : instance ( ) - > set_new_device_as_current ( device_name ) )
2014-05-13 07:47:00 -05:00
{
populate_buffer_size_combo ( ) ;
populate_sample_rate_combo ( ) ;
return ;
2014-05-27 21:46:05 -04:00
}
2014-05-13 07:47:00 -05:00
{
// set _ignore_changes flag to ignore changes in combo-box callbacks
PBD : : Unwinder < uint32_t > protect_ignore_changes ( _ignore_changes , _ignore_changes + 1 ) ;
// restore previous device name in combo box
_device_combo . set_active_text ( EngineStateController : : instance ( ) - > get_current_device_name ( ) ) ;
}
MessageDialog ( _ ( " Selected device is not available for current engine " ) , PROGRAM_NAME ) . run ( ) ;
2014-05-27 21:46:05 -04:00
}
2014-05-26 08:54:26 -05:00
void
TracksControlPanel : : on_all_inputs_on_button ( WavesButton * )
{
2014-05-26 09:36:51 -05:00
EngineStateController : : instance ( ) - > set_state_to_all_inputs ( true ) ;
2014-05-26 08:54:26 -05:00
}
2014-06-02 10:08:12 -05:00
void
TracksControlPanel : : on_name_tracks_after_driver ( WavesButton * )
{
2014-06-06 08:45:01 -05:00
_yes_button . set_visible ( true ) ;
_no_button . set_visible ( true ) ;
_tracks_naming_rule = NameAfterDriver ;
2014-06-02 10:08:12 -05:00
}
void
TracksControlPanel : : on_reset_tracks_name_to_default ( WavesButton * )
{
2014-06-06 08:45:01 -05:00
_yes_button . set_visible ( true ) ;
_no_button . set_visible ( true ) ;
2014-06-02 10:08:12 -05:00
2014-06-06 08:45:01 -05:00
_tracks_naming_rule = UseDefaultNames ;
}
void
TracksControlPanel : : on_yes_button ( WavesButton * )
{
Config - > set_tracks_auto_naming ( _tracks_naming_rule ) ;
2014-06-02 10:08:12 -05:00
2014-06-06 08:45:01 -05:00
_yes_button . set_visible ( false ) ;
_no_button . set_visible ( false ) ;
}
void
TracksControlPanel : : on_no_button ( WavesButton * )
{
_yes_button . set_visible ( false ) ;
_no_button . set_visible ( false ) ;
2014-06-02 10:08:12 -05:00
}
2014-06-10 04:27:03 -05:00
void
TracksControlPanel : : on_control_panel_button ( WavesButton * )
{
boost : : shared_ptr < AudioBackend > backend = AudioEngine : : instance ( ) - > current_backend ( ) ;
assert ( backend ) ;
backend - > launch_control_app ( ) ;
}
2014-05-26 08:54:26 -05:00
void
TracksControlPanel : : on_all_inputs_off_button ( WavesButton * )
{
2014-05-26 09:36:51 -05:00
EngineStateController : : instance ( ) - > set_state_to_all_inputs ( false ) ;
2014-05-26 08:54:26 -05:00
}
void
TracksControlPanel : : on_all_outputs_on_button ( WavesButton * )
{
2014-05-26 09:36:51 -05:00
EngineStateController : : instance ( ) - > set_state_to_all_outputs ( true ) ;
2014-05-26 08:54:26 -05:00
}
void
TracksControlPanel : : on_all_outputs_off_button ( WavesButton * )
{
2014-05-26 09:36:51 -05:00
EngineStateController : : instance ( ) - > set_state_to_all_outputs ( false ) ;
2014-05-26 08:54:26 -05:00
}
2014-05-27 21:46:05 -04:00
void
TracksControlPanel : : buffer_size_changed ( )
{
if ( _ignore_changes ) {
return ;
}
2014-05-13 07:47:00 -05:00
pframes_t new_buffer_size = get_buffer_size ( ) ;
if ( EngineStateController : : instance ( ) - > set_new_buffer_size_in_controller ( new_buffer_size ) )
{
show_buffer_duration ( ) ;
return ;
}
{
// set _ignore_changes flag to ignore changes in combo-box callbacks
PBD : : Unwinder < uint32_t > protect_ignore_changes ( _ignore_changes , _ignore_changes + 1 ) ;
// restore previous buffer size value in combo box
std : : string buffer_size_str = bufsize_as_string ( EngineStateController : : instance ( ) - > get_current_buffer_size ( ) ) ;
_buffer_size_combo . set_active_text ( buffer_size_str ) ;
}
MessageDialog ( _ ( " Buffer size set to the value which is not supported " ) , PROGRAM_NAME ) . run ( ) ;
2014-05-27 21:46:05 -04:00
}
void
TracksControlPanel : : sample_rate_changed ( )
{
if ( _ignore_changes ) {
return ;
}
2014-05-13 07:47:00 -05:00
framecnt_t new_sample_rate = get_sample_rate ( ) ;
if ( EngineStateController : : instance ( ) - > set_new_sample_rate_in_controller ( new_sample_rate ) )
2014-05-27 21:46:05 -04:00
{
2014-05-13 07:47:00 -05:00
show_buffer_duration ( ) ;
return ;
2014-05-27 21:46:05 -04:00
}
2014-05-13 07:47:00 -05:00
{
// set _ignore_changes flag to ignore changes in combo-box callbacks
PBD : : Unwinder < uint32_t > protect_ignore_changes ( _ignore_changes , _ignore_changes + 1 ) ;
// restore previous buffer size value in combo box
std : : string sample_rate_str = rate_as_string ( EngineStateController : : instance ( ) - > get_current_sample_rate ( ) ) ;
_sample_rate_combo . set_active_text ( sample_rate_str ) ;
2014-05-27 21:46:05 -04:00
}
2014-05-13 07:47:00 -05:00
MessageDialog ( _ ( " Sample rate set to the value which is not supported " ) , PROGRAM_NAME ) . run ( ) ;
2014-05-27 21:46:05 -04:00
}
void
TracksControlPanel : : engine_running ( )
{
2014-05-13 07:47:00 -05:00
_buffer_size_combo . set_active_text ( bufsize_as_string ( EngineStateController : : instance ( ) - > get_current_buffer_size ( ) ) ) ;
2014-05-27 21:46:05 -04:00
2014-05-13 07:47:00 -05:00
_sample_rate_combo . set_active_text ( rate_as_string ( EngineStateController : : instance ( ) - > get_current_sample_rate ( ) ) ) ;
2014-05-27 21:46:05 -04:00
2014-05-01 06:06:16 -05:00
_buffer_size_combo . set_sensitive ( true ) ;
_sample_rate_combo . set_sensitive ( true ) ;
2014-05-27 21:46:05 -04:00
}
void
TracksControlPanel : : engine_stopped ( )
{
}
void
2014-04-04 18:20:33 -05:00
TracksControlPanel : : on_audio_settings ( WavesButton * )
2014-05-27 21:46:05 -04:00
{
2014-05-01 06:06:16 -05:00
_midi_settings_layout . hide ( ) ;
_midi_settings_tab_button . set_active ( false ) ;
_session_settings_layout . hide ( ) ;
_session_settings_tab_button . set_active ( false ) ;
_audio_settings_layout . show ( ) ;
_audio_settings_tab_button . set_active ( true ) ;
2014-05-27 21:46:05 -04:00
}
void
2014-04-04 18:20:33 -05:00
TracksControlPanel : : on_midi_settings ( WavesButton * )
2014-05-27 21:46:05 -04:00
{
2014-05-01 06:06:16 -05:00
_audio_settings_layout . hide ( ) ;
_audio_settings_tab_button . set_active ( false ) ;
_session_settings_layout . hide ( ) ;
_session_settings_tab_button . set_active ( false ) ;
_midi_settings_layout . show ( ) ;
_midi_settings_tab_button . set_active ( true ) ;
2014-05-27 21:46:05 -04:00
}
2014-04-10 07:10:03 -05:00
void
TracksControlPanel : : on_session_settings ( WavesButton * )
{
2014-05-01 06:06:16 -05:00
_audio_settings_layout . hide ( ) ;
_audio_settings_tab_button . set_active ( false ) ;
_midi_settings_layout . hide ( ) ;
_midi_settings_tab_button . set_active ( false ) ;
_session_settings_layout . show ( ) ;
_session_settings_tab_button . set_active ( true ) ;
2014-04-10 07:10:03 -05:00
}
2014-04-16 04:41:22 -05:00
void
TracksControlPanel : : on_multi_out ( WavesButton * )
{
2014-05-13 07:47:00 -05:00
if ( Config - > get_output_auto_connect ( ) & AutoConnectPhysical ) {
2014-04-16 04:41:22 -05:00
return ;
}
2014-05-13 07:47:00 -05:00
Config - > set_output_auto_connect ( AutoConnectPhysical ) ;
2014-04-16 04:41:22 -05:00
}
void
TracksControlPanel : : on_stereo_out ( WavesButton * )
{
2014-05-13 07:47:00 -05:00
if ( Config - > get_output_auto_connect ( ) & AutoConnectMaster ) {
2014-04-16 04:41:22 -05:00
return ;
}
2014-05-13 07:47:00 -05:00
Config - > set_output_auto_connect ( AutoConnectMaster ) ;
2014-04-16 04:41:22 -05:00
}
2014-05-20 05:29:32 -05:00
void
2014-05-21 17:41:12 -05:00
TracksControlPanel : : on_browse_button ( WavesButton * )
2014-05-20 05:29:32 -05:00
{
using namespace std ;
# ifdef __APPLE__
set_keep_above ( false ) ;
2014-05-22 03:35:21 -05:00
_default_path_name = ARDOUR : : choose_folder_dialog ( Config - > get_default_open_path ( ) , _ ( " Choose Default Path " ) ) ;
2014-05-20 05:29:32 -05:00
set_keep_above ( true ) ;
if ( ! _default_path_name . empty ( ) )
_default_open_path . set_text ( _default_path_name ) ;
else
_default_open_path . set_text ( Config - > get_default_open_path ( ) ) ;
return ;
# endif
# ifdef _WIN32
string fileTitle ;
2014-05-21 17:41:12 -05:00
set_keep_above ( false ) ;
2014-05-22 03:10:26 -05:00
bool result = ARDOUR : : choose_folder_dialog ( fileTitle , _ ( " Choose Default Path " ) ) ;
2014-05-21 17:41:12 -05:00
set_keep_above ( true ) ;
2014-05-21 10:58:00 -05:00
// if path was chosen in dialog
2014-05-21 17:41:12 -05:00
if ( result ) {
2014-05-20 05:29:32 -05:00
_default_path_name = fileTitle ;
}
2014-05-21 17:41:12 -05:00
if ( ! _default_path_name . empty ( ) )
2014-05-20 05:29:32 -05:00
_default_open_path . set_text ( _default_path_name ) ;
else
_default_open_path . set_text ( Config - > get_default_open_path ( ) ) ;
2014-05-21 08:27:14 -05:00
2014-05-20 05:29:32 -05:00
return ;
# endif // _WIN32
}
2014-05-21 06:44:57 -05:00
void
TracksControlPanel : : save_default_session_path ( )
{
if ( ! _default_path_name . empty ( ) )
{
Config - > set_default_open_path ( _default_path_name ) ;
Config - > save_state ( ) ;
}
}
2014-05-27 21:46:05 -04:00
void
2014-04-04 18:20:33 -05:00
TracksControlPanel : : on_ok ( WavesButton * )
2014-05-27 21:46:05 -04:00
{
hide ( ) ;
2014-05-13 07:47:00 -05:00
EngineStateController : : instance ( ) - > push_current_state_to_backend ( true ) ;
2014-05-27 21:46:05 -04:00
response ( Gtk : : RESPONSE_OK ) ;
2014-05-20 05:29:32 -05:00
2014-05-21 06:44:57 -05:00
save_default_session_path ( ) ;
2014-05-27 21:46:05 -04:00
}
void
2014-04-04 18:20:33 -05:00
TracksControlPanel : : on_cancel ( WavesButton * )
2014-05-27 21:46:05 -04:00
{
hide ( ) ;
2014-05-20 05:29:32 -05:00
response ( Gtk : : RESPONSE_CANCEL ) ;
_default_open_path . set_text ( Config - > get_default_open_path ( ) ) ;
2014-05-27 21:46:05 -04:00
}
void
2014-04-04 18:20:33 -05:00
TracksControlPanel : : on_apply ( WavesButton * )
2014-05-27 21:46:05 -04:00
{
2014-05-13 07:47:00 -05:00
EngineStateController : : instance ( ) - > push_current_state_to_backend ( true ) ;
2014-05-27 21:46:05 -04:00
response ( Gtk : : RESPONSE_APPLY ) ;
2014-05-20 05:29:32 -05:00
2014-05-21 06:44:57 -05:00
save_default_session_path ( ) ;
2014-05-27 21:46:05 -04:00
}
2014-05-06 03:21:18 -05:00
void TracksControlPanel : : on_capture_active_changed ( DeviceConnectionControl * capture_control , bool active )
{
2014-05-22 08:42:52 -05:00
const char * id_name = ( char * ) capture_control - > get_data ( DeviceConnectionControl : : id_name ) ;
EngineStateController : : instance ( ) - > set_physical_audio_input_state ( id_name , active ) ;
2014-05-06 03:21:18 -05:00
}
void TracksControlPanel : : on_playback_active_changed ( DeviceConnectionControl * playback_control , bool active )
{
2014-05-22 08:42:52 -05:00
const char * id_name = ( char * ) playback_control - > get_data ( DeviceConnectionControl : : id_name ) ;
EngineStateController : : instance ( ) - > set_physical_audio_output_state ( id_name , active ) ;
2014-05-06 03:21:18 -05:00
}
2014-06-03 02:00:17 -05:00
void TracksControlPanel : : on_midi_capture_active_changed ( MidiDeviceConnectionControl * control , bool active )
2014-05-12 09:21:16 -05:00
{
2014-06-03 02:00:17 -05:00
const char * id_name = ( char * ) control - > get_data ( MidiDeviceConnectionControl : : capture_id_name ) ;
2014-06-04 03:03:48 -05:00
EngineStateController : : instance ( ) - > set_physical_midi_input_state ( id_name , active ) ;
2014-05-12 09:21:16 -05:00
}
2014-06-03 02:00:17 -05:00
void TracksControlPanel : : on_midi_playback_active_changed ( MidiDeviceConnectionControl * control , bool active )
2014-05-12 09:21:16 -05:00
{
2014-06-03 02:00:17 -05:00
const char * id_name = ( char * ) control - > get_data ( MidiDeviceConnectionControl : : playback_id_name ) ;
2014-06-04 03:03:48 -05:00
EngineStateController : : instance ( ) - > set_physical_midi_output_state ( id_name , active ) ;
2014-05-12 09:21:16 -05:00
}
2014-05-29 04:22:08 -05:00
void TracksControlPanel : : on_port_registration_update ( )
{
populate_input_channels ( ) ;
populate_output_channels ( ) ;
2014-06-03 08:26:32 -05:00
populate_midi_ports ( ) ;
2014-05-29 04:22:08 -05:00
}
2014-05-15 07:57:07 -05:00
void
TracksControlPanel : : on_buffer_size_update ( )
{
populate_buffer_size_combo ( ) ;
}
void
TracksControlPanel : : on_device_list_update ( bool current_device_disconnected )
{
populate_device_combo ( ) ;
if ( current_device_disconnected ) {
2014-06-02 10:08:12 -05:00
std : : string message = _ ( " Audio device has been removed " ) ;
2014-05-16 03:26:17 -05:00
MessageDialog msg ( message ,
false ,
Gtk : : MESSAGE_WARNING ,
Gtk : : BUTTONS_OK ,
true ) ;
msg . set_position ( Gtk : : WIN_POS_MOUSE ) ;
2014-06-02 10:08:12 -05:00
msg . set_keep_above ( true ) ;
2014-05-16 03:26:17 -05:00
msg . run ( ) ;
return ;
2014-05-15 07:57:07 -05:00
}
}
2014-05-15 10:41:30 -05:00
void
TracksControlPanel : : on_parameter_changed ( const std : : string & parameter_name )
{
if ( parameter_name = = " output-auto-connect " ) {
populate_output_mode ( ) ;
2014-05-19 18:04:58 -05:00
} else if ( parameter_name = = " tracks-auto-naming " ) {
2014-06-03 02:00:17 -05:00
on_audio_input_configuration_changed ( ) ;
2014-05-15 10:41:30 -05:00
}
}
2014-05-19 18:04:58 -05:00
void
2014-06-03 02:00:17 -05:00
TracksControlPanel : : on_audio_input_configuration_changed ( )
2014-05-19 18:04:58 -05:00
{
std : : vector < Gtk : : Widget * > capture_controls = _device_capture_list . get_children ( ) ;
std : : vector < Gtk : : Widget * > : : iterator control_iter = capture_controls . begin ( ) ;
uint16_t number_count = 1 ;
for ( ; control_iter ! = capture_controls . end ( ) ; + + control_iter ) {
DeviceConnectionControl * control = dynamic_cast < DeviceConnectionControl * > ( * control_iter ) ;
if ( control ) {
2014-05-21 04:04:59 -05:00
2014-05-22 08:42:52 -05:00
const char * id_name = ( char * ) control - > get_data ( DeviceConnectionControl : : id_name ) ;
2014-05-19 18:04:58 -05:00
2014-06-04 03:03:48 -05:00
if ( id_name ) {
bool new_state = EngineStateController : : instance ( ) - > get_physical_audio_input_state ( id_name ) ;
uint16_t number = DeviceConnectionControl : : NoNumber ;
std : : string track_name ( " " ) ;
2014-05-19 18:04:58 -05:00
2014-06-04 03:03:48 -05:00
if ( new_state ) {
number = number_count + + ;
if ( Config - > get_tracks_auto_naming ( ) & UseDefaultNames ) {
track_name = string_compose ( " %1 %2 " , Session : : default_trx_track_name_pattern , number ) ;
} else if ( Config - > get_tracks_auto_naming ( ) & NameAfterDriver ) {
track_name = control - > get_port_name ( ) ;
}
2014-05-19 18:04:58 -05:00
}
2014-06-04 03:03:48 -05:00
control - > set_track_name ( track_name ) ;
control - > set_number ( number ) ;
control - > set_active ( new_state ) ;
2014-05-19 18:04:58 -05:00
}
}
}
}
void
2014-06-03 02:00:17 -05:00
TracksControlPanel : : on_audio_output_configuration_changed ( )
2014-05-19 18:04:58 -05:00
{
std : : vector < Gtk : : Widget * > playback_controls = _device_playback_list . get_children ( ) ;
std : : vector < Gtk : : Widget * > : : iterator control_iter = playback_controls . begin ( ) ;
uint16_t number_count = 1 ;
for ( ; control_iter ! = playback_controls . end ( ) ; + + control_iter ) {
DeviceConnectionControl * control = dynamic_cast < DeviceConnectionControl * > ( * control_iter ) ;
if ( control ) {
2014-05-21 04:04:59 -05:00
2014-05-23 02:30:45 -05:00
const char * id_name = ( char * ) control - > get_data ( DeviceConnectionControl : : id_name ) ;
2014-05-21 04:04:59 -05:00
2014-06-04 03:03:48 -05:00
if ( id_name ! = NULL ) {
bool new_state = EngineStateController : : instance ( ) - > get_physical_audio_output_state ( id_name ) ;
uint16_t number = DeviceConnectionControl : : NoNumber ;
if ( new_state ) {
number = number_count + + ;
}
control - > set_number ( number ) ;
control - > set_active ( new_state ) ;
2014-05-19 18:04:58 -05:00
}
}
}
}
2014-06-03 02:00:17 -05:00
void
TracksControlPanel : : on_midi_input_configuration_changed ( )
{
std : : vector < Gtk : : Widget * > midi_controls = _midi_device_list . get_children ( ) ;
std : : vector < Gtk : : Widget * > : : iterator control_iter = midi_controls . begin ( ) ;
for ( ; control_iter ! = midi_controls . end ( ) ; + + control_iter ) {
MidiDeviceConnectionControl * control = dynamic_cast < MidiDeviceConnectionControl * > ( * control_iter ) ;
2014-06-04 03:03:48 -05:00
if ( control & & control - > has_capture ( ) ) {
2014-06-03 02:00:17 -05:00
const char * capture_id_name = ( char * ) control - > get_data ( MidiDeviceConnectionControl : : capture_id_name ) ;
2014-06-04 03:03:48 -05:00
if ( capture_id_name ! = NULL ) {
bool new_state = EngineStateController : : instance ( ) - > get_physical_midi_input_state ( capture_id_name ) ;
control - > set_capture_active ( new_state ) ;
}
2014-06-03 02:00:17 -05:00
}
}
}
void
TracksControlPanel : : on_midi_output_configuration_changed ( )
{
std : : vector < Gtk : : Widget * > midi_controls = _midi_device_list . get_children ( ) ;
std : : vector < Gtk : : Widget * > : : iterator control_iter = midi_controls . begin ( ) ;
for ( ; control_iter ! = midi_controls . end ( ) ; + + control_iter ) {
MidiDeviceConnectionControl * control = dynamic_cast < MidiDeviceConnectionControl * > ( * control_iter ) ;
2014-06-04 03:03:48 -05:00
if ( control & & control - > has_playback ( ) ) {
2014-06-03 02:00:17 -05:00
const char * playback_id_name = ( char * ) control - > get_data ( MidiDeviceConnectionControl : : playback_id_name ) ;
2014-06-04 03:03:48 -05:00
if ( playback_id_name ! = NULL ) {
bool new_state = EngineStateController : : instance ( ) - > get_physical_midi_output_state ( playback_id_name ) ;
control - > set_playback_active ( new_state ) ;
}
2014-06-03 02:00:17 -05:00
}
}
}
2014-05-27 21:46:05 -04:00
std : : string
TracksControlPanel : : bufsize_as_string ( uint32_t sz )
{
/* Translators: "samples" is always plural here, so no
need for plural + singular forms .
*/
char buf [ 32 ] ;
snprintf ( buf , sizeof ( buf ) , _ ( " %u samples " ) , sz ) ;
return buf ;
}
2014-05-13 07:47:00 -05:00
framecnt_t
2014-04-29 01:07:37 -05:00
TracksControlPanel : : get_sample_rate ( ) const
2014-05-27 21:46:05 -04:00
{
2014-05-01 06:06:16 -05:00
float r = atof ( _sample_rate_combo . get_active_text ( ) ) ;
2014-05-27 21:46:05 -04:00
/* the string may have been translated with an abbreviation for
* thousands , so use a crude heuristic to fix this .
*/
if ( r < 1000.0 ) {
r * = 1000.0 ;
}
return r ;
}
2014-05-13 07:47:00 -05:00
pframes_t TracksControlPanel : : get_buffer_size ( ) const
2014-05-27 21:46:05 -04:00
{
2014-05-13 07:47:00 -05:00
std : : string bs_text = _buffer_size_combo . get_active_text ( ) ;
pframes_t samples = atoi ( bs_text ) ; /* will ignore trailing text */
2014-05-27 21:46:05 -04:00
return samples ;
}
void
TracksControlPanel : : show_buffer_duration ( )
{
2014-04-29 01:07:37 -05:00
float latency = ( get_buffer_size ( ) * 1000.0 ) / get_sample_rate ( ) ;
2014-05-27 21:46:05 -04:00
char buf [ 256 ] ;
snprintf ( buf , sizeof ( buf ) , _ ( " INPUT LATENCY: %.1f MS OUTPUT LATENCY: %.1f MS TOTAL LATENCY: %.1f MS " ) ,
latency , latency , 2 * latency ) ;
2014-05-01 06:06:16 -05:00
_latency_label . set_text ( buf ) ;
2014-05-27 21:46:05 -04:00
}