Don't update file_frame twice when reversing close to the start of a diskstream....
[ardour.git] / libs / ardour / audio_diskstream.cc
1 /*
2     Copyright (C) 2000-2006 Paul Davis
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18
19 #include <fstream>
20 #include <cstdio>
21 #include <unistd.h>
22 #include <cmath>
23 #include <cerrno>
24 #include <cassert>
25 #include <string>
26 #include <climits>
27 #include <fcntl.h>
28 #include <cstdlib>
29 #include <ctime>
30 #include <sys/stat.h>
31 #include <sys/mman.h>
32
33 #include "pbd/error.h"
34 #include <glibmm/thread.h>
35 #include "pbd/xml++.h"
36 #include "pbd/memento_command.h"
37 #include "pbd/enumwriter.h"
38 #include "pbd/stateful_diff_command.h"
39
40 #include "ardour/analyser.h"
41 #include "ardour/ardour.h"
42 #include "ardour/audio_buffer.h"
43 #include "ardour/audio_diskstream.h"
44 #include "ardour/audio_port.h"
45 #include "ardour/audioengine.h"
46 #include "ardour/audiofilesource.h"
47
48 #include "ardour/audioplaylist.h"
49 #include "ardour/audioregion.h"
50 #include "ardour/butler.h"
51 #include "ardour/configuration.h"
52 #include "ardour/cycle_timer.h"
53 #include "ardour/debug.h"
54 #include "ardour/io.h"
55 #include "ardour/playlist_factory.h"
56 #include "ardour/region_factory.h"
57 #include "ardour/send.h"
58 #include "ardour/session.h"
59 #include "ardour/source_factory.h"
60 #include "ardour/utils.h"
61 #include "ardour/session_playlists.h"
62 #include "ardour/route.h"
63
64 #include "i18n.h"
65 #include <locale.h>
66
67 using namespace std;
68 using namespace ARDOUR;
69 using namespace PBD;
70
71 size_t  AudioDiskstream::_working_buffers_size = 0;
72 Sample* AudioDiskstream::_mixdown_buffer       = 0;
73 gain_t* AudioDiskstream::_gain_buffer          = 0;
74
75 AudioDiskstream::AudioDiskstream (Session &sess, const string &name, Diskstream::Flag flag)
76         : Diskstream(sess, name, flag)
77         , deprecated_io_node(NULL)
78         , channels (new ChannelList)
79 {
80         /* prevent any write sources from being created */
81
82         in_set_state = true;
83         use_new_playlist ();
84         in_set_state = false;
85 }
86
87 AudioDiskstream::AudioDiskstream (Session& sess, const XMLNode& node)
88         : Diskstream(sess, node)
89         , deprecated_io_node(NULL)
90         , channels (new ChannelList)
91 {
92         in_set_state = true;
93         init ();
94
95         if (set_state (node, Stateful::loading_state_version)) {
96                 in_set_state = false;
97                 throw failed_constructor();
98         }
99
100         in_set_state = false;
101
102         if (destructive()) {
103                 use_destructive_playlist ();
104         }
105 }
106
107 void
108 AudioDiskstream::init ()
109 {
110         /* there are no channels at this point, so these
111            two calls just get speed_buffer_size and wrap_buffer
112            size setup without duplicating their code.
113         */
114
115         set_block_size (_session.get_block_size());
116         allocate_temporary_buffers ();
117 }
118
119 AudioDiskstream::~AudioDiskstream ()
120 {
121         DEBUG_TRACE (DEBUG::Destruction, string_compose ("Audio Diskstream %1 destructor\n", _name));
122
123         {
124                 RCUWriter<ChannelList> writer (channels);
125                 boost::shared_ptr<ChannelList> c = writer.get_copy();
126
127                 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
128                         delete *chan;
129                 }
130
131                 c->clear();
132         }
133
134         channels.flush ();
135
136         delete deprecated_io_node;
137 }
138
139 void
140 AudioDiskstream::allocate_working_buffers()
141 {
142         assert(disk_io_frames() > 0);
143
144         _working_buffers_size = disk_io_frames();
145         _mixdown_buffer       = new Sample[_working_buffers_size];
146         _gain_buffer          = new gain_t[_working_buffers_size];
147 }
148
149 void
150 AudioDiskstream::free_working_buffers()
151 {
152         delete [] _mixdown_buffer;
153         delete [] _gain_buffer;
154         _working_buffers_size = 0;
155         _mixdown_buffer       = 0;
156         _gain_buffer          = 0;
157 }
158
159 void
160 AudioDiskstream::non_realtime_input_change ()
161 {
162         {
163                 Glib::Mutex::Lock lm (state_lock);
164
165                 if (input_change_pending.type == IOChange::NoChange) {
166                         return;
167                 }
168
169                 {
170                         RCUWriter<ChannelList> writer (channels);
171                         boost::shared_ptr<ChannelList> c = writer.get_copy();
172
173                         _n_channels.set(DataType::AUDIO, c->size());
174
175                         if (_io->n_ports().n_audio() > _n_channels.n_audio()) {
176                                 add_channel_to (c, _io->n_ports().n_audio() - _n_channels.n_audio());
177                         } else if (_io->n_ports().n_audio() < _n_channels.n_audio()) {
178                                 remove_channel_from (c, _n_channels.n_audio() - _io->n_ports().n_audio());
179                         }
180                 }
181
182                 get_input_sources ();
183                 set_capture_offset ();
184
185                 if (first_input_change) {
186                         set_align_style (_persistent_alignment_style);
187                         first_input_change = false;
188                 } else {
189                         set_align_style_from_io ();
190                 }
191
192                 input_change_pending = IOChange::NoChange;
193
194                 /* implicit unlock */
195         }
196
197         /* reset capture files */
198
199         reset_write_sources (false);
200
201         /* now refill channel buffers */
202
203         if (speed() != 1.0f || speed() != -1.0f) {
204                 seek ((framepos_t) (_session.transport_frame() * (double) speed()));
205         } else {
206                 seek (_session.transport_frame());
207         }
208 }
209
210 void
211 AudioDiskstream::non_realtime_locate (framepos_t location)
212 {
213         /* now refill channel buffers */
214
215         if (speed() != 1.0f || speed() != -1.0f) {
216                 seek ((framepos_t) (location * (double) speed()));
217         } else {
218                 seek (location);
219         }
220 }
221
222 void
223 AudioDiskstream::get_input_sources ()
224 {
225         boost::shared_ptr<ChannelList> c = channels.reader();
226
227         uint32_t n;
228         ChannelList::iterator chan;
229         uint32_t ni = _io->n_ports().n_audio();
230         vector<string> connections;
231
232         for (n = 0, chan = c->begin(); chan != c->end() && n < ni; ++chan, ++n) {
233
234                 connections.clear ();
235
236                 if (_io->nth (n)->get_connections (connections) == 0) {
237
238                         if ((*chan)->source) {
239                                 // _source->disable_metering ();
240                         }
241
242                         (*chan)->source = 0;
243
244                 } else {
245                         (*chan)->source = dynamic_cast<AudioPort*>(_session.engine().get_port_by_name (connections[0]) );
246                 }
247         }
248 }
249
250 int
251 AudioDiskstream::find_and_use_playlist (const string& name)
252 {
253         boost::shared_ptr<AudioPlaylist> playlist;
254
255         if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_session.playlists->by_name (name))) == 0) {
256                 playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, name));
257         }
258
259         if (!playlist) {
260                 error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
261                 return -1;
262         }
263
264         return use_playlist (playlist);
265 }
266
267 int
268 AudioDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
269 {
270         assert(boost::dynamic_pointer_cast<AudioPlaylist>(playlist));
271
272         Diskstream::use_playlist(playlist);
273
274         return 0;
275 }
276
277 int
278 AudioDiskstream::use_new_playlist ()
279 {
280         string newname;
281         boost::shared_ptr<AudioPlaylist> playlist;
282
283         if (!in_set_state && destructive()) {
284                 return 0;
285         }
286
287         if (_playlist) {
288                 newname = Playlist::bump_name (_playlist->name(), _session);
289         } else {
290                 newname = Playlist::bump_name (_name, _session);
291         }
292
293         if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, newname, hidden()))) != 0) {
294
295                 playlist->set_orig_diskstream_id (id());
296                 return use_playlist (playlist);
297
298         } else {
299                 return -1;
300         }
301 }
302
303 int
304 AudioDiskstream::use_copy_playlist ()
305 {
306         assert(audio_playlist());
307
308         if (destructive()) {
309                 return 0;
310         }
311
312         if (_playlist == 0) {
313                 error << string_compose(_("AudioDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
314                 return -1;
315         }
316
317         string newname;
318         boost::shared_ptr<AudioPlaylist> playlist;
319
320         newname = Playlist::bump_name (_playlist->name(), _session);
321
322         if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist>(PlaylistFactory::create (audio_playlist(), newname))) != 0) {
323                 playlist->set_orig_diskstream_id (id());
324                 return use_playlist (playlist);
325         } else {
326                 return -1;
327         }
328 }
329
330 void
331 AudioDiskstream::setup_destructive_playlist ()
332 {
333         SourceList srcs;
334         boost::shared_ptr<ChannelList> c = channels.reader();
335
336         for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
337                 srcs.push_back ((*chan)->write_source);
338         }
339
340         /* a single full-sized region */
341
342         assert (!srcs.empty ());
343
344         PropertyList plist;
345         plist.add (Properties::name, _name.val());
346         plist.add (Properties::start, 0);
347         plist.add (Properties::length, max_framepos - (max_framepos - srcs.front()->natural_position()));
348
349         boost::shared_ptr<Region> region (RegionFactory::create (srcs, plist));
350         _playlist->add_region (region, srcs.front()->natural_position());
351 }
352
353 void
354 AudioDiskstream::use_destructive_playlist ()
355 {
356         /* this is called from the XML-based constructor or ::set_destructive. when called,
357            we already have a playlist and a region, but we need to
358            set up our sources for write. we use the sources associated
359            with the (presumed single, full-extent) region.
360         */
361
362         boost::shared_ptr<Region> rp = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
363
364         if (!rp) {
365                 reset_write_sources (false, true);
366                 return;
367         }
368
369         boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
370
371         if (region == 0) {
372                 throw failed_constructor();
373         }
374
375         /* be sure to stretch the region out to the maximum length */
376
377         region->set_length (max_framepos - region->position(), this);
378
379         uint32_t n;
380         ChannelList::iterator chan;
381         boost::shared_ptr<ChannelList> c = channels.reader();
382
383         for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
384                 (*chan)->write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
385                 assert((*chan)->write_source);
386                 (*chan)->write_source->set_allow_remove_if_empty (false);
387
388                 /* this might be false if we switched modes, so force it */
389
390                 (*chan)->write_source->set_destructive (true);
391         }
392
393         /* the source list will never be reset for a destructive track */
394 }
395
396 void
397 AudioDiskstream::prepare_record_status(framepos_t capture_start_frame)
398 {
399         if (recordable() && destructive()) {
400                 boost::shared_ptr<ChannelList> c = channels.reader();
401                 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
402
403                         RingBufferNPT<CaptureTransition>::rw_vector transvec;
404                         (*chan)->capture_transition_buf->get_write_vector(&transvec);
405
406                         if (transvec.len[0] > 0) {
407                                 transvec.buf[0]->type = CaptureStart;
408                                 transvec.buf[0]->capture_val = capture_start_frame;
409                                 (*chan)->capture_transition_buf->increment_write_ptr(1);
410                         } else {
411                                 // bad!
412                                 fatal << X_("programming error: capture_transition_buf is full on rec start!  inconceivable!")
413                                         << endmsg;
414                         }
415                 }
416         }
417 }
418
419 int
420 AudioDiskstream::process (framepos_t transport_frame, pframes_t nframes, bool can_record, bool rec_monitors_input, bool& need_butler)
421 {
422         uint32_t n;
423         boost::shared_ptr<ChannelList> c = channels.reader();
424         ChannelList::iterator chan;
425         int ret = -1;
426         framecnt_t rec_offset = 0;
427         framecnt_t rec_nframes = 0;
428         bool collect_playback = false;
429
430         playback_distance = 0;
431
432         if (!_io || !_io->active()) {
433                 return 0;
434         }
435
436         check_record_status (transport_frame, can_record);
437
438         if (nframes == 0) {
439                 return 0;
440         }
441
442         Glib::Mutex::Lock sm (state_lock, Glib::TRY_LOCK);
443
444         if (!sm.locked()) {
445                 return 1;
446         }
447
448         adjust_capture_position = 0;
449
450         for (chan = c->begin(); chan != c->end(); ++chan) {
451                 (*chan)->current_capture_buffer = 0;
452                 (*chan)->current_playback_buffer = 0;
453         }
454
455         /* two conditions to test for here:
456            
457            A: this track is rec-enabled, and the session has confirmed that we can record
458            B: this track is rec-enabled, has been recording, and we are set up for auto-punch-in
459
460            The second test is necessary to capture the extra material that arrives AFTER the transport
461            frame has left the punch range (which will cause the "can_record" argument to be false).
462         */
463
464
465         // Safeguard against situations where process() goes haywire when autopunching 
466         // and last_recordable_frame < first_recordable_frame
467
468         if (last_recordable_frame < first_recordable_frame) {
469                 last_recordable_frame = max_framepos;
470         }
471         
472         OverlapType ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
473
474         calculate_record_range (ot, transport_frame, nframes, rec_nframes, rec_offset);
475         
476         if (rec_nframes && !was_recording) {
477                 capture_captured = 0;
478                 was_recording = true;
479         }
480
481         if (can_record && !_last_capture_sources.empty()) {
482                 _last_capture_sources.clear ();
483         }
484
485         if (rec_nframes) {
486
487                 uint32_t limit = _io->n_ports ().n_audio();
488
489                 /* one or more ports could already have been removed from _io, but our
490                    channel setup hasn't yet been updated. prevent us from trying to
491                    use channels that correspond to missing ports. note that the
492                    process callback (from which this is called) is always atomic
493                    with respect to port removal/addition.
494                 */
495
496                 for (n = 0, chan = c->begin(); chan != c->end() && n < limit; ++chan, ++n) {
497
498                         ChannelInfo* chaninfo (*chan);
499
500                         chaninfo->capture_buf->get_write_vector (&chaninfo->capture_vector);
501
502                         if (rec_nframes <= (framecnt_t) chaninfo->capture_vector.len[0]) {
503
504                                 chaninfo->current_capture_buffer = chaninfo->capture_vector.buf[0];
505
506                                 /* note: grab the entire port buffer, but only copy what we were supposed to
507                                    for recording, and use rec_offset
508                                 */
509
510                                 AudioPort* const ap = _io->audio (n);
511                                 assert(ap);
512                                 assert(rec_nframes <= (framecnt_t) ap->get_audio_buffer(nframes).capacity());
513                                 memcpy (chaninfo->current_capture_buffer, ap->get_audio_buffer (nframes).data(rec_offset), sizeof (Sample) * rec_nframes);
514
515
516                         } else {
517
518                                 framecnt_t total = chaninfo->capture_vector.len[0] + chaninfo->capture_vector.len[1];
519
520                                 if (rec_nframes > total) {
521                                         DiskOverrun ();
522                                         goto out;
523                                 }
524
525                                 AudioPort* const ap = _io->audio (n);
526                                 assert(ap);
527
528                                 Sample* buf = ap->get_audio_buffer(nframes).data();
529                                 framecnt_t first = chaninfo->capture_vector.len[0];
530
531                                 memcpy (chaninfo->capture_wrap_buffer, buf, sizeof (Sample) * first);
532                                 memcpy (chaninfo->capture_vector.buf[0], buf, sizeof (Sample) * first);
533                                 memcpy (chaninfo->capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
534                                 memcpy (chaninfo->capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
535
536                                 chaninfo->current_capture_buffer = chaninfo->capture_wrap_buffer;
537                         }
538                 }
539
540         } else {
541
542                 if (was_recording) {
543                         finish_capture (rec_monitors_input, c);
544                 }
545
546         }
547
548         if (rec_nframes) {
549
550                 /* data will be written to disk */
551
552                 if (rec_nframes == nframes && rec_offset == 0) {
553
554                         for (chan = c->begin(); chan != c->end(); ++chan) {
555                                 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
556                         }
557
558                         playback_distance = nframes;
559
560                 } else {
561
562
563                         /* we can't use the capture buffer as the playback buffer, because
564                            we recorded only a part of the current process' cycle data
565                            for capture.
566                         */
567
568                         collect_playback = true;
569                 }
570
571                 adjust_capture_position = rec_nframes;
572
573         } else if (can_record && record_enabled()) {
574
575                 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
576
577                 for (chan = c->begin(); chan != c->end(); ++chan) {
578                         (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
579                 }
580
581                 playback_distance = nframes;
582
583         } else {
584
585                 collect_playback = true;
586         }
587
588         if (collect_playback) {
589
590                 /* we're doing playback */
591
592                 framecnt_t necessary_samples;
593
594                 /* no varispeed playback if we're recording, because the output .... TBD */
595
596                 if (rec_nframes == 0 && _actual_speed != 1.0f) {
597                         necessary_samples = (framecnt_t) floor ((nframes * fabs (_actual_speed))) + 1;
598                 } else {
599                         necessary_samples = nframes;
600                 }
601
602                 for (chan = c->begin(); chan != c->end(); ++chan) {
603                         (*chan)->playback_buf->get_read_vector (&(*chan)->playback_vector);
604                 }
605
606                 n = 0;
607
608                 for (chan = c->begin(); chan != c->end(); ++chan, ++n) {
609
610                         ChannelInfo* chaninfo (*chan);
611
612                         if (necessary_samples <= (framecnt_t) chaninfo->playback_vector.len[0]) {
613
614                                 chaninfo->current_playback_buffer = chaninfo->playback_vector.buf[0];
615
616                         } else {
617                                 framecnt_t total = chaninfo->playback_vector.len[0] + chaninfo->playback_vector.len[1];
618
619                                 if (necessary_samples > total) {
620                                         cerr << _name << " Need " << necessary_samples << " total = " << total << endl;
621                                         cerr << "underrun for " << _name << endl;
622                                         DiskUnderrun ();
623                                         goto out;
624
625                                 } else {
626
627                                         memcpy ((char *) chaninfo->playback_wrap_buffer,
628                                                         chaninfo->playback_vector.buf[0],
629                                                         chaninfo->playback_vector.len[0] * sizeof (Sample));
630                                         memcpy (chaninfo->playback_wrap_buffer + chaninfo->playback_vector.len[0],
631                                                         chaninfo->playback_vector.buf[1],
632                                                         (necessary_samples - chaninfo->playback_vector.len[0])
633                                                                         * sizeof (Sample));
634
635                                         chaninfo->current_playback_buffer = chaninfo->playback_wrap_buffer;
636                                 }
637                         }
638                 }
639
640                 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
641                         process_varispeed_playback(nframes, c);
642                 } else {
643                         playback_distance = nframes;
644                 }
645
646                 _speed = _target_speed;
647
648         } 
649
650         ret = 0;
651
652         if (commit (nframes)) {
653                 need_butler = true;
654         }
655
656   out:
657         return ret;
658 }
659
660 void
661 AudioDiskstream::process_varispeed_playback (pframes_t nframes, boost::shared_ptr<ChannelList> c)
662 {
663         ChannelList::iterator chan;
664
665         interpolation.set_speed (_target_speed);
666
667         int channel = 0;
668         for (chan = c->begin(); chan != c->end(); ++chan, ++channel) {
669                 ChannelInfo* chaninfo (*chan);
670
671                 playback_distance = interpolation.interpolate (
672                                 channel, nframes, chaninfo->current_playback_buffer, chaninfo->speed_buffer);
673
674                 chaninfo->current_playback_buffer = chaninfo->speed_buffer;
675         }
676 }
677
678 bool
679 AudioDiskstream::commit (framecnt_t /* nframes */)
680 {
681         bool need_butler = false;
682
683         if (!_io || !_io->active()) {
684                 return false;
685         }
686
687         if (_actual_speed < 0.0) {
688                 playback_sample -= playback_distance;
689         } else {
690                 playback_sample += playback_distance;
691         }
692
693         boost::shared_ptr<ChannelList> c = channels.reader();
694         for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
695
696                 (*chan)->playback_buf->increment_read_ptr (playback_distance);
697
698                 if (adjust_capture_position) {
699                         (*chan)->capture_buf->increment_write_ptr (adjust_capture_position);
700                 }
701         }
702
703         if (adjust_capture_position != 0) {
704                 capture_captured += adjust_capture_position;
705                 adjust_capture_position = 0;
706         }
707         
708         if (c->empty()) {
709                 return false;
710         }
711         
712         if (_slaved) {
713                 if (_io && _io->active()) {
714                         need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
715                 } else {
716                         need_butler = false;
717                 }
718         } else {
719                 if (_io && _io->active()) {
720                         need_butler = ((framecnt_t) c->front()->playback_buf->write_space() >= disk_io_chunk_frames)
721                                 || ((framecnt_t) c->front()->capture_buf->read_space() >= disk_io_chunk_frames);
722                 } else {
723                         need_butler = ((framecnt_t) c->front()->capture_buf->read_space() >= disk_io_chunk_frames);
724                 }
725         }
726
727         return need_butler;
728 }
729
730 void
731 AudioDiskstream::set_pending_overwrite (bool yn)
732 {
733         /* called from audio thread, so we can use the read ptr and playback sample as we wish */
734
735         _pending_overwrite = yn;
736
737         overwrite_frame = playback_sample;
738
739         boost::shared_ptr<ChannelList> c = channels.reader ();
740         if (!c->empty ()) {
741                 overwrite_offset = c->front()->playback_buf->get_read_ptr();
742         }
743 }
744
745 int
746 AudioDiskstream::overwrite_existing_buffers ()
747 {
748         boost::shared_ptr<ChannelList> c = channels.reader();
749         if (c->empty ()) {
750                 _pending_overwrite = false;
751                 return 0;
752         }
753         
754         Sample* mixdown_buffer;
755         float* gain_buffer;
756         int ret = -1;
757         bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
758
759         overwrite_queued = false;
760
761         /* assume all are the same size */
762         framecnt_t size = c->front()->playback_buf->bufsize();
763
764         mixdown_buffer = new Sample[size];
765         gain_buffer = new float[size];
766
767         /* reduce size so that we can fill the buffer correctly. */
768         size--;
769
770         uint32_t n=0;
771         framepos_t start;
772
773         for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
774
775                 start = overwrite_frame;
776                 framecnt_t cnt = size;
777
778                 /* to fill the buffer without resetting the playback sample, we need to
779                    do it one or two chunks (normally two).
780
781                    |----------------------------------------------------------------------|
782
783                                        ^
784                                        overwrite_offset
785                     |<- second chunk->||<----------------- first chunk ------------------>|
786
787                 */
788
789                 framecnt_t to_read = size - overwrite_offset;
790
791                 if (read ((*chan)->playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, *chan, n, reversed)) {
792                         error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
793                                          _id, size, playback_sample) << endmsg;
794                         goto out;
795                 }
796
797                 if (cnt > to_read) {
798
799                         cnt -= to_read;
800
801                         if (read ((*chan)->playback_buf->buffer(), mixdown_buffer, gain_buffer,
802                                   start, cnt, *chan, n, reversed)) {
803                                 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
804                                                  _id, size, playback_sample) << endmsg;
805                                 goto out;
806                         }
807                 }
808         }
809
810         ret = 0;
811
812   out:
813         _pending_overwrite = false;
814         delete [] gain_buffer;
815         delete [] mixdown_buffer;
816         return ret;
817 }
818
819 int
820 AudioDiskstream::seek (framepos_t frame, bool complete_refill)
821 {
822         uint32_t n;
823         int ret = -1;
824         ChannelList::iterator chan;
825         boost::shared_ptr<ChannelList> c = channels.reader();
826
827         Glib::Mutex::Lock lm (state_lock);
828
829         for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
830                 (*chan)->playback_buf->reset ();
831                 (*chan)->capture_buf->reset ();
832         }
833
834         /* can't rec-enable in destructive mode if transport is before start */
835
836         if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
837                 disengage_record_enable ();
838         }
839
840         playback_sample = frame;
841         file_frame = frame;
842
843         if (complete_refill) {
844                 while ((ret = do_refill_with_alloc ()) > 0) ;
845         } else {
846                 ret = do_refill_with_alloc ();
847         }
848
849         return ret;
850 }
851
852 int
853 AudioDiskstream::can_internal_playback_seek (framecnt_t distance)
854 {
855         ChannelList::iterator chan;
856         boost::shared_ptr<ChannelList> c = channels.reader();
857
858         for (chan = c->begin(); chan != c->end(); ++chan) {
859                 if ((*chan)->playback_buf->read_space() < (size_t) distance) {
860                         return false;
861                 }
862         }
863         return true;
864 }
865
866 int
867 AudioDiskstream::internal_playback_seek (framecnt_t distance)
868 {
869         ChannelList::iterator chan;
870         boost::shared_ptr<ChannelList> c = channels.reader();
871
872         for (chan = c->begin(); chan != c->end(); ++chan) {
873                 (*chan)->playback_buf->increment_read_ptr (distance);
874         }
875
876         if (first_recordable_frame < max_framepos) {
877                 first_recordable_frame += distance;
878         }
879         playback_sample += distance;
880
881         return 0;
882 }
883
884 int
885 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer, 
886                        framepos_t& start, framecnt_t cnt,
887                        ChannelInfo* /*channel_info*/, int channel, bool reversed)
888 {
889         framecnt_t this_read = 0;
890         bool reloop = false;
891         framepos_t loop_end = 0;
892         framepos_t loop_start = 0;
893         framecnt_t offset = 0;
894         Location *loc = 0;
895
896         /* XXX we don't currently play loops in reverse. not sure why */
897
898         if (!reversed) {
899
900                 framecnt_t loop_length = 0;
901
902                 /* Make the use of a Location atomic for this read operation.
903
904                    Note: Locations don't get deleted, so all we care about
905                    when I say "atomic" is that we are always pointing to
906                    the same one and using a start/length values obtained
907                    just once.
908                 */
909
910                 if ((loc = loop_location) != 0) {
911                         loop_start = loc->start();
912                         loop_end = loc->end();
913                         loop_length = loop_end - loop_start;
914                 }
915
916                 /* if we are looping, ensure that the first frame we read is at the correct
917                    position within the loop.
918                 */
919
920                 if (loc && start >= loop_end) {
921                         //cerr << "start adjusted from " << start;
922                         start = loop_start + ((start - loop_start) % loop_length);
923                         //cerr << "to " << start << endl;
924                 }
925
926                 //cerr << "start is " << start << "  loopstart: " << loop_start << "  loopend: " << loop_end << endl;
927         }
928
929         if (reversed) {
930                 start -= cnt;
931         }
932         
933         while (cnt) {
934
935                 /* take any loop into account. we can't read past the end of the loop. */
936
937                 if (loc && (loop_end - start < cnt)) {
938                         this_read = loop_end - start;
939                         //cerr << "reloop true: thisread: " << this_read << "  cnt: " << cnt << endl;
940                         reloop = true;
941                 } else {
942                         reloop = false;
943                         this_read = cnt;
944                 }
945
946                 if (this_read == 0) {
947                         break;
948                 }
949
950                 this_read = min(cnt,this_read);
951
952                 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
953                         error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), _id, this_read,
954                                          start) << endmsg;
955                         return -1;
956                 }
957
958                 _read_data_count = _playlist->read_data_count();
959
960                 if (reversed) {
961
962                         swap_by_ptr (buf, buf + this_read - 1);
963
964                 } else {
965
966                         /* if we read to the end of the loop, go back to the beginning */
967
968                         if (reloop) {
969                                 start = loop_start;
970                         } else {
971                                 start += this_read;
972                         }
973                 }
974
975                 cnt -= this_read;
976                 offset += this_read;
977         }
978
979         return 0;
980 }
981
982 int
983 AudioDiskstream::do_refill_with_alloc ()
984 {
985         Sample* mix_buf  = new Sample[disk_io_chunk_frames];
986         float*  gain_buf = new float[disk_io_chunk_frames];
987
988         int ret = _do_refill(mix_buf, gain_buf);
989
990         delete [] mix_buf;
991         delete [] gain_buf;
992
993         return ret;
994 }
995
996 int
997 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
998 {
999         int32_t ret = 0;
1000         framecnt_t to_read;
1001         RingBufferNPT<Sample>::rw_vector vector;
1002         bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1003         framecnt_t total_space;
1004         framecnt_t zero_fill;
1005         uint32_t chan_n;
1006         ChannelList::iterator i;
1007         boost::shared_ptr<ChannelList> c = channels.reader();
1008         framecnt_t ts;
1009
1010         if (c->empty()) {
1011                 return 0;
1012         }
1013
1014         assert(mixdown_buffer);
1015         assert(gain_buffer);
1016
1017         vector.buf[0] = 0;
1018         vector.len[0] = 0;
1019         vector.buf[1] = 0;
1020         vector.len[1] = 0;
1021
1022         c->front()->playback_buf->get_write_vector (&vector);
1023
1024         if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1025                 return 0;
1026         }
1027
1028         /* if there are 2+ chunks of disk i/o possible for
1029            this track, let the caller know so that it can arrange
1030            for us to be called again, ASAP.
1031         */
1032
1033         if (total_space >= (_slaved?3:2) * disk_io_chunk_frames) {
1034                 ret = 1;
1035         }
1036
1037         /* if we're running close to normal speed and there isn't enough
1038            space to do disk_io_chunk_frames of I/O, then don't bother.
1039
1040            at higher speeds, just do it because the sync between butler
1041            and audio thread may not be good enough.
1042         */
1043
1044         if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1045                 return 0;
1046         }
1047
1048         /* when slaved, don't try to get too close to the read pointer. this
1049            leaves space for the buffer reversal to have something useful to
1050            work with.
1051         */
1052
1053         if (_slaved && total_space < (framecnt_t) (c->front()->playback_buf->bufsize() / 2)) {
1054                 return 0;
1055         }
1056
1057         /* never do more than disk_io_chunk_frames worth of disk input per call (limit doesn't apply for memset) */
1058
1059         total_space = min (disk_io_chunk_frames, total_space);
1060
1061         if (reversed) {
1062
1063                 if (file_frame == 0) {
1064
1065                         /* at start: nothing to do but fill with silence */
1066
1067                         for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1068
1069                                 ChannelInfo* chan (*i);
1070                                 chan->playback_buf->get_write_vector (&vector);
1071                                 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1072                                 if (vector.len[1]) {
1073                                         memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1074                                 }
1075                                 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1076                         }
1077                         return 0;
1078                 }
1079
1080                 if (file_frame < total_space) {
1081
1082                         /* too close to the start: read what we can,
1083                            and then zero fill the rest
1084                         */
1085
1086                         zero_fill = total_space - file_frame;
1087                         total_space = file_frame;
1088
1089                 } else {
1090
1091                         zero_fill = 0;
1092                 }
1093
1094         } else {
1095
1096                 if (file_frame == max_framepos) {
1097
1098                         /* at end: nothing to do but fill with silence */
1099
1100                         for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1101
1102                                 ChannelInfo* chan (*i);
1103                                 chan->playback_buf->get_write_vector (&vector);
1104                                 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1105                                 if (vector.len[1]) {
1106                                         memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1107                                 }
1108                                 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1109                         }
1110                         return 0;
1111                 }
1112
1113                 if (file_frame > max_framepos - total_space) {
1114
1115                         /* to close to the end: read what we can, and zero fill the rest */
1116
1117                         zero_fill = total_space - (max_framepos - file_frame);
1118                         total_space = max_framepos - file_frame;
1119
1120                 } else {
1121                         zero_fill = 0;
1122                 }
1123         }
1124
1125         framepos_t file_frame_tmp = 0;
1126
1127         for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1128
1129                 ChannelInfo* chan (*i);
1130                 Sample* buf1;
1131                 Sample* buf2;
1132                 framecnt_t len1, len2;
1133
1134                 chan->playback_buf->get_write_vector (&vector);
1135
1136                 if ((framecnt_t) vector.len[0] > disk_io_chunk_frames) {
1137
1138                         /* we're not going to fill the first chunk, so certainly do not bother with the
1139                            other part. it won't be connected with the part we do fill, as in:
1140
1141                            .... => writable space
1142                            ++++ => readable space
1143                            ^^^^ => 1 x disk_io_chunk_frames that would be filled
1144
1145                            |......|+++++++++++++|...............................|
1146                            buf1                buf0
1147                                                 ^^^^^^^^^^^^^^^
1148
1149
1150                            So, just pretend that the buf1 part isn't there.
1151
1152                         */
1153
1154                         vector.buf[1] = 0;
1155                         vector.len[1] = 0;
1156
1157                 }
1158
1159                 ts = total_space;
1160                 file_frame_tmp = file_frame;
1161
1162                 buf1 = vector.buf[0];
1163                 len1 = vector.len[0];
1164                 buf2 = vector.buf[1];
1165                 len2 = vector.len[1];
1166
1167                 to_read = min (ts, len1);
1168                 to_read = min (to_read, disk_io_chunk_frames);
1169
1170                 if (to_read) {
1171
1172                         if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1173                                 ret = -1;
1174                                 goto out;
1175                         }
1176
1177                         chan->playback_buf->increment_write_ptr (to_read);
1178                         ts -= to_read;
1179                 }
1180
1181                 to_read = min (ts, len2);
1182
1183                 if (to_read) {
1184
1185                         /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1186                            so read some or all of vector.len[1] as well.
1187                         */
1188
1189                         if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1190                                 ret = -1;
1191                                 goto out;
1192                         }
1193
1194                         chan->playback_buf->increment_write_ptr (to_read);
1195                 }
1196
1197                 if (zero_fill) {
1198                         /* do something */
1199                 }
1200
1201         }
1202
1203         file_frame = file_frame_tmp;
1204
1205   out:
1206
1207         return ret;
1208 }
1209
1210 /** Flush pending data to disk.
1211  *
1212  * Important note: this function will write *AT MOST* disk_io_chunk_frames
1213  * of data to disk. it will never write more than that.  If it writes that
1214  * much and there is more than that waiting to be written, it will return 1,
1215  * otherwise 0 on success or -1 on failure.
1216  *
1217  * If there is less than disk_io_chunk_frames to be written, no data will be
1218  * written at all unless @a force_flush is true.
1219  */
1220 int
1221 AudioDiskstream::do_flush (RunContext /*context*/, bool force_flush)
1222 {
1223         uint32_t to_write;
1224         int32_t ret = 0;
1225         RingBufferNPT<Sample>::rw_vector vector;
1226         RingBufferNPT<CaptureTransition>::rw_vector transvec;
1227         framecnt_t total;
1228
1229         _write_data_count = 0;
1230
1231         transvec.buf[0] = 0;
1232         transvec.buf[1] = 0;
1233         vector.buf[0] = 0;
1234         vector.buf[1] = 0;
1235
1236         boost::shared_ptr<ChannelList> c = channels.reader();
1237         for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1238
1239                 (*chan)->capture_buf->get_read_vector (&vector);
1240
1241                 total = vector.len[0] + vector.len[1];
1242
1243                 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1244                         goto out;
1245                 }
1246
1247                 /* if there are 2+ chunks of disk i/o possible for
1248                    this track, let the caller know so that it can arrange
1249                    for us to be called again, ASAP.
1250
1251                    if we are forcing a flush, then if there is* any* extra
1252                    work, let the caller know.
1253
1254                    if we are no longer recording and there is any extra work,
1255                    let the caller know too.
1256                 */
1257
1258                 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1259                         ret = 1;
1260                 }
1261
1262                 to_write = min (disk_io_chunk_frames, (framecnt_t) vector.len[0]);
1263
1264                 // check the transition buffer when recording destructive
1265                 // important that we get this after the capture buf
1266
1267                 if (destructive()) {
1268                         (*chan)->capture_transition_buf->get_read_vector(&transvec);
1269                         size_t transcount = transvec.len[0] + transvec.len[1];
1270                         bool have_start = false;
1271                         size_t ti;
1272
1273                         for (ti=0; ti < transcount; ++ti) {
1274                                 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1275
1276                                 if (captrans.type == CaptureStart) {
1277                                         // by definition, the first data we got above represents the given capture pos
1278
1279                                         (*chan)->write_source->mark_capture_start (captrans.capture_val);
1280                                         (*chan)->curr_capture_cnt = 0;
1281
1282                                         have_start = true;
1283                                 }
1284                                 else if (captrans.type == CaptureEnd) {
1285
1286                                         // capture end, the capture_val represents total frames in capture
1287
1288                                         if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
1289
1290                                                 // shorten to make the write a perfect fit
1291                                                 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
1292
1293                                                 if (nto_write < to_write) {
1294                                                         ret = 1; // should we?
1295                                                 }
1296                                                 to_write = nto_write;
1297
1298                                                 (*chan)->write_source->mark_capture_end ();
1299
1300                                                 // increment past this transition, but go no further
1301                                                 ++ti;
1302                                                 break;
1303                                         }
1304                                         else {
1305                                                 // actually ends just beyond this chunk, so force more work
1306                                                 ret = 1;
1307                                                 break;
1308                                         }
1309                                 }
1310                         }
1311
1312                         if (ti > 0) {
1313                                 (*chan)->capture_transition_buf->increment_read_ptr(ti);
1314                         }
1315                 }
1316
1317                 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
1318                         error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1319                         return -1;
1320                 }
1321
1322                 (*chan)->capture_buf->increment_read_ptr (to_write);
1323                 (*chan)->curr_capture_cnt += to_write;
1324
1325                 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1326
1327                         /* we wrote all of vector.len[0] but it wasn't an entire
1328                            disk_io_chunk_frames of data, so arrange for some part
1329                            of vector.len[1] to be flushed to disk as well.
1330                         */
1331
1332                         to_write = min ((framecnt_t)(disk_io_chunk_frames - to_write), (framecnt_t) vector.len[1]);
1333
1334                         if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1335                                 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1336                                 return -1;
1337                         }
1338
1339                         _write_data_count += (*chan)->write_source->write_data_count();
1340
1341                         (*chan)->capture_buf->increment_read_ptr (to_write);
1342                         (*chan)->curr_capture_cnt += to_write;
1343                 }
1344         }
1345
1346   out:
1347         return ret;
1348 }
1349
1350 void
1351 AudioDiskstream::transport_stopped_wallclock (struct tm& when, time_t twhen, bool abort_capture)
1352 {
1353         uint32_t buffer_position;
1354         bool more_work = true;
1355         int err = 0;
1356         boost::shared_ptr<AudioRegion> region;
1357         framecnt_t total_capture;
1358         SourceList srcs;
1359         SourceList::iterator src;
1360         ChannelList::iterator chan;
1361         vector<CaptureInfo*>::iterator ci;
1362         boost::shared_ptr<ChannelList> c = channels.reader();
1363         uint32_t n = 0;
1364         bool mark_write_completed = false;
1365
1366         finish_capture (true, c);
1367
1368         /* butler is already stopped, but there may be work to do
1369            to flush remaining data to disk.
1370         */
1371
1372         while (more_work && !err) {
1373                 switch (do_flush (TransportContext, true)) {
1374                 case 0:
1375                         more_work = false;
1376                         break;
1377                 case 1:
1378                         break;
1379                 case -1:
1380                         error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1381                         err++;
1382                 }
1383         }
1384
1385         /* XXX is there anything we can do if err != 0 ? */
1386         Glib::Mutex::Lock lm (capture_info_lock);
1387
1388         if (capture_info.empty()) {
1389                 return;
1390         }
1391
1392         if (abort_capture) {
1393
1394                 if (destructive()) {
1395                         goto outout;
1396                 }
1397
1398                 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1399
1400                         if ((*chan)->write_source) {
1401
1402                                 (*chan)->write_source->mark_for_remove ();
1403                                 (*chan)->write_source->drop_references ();
1404                                 _session.remove_source ((*chan)->write_source);
1405                                 (*chan)->write_source.reset ();
1406                         }
1407
1408                         /* new source set up in "out" below */
1409                 }
1410
1411                 goto out;
1412         }
1413
1414         for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1415                 total_capture += (*ci)->frames;
1416         }
1417
1418         /* figure out the name for this take */
1419
1420         for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1421
1422                 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1423
1424                 if (s) {
1425                         srcs.push_back (s);
1426                         if (s->unstubify ()) {
1427                                 error << string_compose (_("Could not move capture file from %1"), s->path()) << endmsg;
1428                         }
1429                         s->update_header (capture_info.front()->start, when, twhen);
1430                         s->set_captured_for (_name.val());
1431                         s->mark_immutable ();
1432
1433                         if (Config->get_auto_analyse_audio()) {
1434                                 Analyser::queue_source_for_analysis (s, true);
1435                         }
1436                 }
1437         }
1438
1439         /* destructive tracks have a single, never changing region */
1440
1441         if (destructive()) {
1442
1443                 /* send a signal that any UI can pick up to do the right thing. there is
1444                    a small problem here in that a UI may need the peak data to be ready
1445                    for the data that was recorded and this isn't interlocked with that
1446                    process. this problem is deferred to the UI.
1447                  */
1448
1449                 _playlist->LayeringChanged(); // XXX this may not get the UI to do the right thing
1450
1451         } else {
1452
1453                 string whole_file_region_name;
1454                 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1455
1456                 /* Register a new region with the Session that
1457                    describes the entire source. Do this first
1458                    so that any sub-regions will obviously be
1459                    children of this one (later!)
1460                 */
1461
1462                 try {
1463                         PropertyList plist;
1464
1465                         plist.add (Properties::start, c->front()->write_source->last_capture_start_frame());
1466                         plist.add (Properties::length, total_capture);
1467                         plist.add (Properties::name, whole_file_region_name);
1468                         boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1469                         rx->set_automatic (true);
1470                         rx->set_whole_file (true);
1471
1472                         region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1473                         region->special_set_position (capture_info.front()->start);
1474                 }
1475
1476
1477                 catch (failed_constructor& err) {
1478                         error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1479                         /* XXX what now? */
1480                 }
1481
1482                 _last_capture_sources.insert (_last_capture_sources.end(), srcs.begin(), srcs.end());
1483
1484                 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1485
1486                 _playlist->clear_changes ();
1487                 _playlist->freeze ();
1488
1489                 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1490
1491                         string region_name;
1492
1493                         RegionFactory::region_name (region_name, whole_file_region_name, false);
1494
1495                         // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add region " << region_name << endl;
1496
1497                         try {
1498
1499                                 PropertyList plist;
1500                                 
1501                                 plist.add (Properties::start, buffer_position);
1502                                 plist.add (Properties::length, (*ci)->frames);
1503                                 plist.add (Properties::name, region_name);
1504                                 
1505                                 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1506                                 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1507                         }
1508
1509                         catch (failed_constructor& err) {
1510                                 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1511                                 continue; /* XXX is this OK? */
1512                         }
1513
1514                         i_am_the_modifier++;
1515
1516                         if (_playlist->explicit_relayering()) {
1517                                 /* We are in `explicit relayering' mode, so we must specify which layer this new region
1518                                    should end up on.  Put it at the top.
1519                                 */
1520                                 region->set_layer (_playlist->top_layer() + 1);
1521                                 region->set_pending_explicit_relayer (true);
1522                         }
1523                         
1524                         _playlist->add_region (region, (*ci)->start, 1, non_layered());
1525                         i_am_the_modifier--;
1526
1527                         buffer_position += (*ci)->frames;
1528                 }
1529
1530                 _playlist->thaw ();
1531                 _session.add_command (new StatefulDiffCommand (_playlist));
1532         }
1533
1534         mark_write_completed = true;
1535
1536   out:
1537         reset_write_sources (mark_write_completed);
1538
1539   outout:
1540
1541         for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1542                 delete *ci;
1543         }
1544
1545         capture_info.clear ();
1546         capture_start_frame = 0;
1547 }
1548
1549 void
1550 AudioDiskstream::transport_looped (framepos_t transport_frame)
1551 {
1552         if (was_recording) {
1553                 // all we need to do is finish this capture, with modified capture length
1554                 boost::shared_ptr<ChannelList> c = channels.reader();
1555
1556                 // adjust the capture length knowing that the data will be recorded to disk
1557                 // only necessary after the first loop where we're recording
1558                 if (capture_info.size() == 0) {
1559                         capture_captured += _capture_offset;
1560
1561                         if (_alignment_style == ExistingMaterial) {
1562                                 capture_captured += _session.worst_output_latency();
1563                         } else {
1564                                 capture_captured += _roll_delay;
1565                         }
1566                 }
1567
1568                 finish_capture (true, c);
1569
1570                 // the next region will start recording via the normal mechanism
1571                 // we'll set the start position to the current transport pos
1572                 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1573                 capture_start_frame = transport_frame;
1574                 first_recordable_frame = transport_frame; // mild lie
1575                 last_recordable_frame = max_framepos;
1576                 was_recording = true;
1577
1578                 if (recordable() && destructive()) {
1579                         for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1580
1581                                 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1582                                 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1583
1584                                 if (transvec.len[0] > 0) {
1585                                         transvec.buf[0]->type = CaptureStart;
1586                                         transvec.buf[0]->capture_val = capture_start_frame;
1587                                         (*chan)->capture_transition_buf->increment_write_ptr(1);
1588                                 }
1589                                 else {
1590                                         // bad!
1591                                         fatal << X_("programming error: capture_transition_buf is full on rec loop!  inconceivable!")
1592                                               << endmsg;
1593                                 }
1594                         }
1595                 }
1596
1597         }
1598 }
1599
1600 void
1601 AudioDiskstream::finish_capture (bool /*rec_monitors_input*/, boost::shared_ptr<ChannelList> c)
1602 {
1603         was_recording = false;
1604         first_recordable_frame = max_framepos;
1605         last_recordable_frame = max_framepos;
1606
1607         if (capture_captured == 0) {
1608                 return;
1609         }
1610
1611         if (recordable() && destructive()) {
1612                 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1613
1614                         RingBufferNPT<CaptureTransition>::rw_vector transvec;
1615                         (*chan)->capture_transition_buf->get_write_vector(&transvec);
1616
1617                         if (transvec.len[0] > 0) {
1618                                 transvec.buf[0]->type = CaptureEnd;
1619                                 transvec.buf[0]->capture_val = capture_captured;
1620                                 (*chan)->capture_transition_buf->increment_write_ptr(1);
1621                         }
1622                         else {
1623                                 // bad!
1624                                 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record!  inconceivable!")) << endmsg;
1625                         }
1626                 }
1627         }
1628
1629
1630         CaptureInfo* ci = new CaptureInfo;
1631
1632         ci->start =  capture_start_frame;
1633         ci->frames = capture_captured;
1634
1635         /* XXX theoretical race condition here. Need atomic exchange ?
1636            However, the circumstances when this is called right
1637            now (either on record-disable or transport_stopped)
1638            mean that no actual race exists. I think ...
1639            We now have a capture_info_lock, but it is only to be used
1640            to synchronize in the transport_stop and the capture info
1641            accessors, so that invalidation will not occur (both non-realtime).
1642         */
1643
1644         // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1645
1646         capture_info.push_back (ci);
1647         capture_captured = 0;
1648
1649         /* now we've finished a capture, reset first_recordable_frame for next time */
1650         first_recordable_frame = max_framepos;
1651 }
1652
1653 void
1654 AudioDiskstream::set_record_enabled (bool yn)
1655 {
1656         if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_audio() == 0) {
1657                 return;
1658         }
1659
1660         /* can't rec-enable in destructive mode if transport is before start */
1661
1662         if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1663                 return;
1664         }
1665
1666         /* yes, i know that this not proof against race conditions, but its
1667            good enough. i think.
1668         */
1669
1670         if (record_enabled() != yn) {
1671                 if (yn) {
1672                         engage_record_enable ();
1673                 } else {
1674                         disengage_record_enable ();
1675                 }
1676         }
1677 }
1678
1679 void
1680 AudioDiskstream::engage_record_enable ()
1681 {
1682         bool rolling = _session.transport_speed() != 0.0f;
1683         boost::shared_ptr<ChannelList> c = channels.reader();
1684
1685         g_atomic_int_set (&_record_enabled, 1);
1686         capturing_sources.clear ();
1687
1688         if (Config->get_monitoring_model() == HardwareMonitoring) {
1689
1690                 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1691                         if ((*chan)->source) {
1692                                 (*chan)->source->ensure_monitor_input (!(_session.config.get_auto_input() && rolling));
1693                         }
1694                         capturing_sources.push_back ((*chan)->write_source);
1695                         (*chan)->write_source->mark_streaming_write_started ();
1696                 }
1697
1698         } else {
1699                 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1700                         capturing_sources.push_back ((*chan)->write_source);
1701                         (*chan)->write_source->mark_streaming_write_started ();
1702                 }
1703         }
1704
1705         RecordEnableChanged (); /* EMIT SIGNAL */
1706 }
1707
1708 void
1709 AudioDiskstream::disengage_record_enable ()
1710 {
1711         g_atomic_int_set (&_record_enabled, 0);
1712         boost::shared_ptr<ChannelList> c = channels.reader();
1713         if (Config->get_monitoring_model() == HardwareMonitoring) {
1714                 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1715                         if ((*chan)->source) {
1716                                 (*chan)->source->ensure_monitor_input (false);
1717                         }
1718                 }
1719         }
1720         capturing_sources.clear ();
1721         RecordEnableChanged (); /* EMIT SIGNAL */
1722 }
1723
1724 XMLNode&
1725 AudioDiskstream::get_state ()
1726 {
1727         XMLNode* node = new XMLNode ("Diskstream");
1728         char buf[64] = "";
1729         LocaleGuard lg (X_("POSIX"));
1730         boost::shared_ptr<ChannelList> c = channels.reader();
1731
1732         node->add_property ("flags", enum_2_string (_flags));
1733
1734         snprintf (buf, sizeof(buf), "%zd", c->size());
1735         node->add_property ("channels", buf);
1736
1737         node->add_property ("playlist", _playlist->name());
1738
1739         snprintf (buf, sizeof(buf), "%.12g", _visible_speed);
1740         node->add_property ("speed", buf);
1741
1742         node->add_property("name", _name);
1743         id().print (buf, sizeof (buf));
1744         node->add_property("id", buf);
1745
1746         if (!capturing_sources.empty() && _session.get_record_enabled()) {
1747
1748                 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1749                 XMLNode* cs_grandchild;
1750
1751                 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1752                         cs_grandchild = new XMLNode (X_("file"));
1753                         cs_grandchild->add_property (X_("path"), (*i)->path());
1754                         cs_child->add_child_nocopy (*cs_grandchild);
1755                 }
1756
1757                 /* store the location where capture will start */
1758
1759                 Location* pi;
1760
1761                 if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1762                         snprintf (buf, sizeof (buf), "%" PRId64, pi->start());
1763                 } else {
1764                         snprintf (buf, sizeof (buf), "%" PRId64, _session.transport_frame());
1765                 }
1766
1767                 cs_child->add_property (X_("at"), buf);
1768                 node->add_child_nocopy (*cs_child);
1769         }
1770
1771         if (_extra_xml) {
1772                 node->add_child_copy (*_extra_xml);
1773         }
1774
1775         return* node;
1776 }
1777
1778 int
1779 AudioDiskstream::set_state (const XMLNode& node, int /*version*/)
1780 {
1781         const XMLProperty* prop;
1782         XMLNodeList nlist = node.children();
1783         XMLNodeIterator niter;
1784         uint32_t nchans = 1;
1785         XMLNode* capture_pending_node = 0;
1786         LocaleGuard lg (X_("POSIX"));
1787
1788         in_set_state = true;
1789
1790         for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1791                 if ((*niter)->name() == IO::state_node_name) {
1792                         deprecated_io_node = new XMLNode (**niter);
1793                 }
1794
1795                 if ((*niter)->name() == X_("CapturingSources")) {
1796                         capture_pending_node = *niter;
1797                 }
1798         }
1799
1800         /* prevent write sources from being created */
1801
1802         in_set_state = true;
1803
1804         if ((prop = node.property ("name")) != 0) {
1805                 _name = prop->value();
1806         }
1807
1808         if (deprecated_io_node) {
1809                 if ((prop = deprecated_io_node->property ("id")) != 0) {
1810                         _id = prop->value ();
1811                 }
1812         } else {
1813                 if ((prop = node.property ("id")) != 0) {
1814                         _id = prop->value ();
1815                 }
1816         }
1817
1818         if ((prop = node.property ("flags")) != 0) {
1819                 _flags = Flag (string_2_enum (prop->value(), _flags));
1820         }
1821
1822         if ((prop = node.property ("channels")) != 0) {
1823                 nchans = atoi (prop->value().c_str());
1824         }
1825
1826         // create necessary extra channels
1827         // we are always constructed with one and we always need one
1828
1829         _n_channels.set(DataType::AUDIO, channels.reader()->size());
1830
1831         if (nchans > _n_channels.n_audio()) {
1832
1833                 add_channel (nchans - _n_channels.n_audio());
1834                 IO::PortCountChanged(_n_channels);
1835
1836         } else if (nchans < _n_channels.n_audio()) {
1837
1838                 remove_channel (_n_channels.n_audio() - nchans);
1839         }
1840
1841         if ((prop = node.property ("playlist")) == 0) {
1842                 return -1;
1843         }
1844
1845         {
1846                 bool had_playlist = (_playlist != 0);
1847
1848                 if (find_and_use_playlist (prop->value())) {
1849                         return -1;
1850                 }
1851
1852                 if (!had_playlist) {
1853                         _playlist->set_orig_diskstream_id (id());
1854                 }
1855
1856                 if (!destructive() && capture_pending_node) {
1857                         /* destructive streams have one and only one source per channel,
1858                            and so they never end up in pending capture in any useful
1859                            sense.
1860                         */
1861                         use_pending_capture_data (*capture_pending_node);
1862                 }
1863
1864         }
1865
1866         if ((prop = node.property ("speed")) != 0) {
1867                 double sp = atof (prop->value().c_str());
1868
1869                 if (realtime_set_speed (sp, false)) {
1870                         non_realtime_set_speed ();
1871                 }
1872         }
1873
1874         in_set_state = false;
1875
1876         /* make sure this is clear before we do anything else */
1877
1878         capturing_sources.clear ();
1879
1880         /* write sources are handled when we handle the input set
1881            up of the IO that owns this DS (::non_realtime_input_change())
1882         */
1883
1884         return 0;
1885 }
1886
1887 int
1888 AudioDiskstream::use_new_write_source (uint32_t n)
1889 {
1890         boost::shared_ptr<ChannelList> c = channels.reader();
1891
1892         if (!recordable()) {
1893                 return 1;
1894         }
1895
1896         if (n >= c->size()) {
1897                 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1898                 return -1;
1899         }
1900
1901         ChannelInfo* chan = (*c)[n];
1902
1903         try {
1904                 /* file starts off as a stub file, it will be converted
1905                    when we're done with a capture pass.
1906                 */
1907
1908                 if ((chan->write_source = _session.create_audio_source_for_session (n_channels().n_audio(), 
1909                                                                                     name(), n, destructive(), 
1910                                                                                     true)) == 0) {
1911                         throw failed_constructor();
1912                 }
1913         }
1914
1915         catch (failed_constructor &err) {
1916                 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1917                 chan->write_source.reset ();
1918                 return -1;
1919         }
1920
1921         /* do not remove destructive files even if they are empty */
1922
1923         chan->write_source->set_allow_remove_if_empty (!destructive());
1924         
1925         return 0;
1926 }
1927
1928 list<boost::shared_ptr<Source> > 
1929 AudioDiskstream::steal_write_sources()
1930 {
1931         /* not possible to steal audio write sources */
1932         list<boost::shared_ptr<Source> > ret;
1933         return ret;
1934 }
1935
1936 void
1937 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool /*force*/)
1938 {
1939         ChannelList::iterator chan;
1940         boost::shared_ptr<ChannelList> c = channels.reader();
1941         uint32_t n;
1942
1943         if (!_session.writable() || !recordable()) {
1944                 return;
1945         }
1946
1947         capturing_sources.clear ();
1948
1949         for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1950
1951                 if (!destructive()) {
1952
1953                         if ((*chan)->write_source) {
1954
1955                                 if (mark_write_complete) {
1956                                         (*chan)->write_source->mark_streaming_write_completed ();
1957                                         (*chan)->write_source->done_with_peakfile_writes ();
1958                                 }
1959
1960                                 if ((*chan)->write_source->removable()) {
1961                                         (*chan)->write_source->mark_for_remove ();
1962                                         (*chan)->write_source->drop_references ();
1963                                         _session.remove_source ((*chan)->write_source);
1964                                 }
1965                                 
1966                                 (*chan)->write_source.reset ();
1967                         }
1968
1969                         use_new_write_source (n);
1970
1971                         if (record_enabled()) {
1972                                 capturing_sources.push_back ((*chan)->write_source);
1973                         }
1974
1975                 } else {
1976
1977                         if ((*chan)->write_source == 0) {
1978                                 use_new_write_source (n);
1979                         }
1980                 }
1981         }
1982
1983         if (destructive() && !c->empty ()) {
1984
1985                 /* we now have all our write sources set up, so create the
1986                    playlist's single region.
1987                 */
1988
1989                 if (_playlist->empty()) {
1990                         setup_destructive_playlist ();
1991                 }
1992         }
1993 }
1994
1995 int
1996 AudioDiskstream::rename_write_sources ()
1997 {
1998         ChannelList::iterator chan;
1999         boost::shared_ptr<ChannelList> c = channels.reader();
2000         uint32_t n;
2001
2002         for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
2003                 if ((*chan)->write_source != 0) {
2004                         (*chan)->write_source->set_source_name (_name.val(), destructive());
2005                         /* XXX what to do if one of them fails ? */
2006                 }
2007         }
2008
2009         return 0;
2010 }
2011
2012 void
2013 AudioDiskstream::set_block_size (pframes_t /*nframes*/)
2014 {
2015         if (_session.get_block_size() > speed_buffer_size) {
2016                 speed_buffer_size = _session.get_block_size();
2017                 boost::shared_ptr<ChannelList> c = channels.reader();
2018
2019                 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2020                         if ((*chan)->speed_buffer)
2021                                 delete [] (*chan)->speed_buffer;
2022                         (*chan)->speed_buffer = new Sample[speed_buffer_size];
2023                 }
2024         }
2025         allocate_temporary_buffers ();
2026 }
2027
2028 void
2029 AudioDiskstream::allocate_temporary_buffers ()
2030 {
2031         /* make sure the wrap buffer is at least large enough to deal
2032            with the speeds up to 1.2, to allow for micro-variation
2033            when slaving to MTC, Timecode etc.
2034         */
2035
2036         double const sp = max (fabsf (_actual_speed), 1.2f);
2037         framecnt_t required_wrap_size = (framecnt_t) floor (_session.get_block_size() * sp) + 1;
2038
2039         if (required_wrap_size > wrap_buffer_size) {
2040
2041                 boost::shared_ptr<ChannelList> c = channels.reader();
2042
2043                 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2044                         if ((*chan)->playback_wrap_buffer)
2045                                 delete [] (*chan)->playback_wrap_buffer;
2046                         (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
2047                         if ((*chan)->capture_wrap_buffer)
2048                                 delete [] (*chan)->capture_wrap_buffer;
2049                         (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
2050                 }
2051
2052                 wrap_buffer_size = required_wrap_size;
2053         }
2054 }
2055
2056 void
2057 AudioDiskstream::monitor_input (bool yn)
2058 {
2059         boost::shared_ptr<ChannelList> c = channels.reader();
2060
2061         for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2062
2063                 if ((*chan)->source) {
2064                         (*chan)->source->ensure_monitor_input (yn);
2065                 }
2066         }
2067 }
2068
2069 void
2070 AudioDiskstream::set_align_style_from_io ()
2071 {
2072         bool have_physical = false;
2073
2074         if (_io == 0) {
2075                 return;
2076         }
2077
2078         get_input_sources ();
2079
2080         boost::shared_ptr<ChannelList> c = channels.reader();
2081
2082         for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2083                 if ((*chan)->source && (*chan)->source->flags() & JackPortIsPhysical) {
2084                         have_physical = true;
2085                         break;
2086                 }
2087         }
2088
2089         if (have_physical) {
2090                 set_align_style (ExistingMaterial);
2091         } else {
2092                 set_align_style (CaptureTime);
2093         }
2094 }
2095
2096 int
2097 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2098 {
2099         while (how_many--) {
2100                 c->push_back (new ChannelInfo(_session.butler()->audio_diskstream_playback_buffer_size(), 
2101                                               _session.butler()->audio_diskstream_capture_buffer_size(),
2102                                               speed_buffer_size, wrap_buffer_size));
2103                 interpolation.add_channel_to (_session.butler()->audio_diskstream_playback_buffer_size(), speed_buffer_size);
2104         }
2105
2106         _n_channels.set(DataType::AUDIO, c->size());
2107
2108         return 0;
2109 }
2110
2111 int
2112 AudioDiskstream::add_channel (uint32_t how_many)
2113 {
2114         RCUWriter<ChannelList> writer (channels);
2115         boost::shared_ptr<ChannelList> c = writer.get_copy();
2116
2117         return add_channel_to (c, how_many);
2118 }
2119
2120 int
2121 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2122 {
2123         while (how_many-- && !c->empty()) {
2124                 delete c->back();
2125                 c->pop_back();
2126                 interpolation.remove_channel_from ();
2127         }
2128
2129         _n_channels.set(DataType::AUDIO, c->size());
2130
2131         return 0;
2132 }
2133
2134 int
2135 AudioDiskstream::remove_channel (uint32_t how_many)
2136 {
2137         RCUWriter<ChannelList> writer (channels);
2138         boost::shared_ptr<ChannelList> c = writer.get_copy();
2139
2140         return remove_channel_from (c, how_many);
2141 }
2142
2143 float
2144 AudioDiskstream::playback_buffer_load () const
2145 {
2146         boost::shared_ptr<ChannelList> c = channels.reader();
2147
2148         if (c->empty ()) {
2149                 return 0;
2150         }
2151
2152         return (float) ((double) c->front()->playback_buf->read_space()/
2153                         (double) c->front()->playback_buf->bufsize());
2154 }
2155
2156 float
2157 AudioDiskstream::capture_buffer_load () const
2158 {
2159         boost::shared_ptr<ChannelList> c = channels.reader();
2160
2161         if (c->empty ()) {
2162                 return 0;
2163         }
2164         
2165         return (float) ((double) c->front()->capture_buf->write_space()/
2166                         (double) c->front()->capture_buf->bufsize());
2167 }
2168
2169 int
2170 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2171 {
2172         const XMLProperty* prop;
2173         XMLNodeList nlist = node.children();
2174         XMLNodeIterator niter;
2175         boost::shared_ptr<AudioFileSource> fs;
2176         boost::shared_ptr<AudioFileSource> first_fs;
2177         SourceList pending_sources;
2178         framepos_t position;
2179
2180         if ((prop = node.property (X_("at"))) == 0) {
2181                 return -1;
2182         }
2183
2184         if (sscanf (prop->value().c_str(), "%" PRIu64, &position) != 1) {
2185                 return -1;
2186         }
2187
2188         for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2189                 if ((*niter)->name() == X_("file")) {
2190
2191                         if ((prop = (*niter)->property (X_("path"))) == 0) {
2192                                 continue;
2193                         }
2194
2195                         // This protects sessions from errant CapturingSources in stored sessions
2196                         struct stat sbuf;
2197                         if (stat (prop->value().c_str(), &sbuf)) {
2198                                 continue;
2199                         }
2200
2201                         try {
2202                                 fs = boost::dynamic_pointer_cast<AudioFileSource> (
2203                                                 SourceFactory::createWritable (DataType::AUDIO, _session,
2204                                                                                prop->value(), string(), false, _session.frame_rate()));
2205                         }
2206
2207                         catch (failed_constructor& err) {
2208                                 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2209                                                   _name, prop->value())
2210                                       << endmsg;
2211                                 return -1;
2212                         }
2213
2214                         pending_sources.push_back (fs);
2215
2216                         if (first_fs == 0) {
2217                                 first_fs = fs;
2218                         }
2219
2220                         fs->set_captured_for (_name.val());
2221                 }
2222         }
2223
2224         if (pending_sources.size() == 0) {
2225                 /* nothing can be done */
2226                 return 1;
2227         }
2228
2229         if (pending_sources.size() != _n_channels.n_audio()) {
2230                 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2231                       << endmsg;
2232                 return -1;
2233         }
2234
2235         boost::shared_ptr<AudioRegion> region;
2236
2237         try {
2238                 
2239                 PropertyList plist;
2240                 
2241                 plist.add (Properties::start, 0);
2242                 plist.add (Properties::length, first_fs->length (first_fs->timeline_position()));
2243                 plist.add (Properties::name, region_name_from_path (first_fs->name(), true));
2244
2245                 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, plist));
2246
2247                 region->set_automatic (true);
2248                 region->set_whole_file (true);
2249                 region->special_set_position (0);
2250         }
2251
2252         catch (failed_constructor& err) {
2253                 error << string_compose (
2254                                 _("%1: cannot create whole-file region from pending capture sources"),
2255                                 _name) << endmsg;
2256
2257                 return -1;
2258         }
2259
2260         _playlist->add_region (region, position);
2261
2262         return 0;
2263 }
2264
2265 int
2266 AudioDiskstream::set_non_layered (bool yn)
2267 {
2268         if (yn != non_layered()) {
2269
2270                 if (yn) {
2271                         _flags = Flag (_flags | NonLayered);
2272                 } else {
2273                         _flags = Flag (_flags & ~NonLayered);
2274                 }
2275         }
2276
2277         return 0;
2278 }
2279
2280 int
2281 AudioDiskstream::set_destructive (bool yn)
2282 {
2283         if (yn != destructive()) {
2284
2285                 if (yn) {
2286                         bool bounce_ignored;
2287                         /* requestor should already have checked this and
2288                            bounced if necessary and desired
2289                         */
2290                         if (!can_become_destructive (bounce_ignored)) {
2291                                 return -1;
2292                         }
2293                         _flags = Flag (_flags | Destructive);
2294                         use_destructive_playlist ();
2295                 } else {
2296                         _flags = Flag (_flags & ~Destructive);
2297                         reset_write_sources (true, true);
2298                 }
2299         }
2300
2301         return 0;
2302 }
2303
2304 bool
2305 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2306 {
2307         if (!_playlist) {
2308                 requires_bounce = false;
2309                 return false;
2310         }
2311
2312         /* is there only one region ? */
2313
2314         if (_playlist->n_regions() != 1) {
2315                 requires_bounce = true;
2316                 return false;
2317         }
2318
2319         boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2320         if (!first) {
2321                 requires_bounce = false;
2322                 return true;
2323         }
2324
2325         /* do the source(s) for the region cover the session start position ? */
2326
2327         if (first->position() != _session.current_start_frame()) {
2328                 if (first->start() > _session.current_start_frame()) {
2329                         requires_bounce = true;
2330                         return false;
2331                 }
2332         }
2333
2334         /* is the source used by only 1 playlist ? */
2335
2336         boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2337
2338         assert (afirst);
2339
2340         if (_session.playlists->source_use_count (afirst->source()) > 1) {
2341                 requires_bounce = true;
2342                 return false;
2343         }
2344
2345         requires_bounce = false;
2346         return true;
2347 }
2348
2349 void 
2350 AudioDiskstream::adjust_playback_buffering ()
2351 {
2352         boost::shared_ptr<ChannelList> c = channels.reader();
2353
2354         for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2355                 (*chan)->resize_playback (_session.butler()->audio_diskstream_playback_buffer_size());
2356         }
2357 }
2358
2359 void 
2360 AudioDiskstream::adjust_capture_buffering ()
2361 {
2362         boost::shared_ptr<ChannelList> c = channels.reader();
2363
2364         for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2365                 (*chan)->resize_capture (_session.butler()->audio_diskstream_capture_buffer_size());
2366         }
2367 }
2368
2369 AudioDiskstream::ChannelInfo::ChannelInfo (framecnt_t playback_bufsize, framecnt_t capture_bufsize, framecnt_t speed_size, framecnt_t wrap_size)
2370 {
2371         peak_power = 0.0f;
2372         source = 0;
2373         current_capture_buffer = 0;
2374         current_playback_buffer = 0;
2375         curr_capture_cnt = 0;
2376
2377         speed_buffer = new Sample[speed_size];
2378         playback_wrap_buffer = new Sample[wrap_size];
2379         capture_wrap_buffer = new Sample[wrap_size];
2380
2381         playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2382         capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2383         capture_transition_buf = new RingBufferNPT<CaptureTransition> (256);
2384
2385         /* touch the ringbuffer buffers, which will cause
2386            them to be mapped into locked physical RAM if
2387            we're running with mlockall(). this doesn't do
2388            much if we're not.
2389         */
2390
2391         memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2392         memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2393         memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2394 }
2395
2396 void
2397 AudioDiskstream::ChannelInfo::resize_playback (framecnt_t playback_bufsize)
2398 {
2399         delete playback_buf;
2400         playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2401         memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2402 }
2403
2404 void
2405 AudioDiskstream::ChannelInfo::resize_capture (framecnt_t capture_bufsize)
2406 {
2407         delete capture_buf;
2408
2409         capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2410         memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2411 }
2412
2413 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2414 {
2415         write_source.reset ();
2416
2417         delete [] speed_buffer;
2418         speed_buffer = 0;
2419
2420         delete [] playback_wrap_buffer;
2421         playback_wrap_buffer = 0;
2422
2423         delete [] capture_wrap_buffer;
2424         capture_wrap_buffer = 0;
2425
2426         delete playback_buf;
2427         playback_buf = 0;
2428
2429         delete capture_buf;
2430         capture_buf = 0;
2431
2432         delete capture_transition_buf;
2433         capture_transition_buf = 0;
2434 }
2435