From dfc307801307f21d1db5db2395bce5cb1bc95c84 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 27 Dec 2011 00:48:31 +0000 Subject: [PATCH] Add configure option to raise a FP exception when a denormal is detected. git-svn-id: svn://localhost/ardour2/branches/3.0@11086 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/ardour/session.h | 5 +++-- libs/ardour/audioengine.cc | 1 + libs/ardour/globals.cc | 5 +++++ libs/ardour/session.cc | 5 +++-- libs/ardour/session_state.cc | 8 +++++--- libs/ardour/test/playlist_layering_test.cc | 10 ++++++++-- wscript | 14 ++++++++++++++ 7 files changed, 39 insertions(+), 9 deletions(-) diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 675950d986..4587c8fc68 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -149,7 +149,8 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi const std::string& fullpath, const std::string& snapshot_name, BusProfile* bus_profile = 0, - std::string mix_template = ""); + std::string mix_template = "", + bool with_midi_ui = true); virtual ~Session (); @@ -1076,7 +1077,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi void auto_loop_changed (Location *); void first_stage_init (std::string path, std::string snapshot_name); - int second_stage_init (); + int second_stage_init (bool with_midi_ui = true); void remove_empty_sounds (); void setup_midi_control (); diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index fa1d6fe175..a538ffcae7 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -91,6 +91,7 @@ AudioEngine::AudioEngine (string client_name, string session_uuid) g_atomic_int_set (&m_meter_exit, 0); if (connect_to_jack (client_name, session_uuid)) { + _instance = 0; throw NoBackendAvailable (); } diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc index 5a2a2addd6..e9383295e7 100644 --- a/libs/ardour/globals.cc +++ b/libs/ardour/globals.cc @@ -454,6 +454,11 @@ ARDOUR::setup_fpu () MXCSR = _mm_getcsr(); +#ifdef DEBUG_DENORMAL_EXCEPTION + /* This will raise a FP exception if a denormal is detected */ + MXCSR &= ~_MM_MASK_DENORM; +#endif + switch (Config->get_denormal_model()) { case DenormalNone: MXCSR &= ~(_MM_FLUSH_ZERO_ON|0x8000); diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 37349cc5fb..1c9676e578 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -140,7 +140,8 @@ Session::Session (AudioEngine &eng, const string& fullpath, const string& snapshot_name, BusProfile* bus_profile, - string mix_template) + string mix_template, + bool with_midi_ui) : _engine (eng) , _target_transport_speed (0.0) , _requested_return_frame (-1) @@ -191,7 +192,7 @@ Session::Session (AudioEngine &eng, } } - if (second_stage_init ()) { + if (second_stage_init (with_midi_ui)) { destroy (); throw failed_constructor (); } diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 7d6f44b786..aa117f00aa 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -293,7 +293,7 @@ Session::first_stage_init (string fullpath, string snapshot_name) } int -Session::second_stage_init () +Session::second_stage_init (bool with_midi_ui) { AudioFileSource::set_peak_dir (_session_dir->peak_path().to_string()); @@ -307,8 +307,10 @@ Session::second_stage_init () return -1; } - if (start_midi_thread ()) { - return -1; + if (with_midi_ui) { + if (start_midi_thread ()) { + return -1; + } } setup_midi_machine_control (); diff --git a/libs/ardour/test/playlist_layering_test.cc b/libs/ardour/test/playlist_layering_test.cc index 1371b0cfae..05c44f5625 100644 --- a/libs/ardour/test/playlist_layering_test.cc +++ b/libs/ardour/test/playlist_layering_test.cc @@ -68,11 +68,17 @@ PlaylistLayeringTest::setUp () test_receiver.listen_to (fatal); test_receiver.listen_to (warning); - AudioEngine* engine = new AudioEngine ("test", ""); + AudioEngine* engine = 0; + try { + engine = new AudioEngine ("test", ""); + } catch (...) { + CPPUNIT_ASSERT (false); + } + MIDI::Manager::create (engine->jack ()); CPPUNIT_ASSERT (engine->start () == 0); - _session = new Session (*engine, test_session_path, "playlist_layering_test"); + _session = new Session (*engine, test_session_path, "playlist_layering_test", 0, "", false); engine->set_session (_session); _playlist = PlaylistFactory::create (DataType::AUDIO, *_session, "test"); diff --git a/wscript b/wscript index 05620d375a..f8e3edccb0 100644 --- a/wscript +++ b/wscript @@ -310,6 +310,12 @@ def set_compiler_flags (conf,opt): conf.env.append_value('CXXFLAGS', '-DDEBUG_RT_ALLOC') conf.env.append_value('LINKFLAGS', '-ldl') + print 'bar' + if conf.env['DEBUG_DENORMAL_EXCEPTION']: + print 'foo' + conf.env.append_value('CFLAGS', '-DDEBUG_DENORMAL_EXCEPTION') + conf.env.append_value('CXXFLAGS', '-DDEBUG_DENORMAL_EXCEPTION') + if opt.universal: if not Options.options.nocarbon: conf.env.append_value('CFLAGS', ["-arch", "i386", "-arch", "ppc"]) @@ -387,6 +393,8 @@ def options(opt): help='Build with debugging for the STL') opt.add_option('--rt-alloc-debug', action='store_true', default=False, dest='rt_alloc_debug', help='Build with debugging for memory allocation in the real-time thread') + opt.add_option('--denormal-exception', action='store_true', default=False, dest='denormal_exception', + help='Raise a floating point exception if a denormal is detected') opt.add_option('--test', action='store_true', default=False, dest='build_tests', help="Build unit tests") opt.add_option('--tranzport', action='store_true', default=False, dest='tranzport', @@ -582,6 +590,10 @@ def configure(conf): conf.env['PROGRAM_NAME'] = opts.program_name if opts.rt_alloc_debug: conf.define('DEBUG_RT_ALLOC', 1) + conf.env['DEBUG_RT_ALLOC'] = True + if opts.denormal_exception: + conf.define('DEBUG_DENORMAL_EXCEPTION', 1) + conf.env['DEBUG_DENORMAL_EXCEPTION'] = True if not conf.is_defined('HAVE_CPPUNIT'): conf.env['BUILD_TESTS'] = False @@ -610,6 +622,8 @@ const char* const ardour_config_info = "\\n\\ write_config_text('AU state support', conf.is_defined('AU_STATE_SUPPORT')) write_config_text('Build target', conf.env['build_target']) write_config_text('CoreAudio', conf.is_defined('HAVE_COREAUDIO')) + write_config_text('Debug RT allocations', conf.is_defined('DEBUG_RT_ALLOC')) + write_config_text('Denormal exceptions', conf.is_defined('DEBUG_DENORMAL_EXCEPTION')) write_config_text('FLAC', conf.is_defined('HAVE_FLAC')) write_config_text('FPU optimization', opts.fpu_optimization) write_config_text('Freedesktop files', opts.freedesktop) -- 2.30.2