introduce the idea of buffering presets, along with 3 possible settings (plus custom).

Actual numbers for the parameters are still to be determined/verified, and probably subject to
some platform specificity.
This commit is contained in:
Paul Davis 2015-01-26 15:13:48 -05:00
parent fbab241bf3
commit 92c8b8fae9
8 changed files with 123 additions and 6 deletions

View file

@ -149,6 +149,8 @@ class LIBARDOUR_API Diskstream : public SessionObject, public PublicDiskstream
static framecnt_t default_disk_read_chunk_frames ();
static framecnt_t default_disk_write_chunk_frames ();
static void set_buffering_parameters (BufferingPreset bp);
/* Stateful */
virtual XMLNode& get_state(void);
virtual int set_state(const XMLNode&, int version);
@ -343,6 +345,12 @@ class LIBARDOUR_API Diskstream : public SessionObject, public PublicDiskstream
XMLNode* deprecated_io_node;
void route_going_away ();
static bool get_buffering_presets (BufferingPreset bp,
framecnt_t& read_chunk_size,
framecnt_t& read_buffer_size,
framecnt_t& write_chunk_size,
framecnt_t& write_buffer_size);
std::string _own_replication_path;
virtual int reset_replication_sources () { return 0; }

View file

@ -76,6 +76,7 @@ CONFIG_VARIABLE (RemoteModel, remote_model, "remote-model", MixerOrdered)
CONFIG_VARIABLE (uint32_t, minimum_disk_read_bytes, "minimum-disk-read-bytes", ARDOUR::Diskstream::default_disk_read_chunk_frames() * sizeof (ARDOUR::Sample))
CONFIG_VARIABLE (uint32_t, minimum_disk_write_bytes, "minimum-disk-write-bytes", ARDOUR::Diskstream::default_disk_write_chunk_frames() * sizeof (ARDOUR::Sample))
CONFIG_VARIABLE (float, midi_readahead, "midi-readahead", 1.0)
CONFIG_VARIABLE (BufferingPreset, buffering_preset, "buffering-preset", Medium)
CONFIG_VARIABLE (float, audio_capture_buffer_seconds, "capture-buffer-seconds", 10.0)
CONFIG_VARIABLE (float, audio_playback_buffer_seconds, "playback-buffer-seconds", 10.0)
CONFIG_VARIABLE (float, midi_track_buffer_seconds, "midi-track-buffer-seconds", 1.0)

View file

@ -605,6 +605,13 @@ namespace ARDOUR {
RegionSelectionStart = 0x8,
};
enum BufferingPreset {
Small,
Medium,
Large,
Custom,
};
} // namespace ARDOUR
@ -635,6 +642,7 @@ std::istream& operator>>(std::istream& o, ARDOUR::WaveformShape& sf);
std::istream& operator>>(std::istream& o, ARDOUR::PositionLockStyle& sf);
std::istream& operator>>(std::istream& o, ARDOUR::FadeShape& sf);
std::istream& operator>>(std::istream& o, ARDOUR::AutoReturnTarget& sf);
std::istream& operator>>(std::istream& o, ARDOUR::BufferingPreset& var);
std::ostream& operator<<(std::ostream& o, const ARDOUR::SampleFormat& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf);
@ -659,6 +667,8 @@ std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformShape& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::PositionLockStyle& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::FadeShape& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoReturnTarget& sf);
std::ostream& operator<<(std::ostream& o, const ARDOUR::BufferingPreset& var);
/* because these operators work on types which can be used when making
a UI_CONFIG_VARIABLE (in gtk2_ardour) we need them to be exported.

View file

@ -799,7 +799,7 @@ AudioDiskstream::commit (framecnt_t playback_distance)
need_butler = ((framecnt_t) c->front()->capture_buf->read_space() >= disk_write_chunk_frames);
}
}
return need_butler;
}

View file

@ -52,7 +52,12 @@ Butler::Butler(Session& s)
g_atomic_int_set(&should_do_transport_work, 0);
SessionEvent::pool->set_trash (&pool_trash);
/* catch future changes to parameters */
Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Butler::config_changed, this, _1));
/* use any current ones that we care about */
boost::function<void (std::string)> ff (boost::bind (&Butler::config_changed, this, _1));
Config->map_parameters (ff);
}
Butler::~Butler()
@ -64,12 +69,26 @@ void
Butler::config_changed (std::string p)
{
if (p == "playback-buffer-seconds") {
/* size is in Samples, not bytes */
audio_dstream_playback_buffer_size = (uint32_t) floor (Config->get_audio_playback_buffer_seconds() * _session.frame_rate());
_session.adjust_playback_buffering ();
if (Config->get_buffering_preset() == Custom) {
/* size is in Samples, not bytes */
audio_dstream_playback_buffer_size = (uint32_t) floor (Config->get_audio_playback_buffer_seconds() * _session.frame_rate());
_session.adjust_playback_buffering ();
} else {
cerr << "Skip explicit buffer seconds, preset in use\n";
}
} else if (p == "capture-buffer-seconds") {
if (Config->get_buffering_preset() == Custom) {
audio_dstream_capture_buffer_size = (uint32_t) floor (Config->get_audio_capture_buffer_seconds() * _session.frame_rate());
_session.adjust_capture_buffering ();
} else {
cerr << "Skip explicit buffer seconds, preset in use\n";
}
} else if (p == "buffering-preset") {
Diskstream::set_buffering_parameters (Config->get_buffering_preset());
audio_dstream_capture_buffer_size = (uint32_t) floor (Config->get_audio_capture_buffer_seconds() * _session.frame_rate());
audio_dstream_playback_buffer_size = (uint32_t) floor (Config->get_audio_playback_buffer_seconds() * _session.frame_rate());
_session.adjust_capture_buffering ();
_session.adjust_playback_buffering ();
}
}

