diff options
Diffstat (limited to 'libs/ardour/session.cc')
-rw-r--r-- | libs/ardour/session.cc | 173 |
1 files changed, 64 insertions, 109 deletions
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 0e71b19316..31b7c6d356 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -70,6 +70,7 @@ #include <ardour/playlist.h> #include <ardour/click.h> #include <ardour/data_type.h> +#include <ardour/buffer_set.h> #ifdef HAVE_LIBLO #include <ardour/osc.h> @@ -256,6 +257,9 @@ Session::Session (AudioEngine &eng, string* mix_template) : _engine (eng), + _scratch_buffers(new BufferSet()), + _silent_buffers(new BufferSet()), + _send_buffers(new BufferSet()), _mmc_port (default_mmc_port), _mtc_port (default_mtc_port), _midi_port (default_midi_port), @@ -307,6 +311,9 @@ Session::Session (AudioEngine &eng, jack_nframes_t initial_length) : _engine (eng), + _scratch_buffers(new BufferSet()), + _silent_buffers(new BufferSet()), + _send_buffers(new BufferSet()), _mmc_port (default_mmc_port), _mtc_port (default_mtc_port), _midi_port (default_midi_port), @@ -389,17 +396,9 @@ Session::~Session () clear_clicks (); - for (vector<Sample*>::iterator i = _passthru_buffers.begin(); i != _passthru_buffers.end(); ++i) { - free(*i); - } - - for (vector<Sample*>::iterator i = _silent_buffers.begin(); i != _silent_buffers.end(); ++i) { - free(*i); - } - - for (vector<Sample*>::iterator i = _send_buffers.begin(); i != _send_buffers.end(); ++i) { - free(*i); - } + delete _scratch_buffers; + delete _silent_buffers; + delete _send_buffers; AudioDiskstream::free_working_buffers(); @@ -1444,39 +1443,11 @@ Session::set_block_size (jack_nframes_t nframes) { Glib::RWLock::ReaderLock dsm (diskstream_lock); - vector<Sample*>::iterator i; - uint32_t np; current_block_size = nframes; - for (np = 0, i = _passthru_buffers.begin(); i != _passthru_buffers.end(); ++i, ++np) { - free (*i); - } - - for (vector<Sample*>::iterator i = _silent_buffers.begin(); i != _silent_buffers.end(); ++i) { - free (*i); - } - - _passthru_buffers.clear (); - _silent_buffers.clear (); - - ensure_passthru_buffers (ChanCount(DataType::AUDIO, np)); + ensure_buffers(_scratch_buffers->available()); - for (vector<Sample*>::iterator i = _send_buffers.begin(); i != _send_buffers.end(); ++i) { - free(*i); - - Sample *buf; -#ifdef NO_POSIX_MEMALIGN - buf = (Sample *) malloc(current_block_size * sizeof(Sample)); -#else - posix_memalign((void **)&buf,16,current_block_size * 4); -#endif - *i = buf; - - memset (*i, 0, sizeof (Sample) * current_block_size); - } - - if (_gain_automation_buffer) { delete [] _gain_automation_buffer; } @@ -3138,7 +3109,7 @@ Session::audio_path_from_name (string name, uint32_t nchan, uint32_t chan, bool AudioFileSource * Session::create_audio_source_for_session (AudioDiskstream& ds, uint32_t chan, bool destructive) { - string spath = audio_path_from_name (ds.name(), ds.n_channels(), chan, destructive); + string spath = audio_path_from_name (ds.name(), ds.n_channels().get(DataType::AUDIO), chan, destructive); /* this might throw failed_constructor(), which is OK */ @@ -3657,41 +3628,17 @@ Session::tempo_map_changed (Change ignored) set_dirty (); } +/** Ensures that all buffers (scratch, send, silent, etc) are allocated for + * the given count with the current block size. + */ void -Session::ensure_passthru_buffers (ChanCount howmany) +Session::ensure_buffers (ChanCount howmany) { - // FIXME: temporary hack - - while (howmany.get(DataType::AUDIO) > _passthru_buffers.size()) { - Sample *p; -#ifdef NO_POSIX_MEMALIGN - p = (Sample *) malloc(current_block_size * sizeof(Sample)); -#else - posix_memalign((void **)&p,16,current_block_size * 4); -#endif - _passthru_buffers.push_back (p); - - *p = 0; - -#ifdef NO_POSIX_MEMALIGN - p = (Sample *) malloc(current_block_size * sizeof(Sample)); -#else - posix_memalign((void **)&p,16,current_block_size * 4); -#endif - memset (p, 0, sizeof (Sample) * current_block_size); - _silent_buffers.push_back (p); - - *p = 0; - -#ifdef NO_POSIX_MEMALIGN - p = (Sample *) malloc(current_block_size * sizeof(Sample)); -#else - posix_memalign((void **)&p,16,current_block_size * 4); -#endif - memset (p, 0, sizeof (Sample) * current_block_size); - _send_buffers.push_back (p); - - } + // FIXME: NASTY assumption (midi block size == audio block size) + _scratch_buffers->ensure_buffers(howmany, current_block_size); + _send_buffers->ensure_buffers(howmany, current_block_size); + _silent_buffers->ensure_buffers(howmany, current_block_size); + allocate_pan_automation_buffers (current_block_size, howmany.get(DataType::AUDIO), false); } @@ -3859,17 +3806,17 @@ int Session::write_one_audio_track (AudioTrack& track, jack_nframes_t start, jack_nframes_t len, bool overwrite, vector<Source*>& srcs, InterThreadInfo& itt) { - int ret = -1; - Playlist* playlist; - AudioFileSource* fsource; - uint32_t x; - char buf[PATH_MAX+1]; - string dir; - uint32_t nchans; - jack_nframes_t position; - jack_nframes_t this_chunk; - jack_nframes_t to_do; - vector<Sample*> buffers; + int ret = -1; + Playlist* playlist = 0; + AudioFileSource* fsource = 0; + uint32_t x; + char buf[PATH_MAX+1]; + string dir; + ChanCount nchans(track.audio_diskstream().n_channels()); + jack_nframes_t position; + jack_nframes_t this_chunk; + jack_nframes_t to_do; + BufferSet buffers; // any bigger than this seems to cause stack overflows in called functions const jack_nframes_t chunk_size = (128 * 1024)/4; @@ -3887,12 +3834,10 @@ Session::write_one_audio_track (AudioTrack& track, jack_nframes_t start, jack_nf if (track.has_external_redirects()) { goto out; } - - nchans = track.audio_diskstream().n_channels(); dir = discover_best_sound_dir (); - for (uint32_t chan_n=0; chan_n < nchans; ++chan_n) { + for (uint32_t chan_n=0; chan_n < nchans.get(DataType::AUDIO); ++chan_n) { for (x = 0; x < 99999; ++x) { snprintf (buf, sizeof(buf), "%s/%s-%d-bounce-%" PRIu32 ".wav", dir.c_str(), playlist->name().c_str(), chan_n, x+1); @@ -3928,22 +3873,14 @@ Session::write_one_audio_track (AudioTrack& track, jack_nframes_t start, jack_nf to_do = len; /* create a set of reasonably-sized buffers */ - - for (vector<Sample*>::iterator i = _passthru_buffers.begin(); i != _passthru_buffers.end(); ++i) { - Sample* b; -#ifdef NO_POSIX_MEMALIGN - b = (Sample *) malloc(chunk_size * sizeof(Sample)); -#else - posix_memalign((void **)&b,16,chunk_size * 4); -#endif - buffers.push_back (b); - } + buffers.ensure_buffers(nchans, chunk_size); + buffers.set_count(nchans); while (to_do && !itt.cancel) { this_chunk = min (to_do, chunk_size); - if (track.export_stuff (buffers, nchans, start, this_chunk)) { + if (track.export_stuff (buffers, start, this_chunk)) { goto out; } @@ -3952,7 +3889,7 @@ Session::write_one_audio_track (AudioTrack& track, jack_nframes_t start, jack_nf AudioFileSource* afs = dynamic_cast<AudioFileSource*>(*src); if (afs) { - if (afs->write (buffers[n], this_chunk) != this_chunk) { + if (afs->write (buffers.get_audio(n).data(this_chunk), this_chunk) != this_chunk) { goto out; } } @@ -4002,10 +3939,6 @@ Session::write_one_audio_track (AudioTrack& track, jack_nframes_t start, jack_nf } } - for (vector<Sample*>::iterator i = buffers.begin(); i != buffers.end(); ++i) { - free(*i); - } - g_atomic_int_set (&processing_prohibited, 0); itt.done = true; @@ -4013,13 +3946,35 @@ Session::write_one_audio_track (AudioTrack& track, jack_nframes_t start, jack_nf return ret; } -vector<Sample*>& -Session::get_silent_buffers (uint32_t howmany) +BufferSet& +Session::get_silent_buffers (ChanCount count) { - for (uint32_t i = 0; i < howmany; ++i) { - memset (_silent_buffers[i], 0, sizeof (Sample) * current_block_size); + assert(_silent_buffers->available() >= count); + _silent_buffers->set_count(count); + + for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { + for (size_t i=0; i < count.get(*t); ++i) { + _silent_buffers->get(*t, i).clear(); + } } - return _silent_buffers; + + return *_silent_buffers; +} + +BufferSet& +Session::get_scratch_buffers (ChanCount count) +{ + assert(_scratch_buffers->available() >= count); + _scratch_buffers->set_count(count); + return *_scratch_buffers; +} + +BufferSet& +Session::get_send_buffers (ChanCount count) +{ + assert(_send_buffers->available() >= count); + _send_buffers->set_count(count); + return *_send_buffers; } uint32_t |