13
0

permit different sizes for audio playback & capture buffers

git-svn-id: svn://localhost/ardour2/branches/3.0@7248 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2010-06-09 14:11:46 +00:00
parent 1e728e728a
commit 2b9dc7b380
5 changed files with 25 additions and 13 deletions

View File

@ -28,6 +28,8 @@
#include <time.h>
#include <boost/utility.hpp>
#include "pbd/fastlog.h"
#include "pbd/ringbufferNPT.h"
#include "pbd/stateful.h"
@ -179,9 +181,12 @@ class AudioDiskstream : public Diskstream
private:
struct ChannelInfo {
struct ChannelInfo : public boost::noncopyable {
ChannelInfo (nframes_t buffer_size, nframes_t speed_buffer_size, nframes_t wrap_buffer_size);
ChannelInfo (nframes_t playback_buffer_size,
nframes_t capture_buffer_size,
nframes_t speed_buffer_size,
nframes_t wrap_buffer_size);
~ChannelInfo ();
Sample *playback_wrap_buffer;

View File

@ -54,7 +54,8 @@ class Butler : public SessionHandleRef
float read_data_rate() const; ///< in usec
float write_data_rate() const;
uint32_t audio_diskstream_buffer_size() const { return audio_dstream_buffer_size; }
nframes_t audio_diskstream_capture_buffer_size() const { return audio_dstream_capture_buffer_size; }
nframes_t audio_diskstream_playback_buffer_size() const { return audio_dstream_playback_buffer_size; }
uint32_t midi_diskstream_buffer_size() const { return midi_dstream_buffer_size; }
static void* _thread_work(void *arg);
@ -75,7 +76,8 @@ class Butler : public SessionHandleRef
bool should_run;
mutable gint should_do_transport_work;
int request_pipe[2];
uint32_t audio_dstream_buffer_size;
nframes_t audio_dstream_capture_buffer_size;
nframes_t audio_dstream_playback_buffer_size;
uint32_t midi_dstream_buffer_size;
RingBuffer<CrossThreadPool*> pool_trash;

View File

@ -51,7 +51,8 @@ CONFIG_VARIABLE (RemoteModel, remote_model, "remote-model", MixerOrdered)
CONFIG_VARIABLE (uint32_t, minimum_disk_io_bytes, "minimum-disk-io-bytes", 1024 * 256)
CONFIG_VARIABLE (float, midi_readahead, "midi-readahead", 1.0)
CONFIG_VARIABLE (float, audio_track_buffer_seconds, "track-buffer-seconds", 5.0)
CONFIG_VARIABLE (float, audio_capture_buffer_seconds, "capture-buffer-seconds", 5.0)
CONFIG_VARIABLE (float, audio_playback_buffer_seconds, "playback-buffer-seconds", 5.0)
CONFIG_VARIABLE (float, midi_track_buffer_seconds, "midi-track-buffer-seconds", 1.0)
CONFIG_VARIABLE (uint32_t, disk_choice_space_threshold, "disk-choice-space-threshold", 57600000)
CONFIG_VARIABLE (bool, auto_analyse_audio, "auto-analyse-audio", false)

View File

@ -2056,8 +2056,10 @@ int
AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
{
while (how_many--) {
c->push_back (new ChannelInfo(_session.butler()->audio_diskstream_buffer_size(), speed_buffer_size, wrap_buffer_size));
interpolation.add_channel_to (_session.butler()->audio_diskstream_buffer_size(), speed_buffer_size);
c->push_back (new ChannelInfo(_session.butler()->audio_diskstream_playback_buffer_size(),
_session.butler()->audio_diskstream_capture_buffer_size(),
speed_buffer_size, wrap_buffer_size));
interpolation.add_channel_to (_session.butler()->audio_diskstream_playback_buffer_size(), speed_buffer_size);
}
_n_channels.set(DataType::AUDIO, c->size());
@ -2295,7 +2297,7 @@ AudioDiskstream::can_become_destructive (bool& requires_bounce) const
return true;
}
AudioDiskstream::ChannelInfo::ChannelInfo (nframes_t bufsize, nframes_t speed_size, nframes_t wrap_size)
AudioDiskstream::ChannelInfo::ChannelInfo (nframes_t playback_bufsize, nframes_t capture_bufsize, nframes_t speed_size, nframes_t wrap_size)
{
peak_power = 0.0f;
source = 0;
@ -2307,8 +2309,8 @@ AudioDiskstream::ChannelInfo::ChannelInfo (nframes_t bufsize, nframes_t speed_si
playback_wrap_buffer = new Sample[wrap_size];
capture_wrap_buffer = new Sample[wrap_size];
playback_buf = new RingBufferNPT<Sample> (bufsize);
capture_buf = new RingBufferNPT<Sample> (bufsize);
playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
capture_transition_buf = new RingBufferNPT<CaptureTransition> (256);
/* touch the ringbuffer buffers, which will cause

View File

@ -43,7 +43,8 @@ namespace ARDOUR {
Butler::Butler(Session& s)
: SessionHandleRef (s)
, thread(0)
, audio_dstream_buffer_size(0)
, audio_dstream_capture_buffer_size(0)
, audio_dstream_playback_buffer_size(0)
, midi_dstream_buffer_size(0)
, pool_trash(16)
{
@ -62,7 +63,8 @@ Butler::start_thread()
const float rate = (float)_session.frame_rate();
/* size is in Samples, not bytes */
audio_dstream_buffer_size = (uint32_t) floor (Config->get_audio_track_buffer_seconds() * rate);
audio_dstream_capture_buffer_size = (uint32_t) floor (Config->get_audio_capture_buffer_seconds() * rate);
audio_dstream_playback_buffer_size = (uint32_t) floor (Config->get_audio_playback_buffer_seconds() * rate);
/* size is in bytes
* XXX: Jack needs to tell us the MIDI buffer size
@ -72,7 +74,7 @@ Butler::start_thread()
MidiDiskstream::set_readahead_frames ((nframes_t)(Config->get_midi_readahead() * rate));
Crossfade::set_buffer_size (audio_dstream_buffer_size);
Crossfade::set_buffer_size (audio_dstream_playback_buffer_size);
should_run = false;