merge denormal handling work from 2.0-ongoing
git-svn-id: svn://localhost/ardour2/trunk@1937 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
@@ -77,6 +77,8 @@ namespace ARDOUR {
|
||||
};
|
||||
|
||||
static const double SHUTTLE_FRACT_SPEED1=0.48412291827; /* derived from A1,A2 */
|
||||
|
||||
void setup_fpu ();
|
||||
}
|
||||
|
||||
/* how do we make these be within the Ardour namespace? */
|
||||
|
||||
@@ -144,8 +144,14 @@ CONFIG_VARIABLE (uint32_t, periodic_safety_backup_interval, "periodic-safety-bac
|
||||
CONFIG_VARIABLE (string, possible_audio_file_regexp, "possible-audio-file-regexp", "\\.(wav|aiff|caf|w64|L|R)$")
|
||||
|
||||
/* Theme */
|
||||
|
||||
CONFIG_VARIABLE (string, ui_rc_file, "ui-rc-file", "ardour2_ui_dark.rc")
|
||||
|
||||
/* denormal management */
|
||||
|
||||
CONFIG_VARIABLE (bool, denormal_protection, "denormal-protection", false)
|
||||
CONFIG_VARIABLE (DenormalModel, denormal_model, "denormal-model", DenormalNone)
|
||||
|
||||
/* BWAV */
|
||||
|
||||
CONFIG_VARIABLE (string, bwf_country_code, "bwf-country-code", "US")
|
||||
|
||||
@@ -107,6 +107,9 @@ class IO : public PBD::StatefulDestructible
|
||||
gain_t gain () const { return _desired_gain; }
|
||||
virtual gain_t effective_gain () const;
|
||||
|
||||
void set_denormal_protection (bool yn, void *src);
|
||||
bool denormal_protection() const { return _denormal_protection; }
|
||||
|
||||
void set_phase_invert (bool yn, void *src);
|
||||
bool phase_invert() const { return _phase_invert; }
|
||||
|
||||
@@ -284,6 +287,7 @@ class IO : public PBD::StatefulDestructible
|
||||
Bundle* _output_bundle;
|
||||
bool no_panner_reset;
|
||||
bool _phase_invert;
|
||||
bool _denormal_protection;
|
||||
XMLNode* deferred_state;
|
||||
DataType _default_type;
|
||||
|
||||
|
||||
@@ -124,7 +124,7 @@ class Route : public IO
|
||||
|
||||
void set_mute_config (mute_type, bool, void *src);
|
||||
bool get_mute_config (mute_type);
|
||||
|
||||
|
||||
void set_edit_group (RouteGroup *, void *);
|
||||
void drop_edit_group (void *);
|
||||
RouteGroup *edit_group () { return _edit_group; }
|
||||
|
||||
@@ -270,6 +270,13 @@ namespace ARDOUR {
|
||||
ExternalMonitoring,
|
||||
};
|
||||
|
||||
enum DenormalModel {
|
||||
DenormalNone,
|
||||
DenormalFTZ,
|
||||
DenormalDAZ,
|
||||
DenormalFTZDAZ
|
||||
};
|
||||
|
||||
enum RemoteModel {
|
||||
UserOrdered,
|
||||
MixerOrdered,
|
||||
@@ -365,6 +372,7 @@ std::istream& operator>>(std::istream& o, ARDOUR::SlaveSource& sf);
|
||||
std::istream& operator>>(std::istream& o, ARDOUR::ShuttleBehaviour& sf);
|
||||
std::istream& operator>>(std::istream& o, ARDOUR::ShuttleUnits& sf);
|
||||
std::istream& operator>>(std::istream& o, ARDOUR::SmpteFormat& sf);
|
||||
std::istream& operator>>(std::istream& o, ARDOUR::DenormalModel& sf);
|
||||
|
||||
using ARDOUR::nframes_t;
|
||||
|
||||
|
||||
@@ -51,6 +51,7 @@ setup_enum_writer ()
|
||||
Placement _Placement;
|
||||
MonitorModel _MonitorModel;
|
||||
RemoteModel _RemoteModel;
|
||||
DenormalModel _DenormalModel;
|
||||
CrossfadeModel _CrossfadeModel;
|
||||
LayerModel _LayerModel;
|
||||
SoloModel _SoloModel;
|
||||
@@ -162,6 +163,12 @@ setup_enum_writer ()
|
||||
REGISTER_ENUM (ExternalMonitoring);
|
||||
REGISTER (_MonitorModel);
|
||||
|
||||
REGISTER_ENUM (DenormalNone);
|
||||
REGISTER_ENUM (DenormalFTZ);
|
||||
REGISTER_ENUM (DenormalDAZ);
|
||||
REGISTER_ENUM (DenormalFTZDAZ);
|
||||
REGISTER (_DenormalModel);
|
||||
|
||||
REGISTER_ENUM (UserOrdered);
|
||||
REGISTER_ENUM (MixerOrdered);
|
||||
REGISTER_ENUM (EditorOrdered);
|
||||
|
||||
@@ -27,6 +27,10 @@
|
||||
#include <fst.h>
|
||||
#endif
|
||||
|
||||
#ifdef __SSE__
|
||||
#include <xmmintrin.h>
|
||||
#endif
|
||||
|
||||
#include <lrdf.h>
|
||||
|
||||
#include <pbd/error.h>
|
||||
@@ -237,8 +241,9 @@ setup_hardware_optimization (bool try_optimization)
|
||||
: "%rax", "%rcx", "%rdx", "memory");
|
||||
|
||||
#endif /* USE_X86_64_ASM */
|
||||
|
||||
use_sse &= (1 << 25); // bit 25 = SSE support
|
||||
|
||||
|
||||
if (use_sse) {
|
||||
info << "Using SSE optimized routines" << endmsg;
|
||||
|
||||
@@ -283,6 +288,9 @@ setup_hardware_optimization (bool try_optimization)
|
||||
|
||||
info << "No H/W specific optimizations in use" << endmsg;
|
||||
}
|
||||
|
||||
setup_fpu ();
|
||||
|
||||
}
|
||||
|
||||
int
|
||||
@@ -532,6 +540,55 @@ ARDOUR::LocaleGuard::~LocaleGuard ()
|
||||
free ((char*)old);
|
||||
}
|
||||
|
||||
void
|
||||
ARDOUR::setup_fpu ()
|
||||
{
|
||||
#ifdef USE_XMMINTRIN
|
||||
int MXCSR;
|
||||
|
||||
/* XXX use real code to determine if the processor supports
|
||||
DenormalsAreZero and FlushToZero
|
||||
*/
|
||||
|
||||
bool has_daz = false;
|
||||
bool can_ftz = true;
|
||||
|
||||
if (!can_ftz && !has_daz) {
|
||||
return;
|
||||
}
|
||||
|
||||
MXCSR = _mm_getcsr();
|
||||
|
||||
switch (Config->get_denormal_model()) {
|
||||
case DenormalNone:
|
||||
MXCSR &= ~_MM_FLUSH_ZERO_ON;
|
||||
break;
|
||||
|
||||
case DenormalFTZ:
|
||||
MXCSR |= _MM_FLUSH_ZERO_ON;
|
||||
break;
|
||||
|
||||
case DenormalDAZ:
|
||||
MXCSR &= ~_MM_FLUSH_ZERO_ON;
|
||||
if (has_daz) {
|
||||
MXCSR |= 0x8000;
|
||||
}
|
||||
break;
|
||||
|
||||
case DenormalFTZDAZ:
|
||||
if (has_daz) {
|
||||
MXCSR |= _MM_FLUSH_ZERO_ON | 0x8000;
|
||||
} else {
|
||||
MXCSR |= _MM_FLUSH_ZERO_ON;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
_mm_setcsr (MXCSR);
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
ARDOUR::OverlapType
|
||||
ARDOUR::coverage (nframes_t sa, nframes_t ea,
|
||||
nframes_t sb, nframes_t eb)
|
||||
@@ -634,4 +691,5 @@ std::istream& operator>>(std::istream& o, SlaveSource& var) { return int_to_type
|
||||
std::istream& operator>>(std::istream& o, ShuttleBehaviour& var) { return int_to_type<ShuttleBehaviour> (o, var); }
|
||||
std::istream& operator>>(std::istream& o, ShuttleUnits& var) { return int_to_type<ShuttleUnits> (o, var); }
|
||||
std::istream& operator>>(std::istream& o, SmpteFormat& var) { return int_to_type<SmpteFormat> (o, var); }
|
||||
std::istream& operator>>(std::istream& o, DenormalModel& var) { return int_to_type<DenormalModel> (o, var); }
|
||||
|
||||
|
||||
@@ -2436,7 +2436,17 @@ IO::set_phase_invert (bool yn, void *src)
|
||||
{
|
||||
if (_phase_invert != yn) {
|
||||
_phase_invert = yn;
|
||||
// phase_invert_changed (src); /* EMIT SIGNAL */
|
||||
}
|
||||
// phase_invert_changed (src); /* EMIT SIGNAL */
|
||||
}
|
||||
|
||||
void
|
||||
IO::set_denormal_protection (bool yn, void *src)
|
||||
{
|
||||
if (_denormal_protection != yn) {
|
||||
_denormal_protection = yn;
|
||||
// denormal_protection_changed (src); /* EMIT SIGNAL */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -79,6 +79,7 @@ Route::init ()
|
||||
_soloed = false;
|
||||
_solo_safe = false;
|
||||
_phase_invert = false;
|
||||
_denormal_protection = false;
|
||||
order_keys[strdup (N_("signal"))] = order_key_cnt++;
|
||||
_active = true;
|
||||
_silent = false;
|
||||
@@ -234,9 +235,9 @@ Route::set_gain (gain_t val, void *src)
|
||||
*/
|
||||
void
|
||||
Route::process_output_buffers (BufferSet& bufs,
|
||||
nframes_t start_frame, nframes_t end_frame,
|
||||
nframes_t nframes, nframes_t offset, bool with_redirects, int declick,
|
||||
bool meter)
|
||||
nframes_t start_frame, nframes_t end_frame,
|
||||
nframes_t nframes, nframes_t offset, bool with_redirects, int declick,
|
||||
bool meter)
|
||||
{
|
||||
// This is definitely very audio-only for now
|
||||
assert(_default_type == DataType::AUDIO);
|
||||
@@ -351,7 +352,22 @@ Route::process_output_buffers (BufferSet& bufs,
|
||||
}
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------------
|
||||
/* -----------------------------------------------------------------------------------------------------
|
||||
DENORMAL CONTROL
|
||||
-------------------------------------------------------------------------------------------------- */
|
||||
|
||||
if (_denormal_protection || Config->get_denormal_protection()) {
|
||||
|
||||
for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
|
||||
Sample* const sp = i->data();
|
||||
|
||||
for (nframes_t nx = offset; nx < nframes + offset; ++nx) {
|
||||
sp[nx] += 1.0e-27f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------------------------------------
|
||||
PRE-FADER REDIRECTS
|
||||
-------------------------------------------------------------------------------------------------- */
|
||||
|
||||
@@ -1466,6 +1482,7 @@ Route::state(bool full_state)
|
||||
node->add_property("muted", _muted?"yes":"no");
|
||||
node->add_property("soloed", _soloed?"yes":"no");
|
||||
node->add_property("phase-invert", _phase_invert?"yes":"no");
|
||||
node->add_property("denormal-protection", _denormal_protection?"yes":"no");
|
||||
node->add_property("mute-affects-pre-fader", _mute_affects_pre_fader?"yes":"no");
|
||||
node->add_property("mute-affects-post-fader", _mute_affects_post_fader?"yes":"no");
|
||||
node->add_property("mute-affects-control-outs", _mute_affects_control_outs?"yes":"no");
|
||||
@@ -1701,7 +1718,11 @@ Route::_set_state (const XMLNode& node, bool call_base)
|
||||
}
|
||||
|
||||
if ((prop = node.property (X_("phase-invert"))) != 0) {
|
||||
set_phase_invert(prop->value()=="yes"?true:false, this);
|
||||
set_phase_invert (prop->value()=="yes"?true:false, this);
|
||||
}
|
||||
|
||||
if ((prop = node.property (X_("denormal-protection"))) != 0) {
|
||||
set_denormal_protection (prop->value()=="yes"?true:false, this);
|
||||
}
|
||||
|
||||
if ((prop = node.property (X_("active"))) != 0) {
|
||||
|
||||
Reference in New Issue
Block a user