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
This commit is contained in:
Carl Hetherington 2011-12-27 00:48:31 +00:00
parent fd48e72fc2
commit dfc3078013
7 changed files with 39 additions and 9 deletions

View File

@ -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 ();

View File

@ -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 ();
}

View File

@ -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);

View File

@ -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 ();
}

View File

@ -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 ();

View File

@ -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");

14
wscript
View File

@ -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)