View file

@ -821,3 +821,62 @@ Diskstream::default_disk_write_chunk_frames ()
//GZ to Paul Davis FIX-ME restored old value which used to work with current ring buffer capacity
return 262144;
}
void
Diskstream::set_buffering_parameters (BufferingPreset bp)
{
framecnt_t read_chunk_size;
framecnt_t read_buffer_size;
framecnt_t write_chunk_size;
framecnt_t write_buffer_size;
if (!get_buffering_presets (bp, read_chunk_size, read_buffer_size, write_chunk_size, write_buffer_size)) {
return;
}
disk_read_chunk_frames = read_chunk_size;
disk_write_chunk_frames = write_chunk_size;
Config->set_audio_capture_buffer_seconds (write_buffer_size);
Config->set_audio_playback_buffer_seconds (read_buffer_size);
cerr << "Set buffering params to " << disk_read_chunk_frames << '|' << disk_write_chunk_frames << '|'
<< Config->get_audio_playback_buffer_seconds() << '|'
<< Config->get_audio_capture_buffer_seconds ()
<< endl;
}
bool
Diskstream::get_buffering_presets (BufferingPreset bp,
framecnt_t& read_chunk_size,
framecnt_t& read_buffer_size,
framecnt_t& write_chunk_size,
framecnt_t& write_buffer_size)
{
switch (bp) {
case Small:
read_chunk_size = 65536; /* samples */
write_chunk_size = 65536; /* samples */
read_buffer_size = 5; /* seconds */
write_buffer_size = 5; /* seconds */
break;
case Medium:
read_chunk_size = 262144; /* samples */
write_chunk_size = 131072; /* samples */
read_buffer_size = 10; /* seconds */
write_buffer_size = 10; /* seconds */
break;
case Large:
read_chunk_size = 524288; /* samples */
write_chunk_size = 131072; /* samples */
read_buffer_size = 20; /* seconds */
write_buffer_size = 20; /* seconds */
break;
default:
return false;
}
return true;
}

View file

@ -128,7 +128,8 @@ setup_enum_writer ()
MTC_Status _MIDI_MTC_Status;
Evoral::OverlapType _OverlapType;
AutoReturnTarget _AutoReturnTarget;
BufferingPreset _BufferingPreset;
#define REGISTER(e) enum_writer.register_distinct (typeid(e).name(), i, s); i.clear(); s.clear()
#define REGISTER_BITS(e) enum_writer.register_bits (typeid(e).name(), i, s); i.clear(); s.clear()
#define REGISTER_ENUM(e) i.push_back (e); s.push_back (#e)
@ -642,6 +643,11 @@ setup_enum_writer ()
REGISTER_ENUM (RegionSelectionStart);
REGISTER_BITS (_AutoReturnTarget);
REGISTER_ENUM (Small);
REGISTER_ENUM (Medium);
REGISTER_ENUM (Large);
REGISTER_ENUM (Custom);
REGISTER(_BufferingPreset);
}
} /* namespace ARDOUR */
@ -973,3 +979,17 @@ std::ostream& operator<<(std::ostream& o, const AutoReturnTarget& var)
std::string s = enum_2_string (var);
return o << s;
}
std::istream& operator>>(std::istream& o, ARDOUR::BufferingPreset& var)
{
std::string s;
o >> s;
var = (ARDOUR::BufferingPreset) string_2_enum (s, var);
return o;
}
std::ostream& operator<<(std::ostream& o, const ARDOUR::BufferingPreset& var)
{
std::string s = enum_2_string (var);
return o << s;
}

View file

@ -2,7 +2,7 @@
<Ardour>
<MIDI-port tag="@MIDITAG@" device="ardour" type="@MIDITYPE@" mode="duplex"/>
<Config>
<Option name="track-buffer-seconds" value="5.000000"/>
<Option name="buffering-preset" value="Small"/>
<Option name="mute-affects-pre-fader" value="1"/>
<Option name="mute-affects-post-fader" value="1"/>
<Option name="mute-affects-control-outs" value="1"/>