Don't update start more than once when reversing. I don't think this is causing...
[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                         file_frame = 0;
1089
1090                 } else {
1091
1092                         zero_fill = 0;
1093                 }
1094
1095         } else {
1096
1097                 if (file_frame == max_framepos) {
1098
1099                         /* at end: nothing to do but fill with silence */
1100
1101                         for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1102
1103                                 ChannelInfo* chan (*i);
1104                                 chan->playback_buf->get_write_vector (&vector);
1105                                 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1106                                 if (vector.len[1]) {
1107                                         memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1108                                 }
1109                                 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1110                         }
1111                         return 0;
1112                 }
1113
1114                 if (file_frame > max_framepos - total_space) {
1115
1116                         /* to close to the end: read what we can, and zero fill the rest */
1117
1118                         zero_fill = total_space - (max_framepos - file_frame);
1119                         total_space = max_framepos - file_frame;
1120
1121                 } else {
1122                         zero_fill = 0;
1123                 }
1124         }
1125
1126         framepos_t file_frame_tmp = 0;
1127
1128         for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1129
1130                 ChannelInfo* chan (*i);
1131                 Sample* buf1;
1132                 Sample* buf2;
1133                 framecnt_t len1, len2;
1134
1135                 chan->playback_buf->get_write_vector (&vector);
1136
1137                 if ((framecnt_t) vector.len[0] > disk_io_chunk_frames) {
1138
1139                         /* we're not going to fill the first chunk, so certainly do not bother with the
1140                            other part. it won't be connected with the part we do fill, as in:
1141
1142                            .... => writable space
1143                            ++++ => readable space
1144                            ^^^^ => 1 x disk_io_chunk_frames that would be filled
1145
1146                            |......|+++++++++++++|...............................|
1147                            buf1                buf0
1148                                                 ^^^^^^^^^^^^^^^
1149
1150
1151                            So, just pretend that the buf1 part isn't there.
1152
1153                         */
1154
1155                         vector.buf[1] = 0;
1156                         vector.len[1] = 0;
1157
1158                 }
1159
1160                 ts = total_space;
1161                 file_frame_tmp = file_frame;
1162
1163                 buf1 = vector.buf[0];
1164                 len1 = vector.len[0];
1165                 buf2 = vector.buf[1];
1166                 len2 = vector.len[1];
1167
1168                 to_read = min (ts, len1);
1169                 to_read = min (to_read, disk_io_chunk_frames);
1170
1171                 if (to_read) {
1172
1173                         if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1174                                 ret = -1;
1175                                 goto out;
1176                         }
1177
1178                         chan->playback_buf->increment_write_ptr (to_read);
1179                         ts -= to_read;
1180                 }
1181
1182                 to_read = min (ts, len2);
1183
1184                 if (to_read) {
1185
1186                         /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1187                            so read some or all of vector.len[1] as well.
1188                         */
1189
1190                         if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1191                                 ret = -1;
1192                                 goto out;
1193                         }
1194
1195                         chan->playback_buf->increment_write_ptr (to_read);
1196                 }
1197
1198                 if (zero_fill) {
1199                         /* do something */
1200                 }
1201
1202         }
1203
1204         file_frame = file_frame_tmp;
1205
1206   out:
1207
1208         return ret;
1209 }
1210
1211 /** Flush pending data to disk.
1212  *
1213  * Important note: this function will write *AT MOST* disk_io_chunk_frames
1214  * of data to disk. it will never write more than that.  If it writes that
1215  * much and there is more than that waiting to be written, it will return 1,
1216  * otherwise 0 on success or -1 on failure.
1217  *
1218  * If there is less than disk_io_chunk_frames to be written, no data will be
1219  * written at all unless @a force_flush is true.
1220  */
1221 int
1222 AudioDiskstream::do_flush (RunContext /*context*/, bool force_flush)
1223 {
1224         uint32_t to_write;
1225         int32_t ret = 0;
1226         RingBufferNPT<Sample>::rw_vector vector;
1227         RingBufferNPT<CaptureTransition>::rw_vector transvec;
1228         framecnt_t total;
1229
1230         _write_data_count = 0;
1231
1232         transvec.buf[0] = 0;
1233         transvec.buf[1] = 0;
1234         vector.buf[0] = 0;
1235         vector.buf[1] = 0;
1236
1237         boost::shared_ptr<ChannelList> c = channels.reader();
1238         for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1239
1240                 (*chan)->capture_buf->get_read_vector (&vector);
1241
1242                 total = vector.len[0] + vector.len[1];
1243
1244                 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1245                         goto out;
1246                 }
1247
1248                 /* if there are 2+ chunks of disk i/o possible for
1249                    this track, let the caller know so that it can arrange
1250                    for us to be called again, ASAP.
1251
1252                    if we are forcing a flush, then if there is* any* extra
1253                    work, let the caller know.
1254
1255                    if we are no longer recording and there is any extra work,
1256                    let the caller know too.
1257                 */
1258
1259                 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1260                         ret = 1;
1261                 }
1262
1263                 to_write = min (disk_io_chunk_frames, (framecnt_t) vector.len[0]);
1264
1265                 // check the transition buffer when recording destructive
1266                 // important that we get this after the capture buf
1267
1268                 if (destructive()) {
1269                         (*chan)->capture_transition_buf->get_read_vector(&transvec);
1270                         size_t transcount = transvec.len[0] + transvec.len[1];
1271                         bool have_start = false;
1272                         size_t ti;
1273
1274                         for (ti=0; ti < transcount; ++ti) {
1275                                 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1276
1277                                 if (captrans.type == CaptureStart) {
1278                                         // by definition, the first data we got above represents the given capture pos
1279
1280                                         (*chan)->write_source->mark_capture_start (captrans.capture_val);
1281                                         (*chan)->curr_capture_cnt = 0;
1282
1283                                         have_start = true;
1284                                 }
1285                                 else if (captrans.type == CaptureEnd) {
1286
1287                                         // capture end, the capture_val represents total frames in capture
1288
1289                                         if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
1290
1291                                                 // shorten to make the write a perfect fit
1292                                                 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
1293
1294                                                 if (nto_write < to_write) {
1295                                                         ret = 1; // should we?
1296                                                 }
1297                                                 to_write = nto_write;
1298
1299                                                 (*chan)->write_source->mark_capture_end ();
1300
1301                                                 // increment past this transition, but go no further
1302                                                 ++ti;
1303                                                 break;
1304                                         }
1305                                         else {
1306                                                 // actually ends just beyond this chunk, so force more work
1307                                                 ret = 1;
1308                                                 break;
1309                                         }
1310                                 }
1311                         }
1312
1313                         if (ti > 0) {
1314                                 (*chan)->capture_transition_buf->increment_read_ptr(ti);
1315                         }
1316                 }
1317
1318                 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
1319                         error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1320                         return -1;
1321                 }
1322
1323                 (*chan)->capture_buf->increment_read_ptr (to_write);
1324                 (*chan)->curr_capture_cnt += to_write;
1325
1326                 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1327
1328                         /* we wrote all of vector.len[0] but it wasn't an entire
1329                            disk_io_chunk_frames of data, so arrange for some part
1330                            of vector.len[1] to be flushed to disk as well.
1331                         */
1332
1333                         to_write = min ((framecnt_t)(disk_io_chunk_frames - to_write), (framecnt_t) vector.len[1]);
1334
1335                         if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1336                                 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1337                                 return -1;
1338                         }
1339
1340                         _write_data_count += (*chan)->write_source->write_data_count();
1341
1342                         (*chan)->capture_buf->increment_read_ptr (to_write);
1343                         (*chan)->curr_capture_cnt += to_write;
1344                 }
1345         }
1346
1347   out:
1348         return ret;
1349 }
1350
1351 void
1352 AudioDiskstream::transport_stopped_wallclock (struct tm& when, time_t twhen, bool abort_capture)
1353 {
1354         uint32_t buffer_position;
1355         bool more_work = true;
1356         int err = 0;
1357         boost::shared_ptr<AudioRegion> region;
1358         framecnt_t total_capture;
1359         SourceList srcs;
1360         SourceList::iterator src;
1361         ChannelList::iterator chan;
1362         vector<CaptureInfo*>::iterator ci;
1363         boost::shared_ptr<ChannelList> c = channels.reader();
1364         uint32_t n = 0;
1365         bool mark_write_completed = false;
1366
1367         finish_capture (true, c);
1368
1369         /* butler is already stopped, but there may be work to do
1370            to flush remaining data to disk.
1371         */
1372
1373         while (more_work && !err) {
1374                 switch (do_flush (TransportContext, true)) {
1375                 case 0:
1376                         more_work = false;
1377                         break;
1378                 case 1:
1379                         break;
1380                 case -1:
1381                         error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1382                         err++;
1383                 }
1384         }
1385
1386         /* XXX is there anything we can do if err != 0 ? */
1387         Glib::Mutex::Lock lm (capture_info_lock);
1388
1389         if (capture_info.empty()) {
1390                 return;
1391         }
1392
1393         if (abort_capture) {
1394
1395                 if (destructive()) {
1396                         goto outout;
1397                 }
1398
1399                 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1400
1401                         if ((*chan)->write_source) {
1402
1403                                 (*chan)->write_source->mark_for_remove ();
1404                                 (*chan)->write_source->drop_references ();
1405                                 _session.remove_source ((*chan)->write_source);
1406                                 (*chan)->write_source.reset ();
1407                         }
1408
1409                         /* new source set up in "out" below */
1410                 }
1411
1412                 goto out;
1413         }
1414
1415         for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1416                 total_capture += (*ci)->frames;
1417         }
1418
1419         /* figure out the name for this take */
1420
1421         for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1422
1423                 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1424
1425                 if (s) {
1426                         srcs.push_back (s);
1427                         if (s->unstubify ()) {
1428                                 error << string_compose (_("Could not move capture file from %1"), s->path()) << endmsg;
1429                         }
1430                         s->update_header (capture_info.front()->start, when, twhen);
1431                         s->set_captured_for (_name.val());
1432                         s->mark_immutable ();
1433
1434                         if (Config->get_auto_analyse_audio()) {
1435                                 Analyser::queue_source_for_analysis (s, true);
1436                         }
1437                 }
1438         }
1439
1440         /* destructive tracks have a single, never changing region */
1441
1442         if (destructive()) {
1443
1444                 /* send a signal that any UI can pick up to do the right thing. there is
1445                    a small problem here in that a UI may need the peak data to be ready
1446                    for the data that was recorded and this isn't interlocked with that
1447                    process. this problem is deferred to the UI.
1448                  */
1449
1450                 _playlist->LayeringChanged(); // XXX this may not get the UI to do the right thing
1451
1452         } else {
1453
1454                 string whole_file_region_name;
1455                 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1456
1457                 /* Register a new region with the Session that
1458                    describes the entire source. Do this first
1459                    so that any sub-regions will obviously be
1460                    children of this one (later!)
1461                 */
1462
1463                 try {
1464                         PropertyList plist;
1465
1466                         plist.add (Properties::start, c->front()->write_source->last_capture_start_frame());
1467                         plist.add (Properties::length, total_capture);
1468                         plist.add (Properties::name, whole_file_region_name);
1469                         boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1470                         rx->set_automatic (true);
1471                         rx->set_whole_file (true);
1472
1473                         region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1474                         region->special_set_position (capture_info.front()->start);
1475                 }
1476
1477
1478                 catch (failed_constructor& err) {
1479                         error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1480                         /* XXX what now? */
1481                 }
1482
1483                 _last_capture_sources.insert (_last_capture_sources.end(), srcs.begin(), srcs.end());
1484
1485                 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1486
1487                 _playlist->clear_changes ();
1488                 _playlist->freeze ();
1489
1490                 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1491
1492                         string region_name;
1493
1494                         RegionFactory::region_name (region_name, whole_file_region_name, false);
1495
1496                         // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add region " << region_name << endl;
1497
1498                         try {
1499
1500                                 PropertyList plist;
1501                                 
1502                                 plist.add (Properties::start, buffer_position);
1503                                 plist.add (Properties::length, (*ci)->frames);
1504                                 plist.add (Properties::name, region_name);
1505                                 
1506                                 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1507                                 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1508                         }
1509
1510                         catch (failed_constructor& err) {
1511                                 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1512                                 continue; /* XXX is this OK? */
1513                         }
1514
1515                         i_am_the_modifier++;
1516
1517                         if (_playlist->explicit_relayering()) {
1518                                 /* We are in `explicit relayering' mode, so we must specify which layer this new region
1519                                    should end up on.  Put it at the top.
1520                                 */
1521                                 region->set_layer (_playlist->top_layer() + 1);
1522                                 region->set_pending_explicit_relayer (true);
1523                         }
1524                         
1525                         _playlist->add_region (region, (*ci)->start, 1, non_layered());
1526                         i_am_the_modifier--;
1527
1528                         buffer_position += (*ci)->frames;
1529                 }
1530
1531                 _playlist->thaw ();
1532                 _session.add_command (new StatefulDiffCommand (_playlist));
1533         }
1534
1535         mark_write_completed = true;
1536
1537   out:
1538         reset_write_sources (mark_write_completed);
1539
1540   outout:
1541
1542         for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1543                 delete *ci;
1544         }
1545
1546         capture_info.clear ();
1547         capture_start_frame = 0;
1548 }
1549
1550 void
1551 AudioDiskstream::transport_looped (framepos_t transport_frame)
1552 {
1553         if (was_recording) {
1554                 // all we need to do is finish this capture, with modified capture length
1555                 boost::shared_ptr<ChannelList> c = channels.reader();
1556
1557                 // adjust the capture length knowing that the data will be recorded to disk
1558                 // only necessary after the first loop where we're recording
1559                 if (capture_info.size() == 0) {
1560                         capture_captured += _capture_offset;
1561
1562                         if (_alignment_style == ExistingMaterial) {
1563                                 capture_captured += _session.worst_output_latency();
1564                         } else {
1565                                 capture_captured += _roll_delay;
1566                         }
1567                 }
1568
1569                 finish_capture (true, c);
1570
1571                 // the next region will start recording via the normal mechanism
1572                 // we'll set the start position to the current transport pos
1573                 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1574                 capture_start_frame = transport_frame;
1575                 first_recordable_frame = transport_frame; // mild lie
1576                 last_recordable_frame = max_framepos;
1577                 was_recording = true;
1578
1579                 if (recordable() && destructive()) {
1580                         for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1581
1582                                 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1583                                 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1584
1585                                 if (transvec.len[0] > 0) {
1586                                         transvec.buf[0]->type = CaptureStart;
1587                                         transvec.buf[0]->capture_val = capture_start_frame;
1588                                         (*chan)->capture_transition_buf->increment_write_ptr(1);
1589                                 }
1590                                 else {
1591                                         // bad!
1592                                         fatal << X_("programming error: capture_transition_buf is full on rec loop!  inconceivable!")
1593                                               << endmsg;
1594                                 }
1595                         }
1596                 }
1597
1598         }
1599 }
1600
1601 void
1602 AudioDiskstream::finish_capture (bool /*rec_monitors_input*/, boost::shared_ptr<ChannelList> c)
1603 {
1604         was_recording = false;
1605         first_recordable_frame = max_framepos;
1606         last_recordable_frame = max_framepos;
1607
1608         if (capture_captured == 0) {
1609                 return;
1610         }
1611
1612         if (recordable() && destructive()) {
1613                 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1614
1615                         RingBufferNPT<CaptureTransition>::rw_vector transvec;
1616                         (*chan)->capture_transition_buf->get_write_vector(&transvec);
1617
1618                         if (transvec.len[0] > 0) {
1619                                 transvec.buf[0]->type = CaptureEnd;
1620                                 transvec.buf[0]->capture_val = capture_captured;
1621                                 (*chan)->capture_transition_buf->increment_write_ptr(1);
1622                         }
1623                         else {
1624                                 // bad!
1625                                 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record!  inconceivable!")) << endmsg;
1626                         }
1627                 }
1628         }
1629
1630
1631         CaptureInfo* ci = new CaptureInfo;
1632
1633         ci->start =  capture_start_frame;
1634         ci->frames = capture_captured;
1635
1636         /* XXX theoretical race condition here. Need atomic exchange ?
1637            However, the circumstances when this is called right
1638            now (either on record-disable or transport_stopped)
1639            mean that no actual race exists. I think ...
1640            We now have a capture_info_lock, but it is only to be used
1641            to synchronize in the transport_stop and the capture info
1642            accessors, so that invalidation will not occur (both non-realtime).
1643         */
1644
1645         // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1646
1647         capture_info.push_back (ci);
1648         capture_captured = 0;
1649
1650         /* now we've finished a capture, reset first_recordable_frame for next time */
1651         first_recordable_frame = max_framepos;
1652 }
1653
1654 void
1655 AudioDiskstream::set_record_enabled (bool yn)
1656 {
1657         if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_audio() == 0) {
1658                 return;
1659         }
1660
1661         /* can't rec-enable in destructive mode if transport is before start */
1662
1663         if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1664                 return;
1665         }
1666
1667         /* yes, i know that this not proof against race conditions, but its
1668            good enough. i think.
1669         */
1670
1671         if (record_enabled() != yn) {
1672                 if (yn) {
1673                         engage_record_enable ();
1674                 } else {
1675                         disengage_record_enable ();
1676                 }
1677         }
1678 }
1679
1680 void
1681 AudioDiskstream::engage_record_enable ()
1682 {
1683         bool rolling = _session.transport_speed() != 0.0f;
1684         boost::shared_ptr<ChannelList> c = channels.reader();
1685
1686         g_atomic_int_set (&_record_enabled, 1);
1687         capturing_sources.clear ();
1688
1689         if (Config->get_monitoring_model() == HardwareMonitoring) {
1690
1691                 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1692                         if ((*chan)->source) {
1693                                 (*chan)->source->ensure_monitor_input (!(_session.config.get_auto_input() && rolling));
1694                         }
1695                         capturing_sources.push_back ((*chan)->write_source);
1696                         (*chan)->write_source->mark_streaming_write_started ();
1697                 }
1698
1699         } else {
1700                 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1701                         capturing_sources.push_back ((*chan)->write_source);
1702                         (*chan)->write_source->mark_streaming_write_started ();
1703                 }
1704         }
1705
1706         RecordEnableChanged (); /* EMIT SIGNAL */
1707 }
1708
1709 void
1710 AudioDiskstream::disengage_record_enable ()
1711 {
1712         g_atomic_int_set (&_record_enabled, 0);
1713         boost::shared_ptr<ChannelList> c = channels.reader();
1714         if (Config->get_monitoring_model() == HardwareMonitoring) {
1715                 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1716                         if ((*chan)->source) {
1717                                 (*chan)->source->ensure_monitor_input (false);
1718                         }
1719                 }
1720         }
1721         capturing_sources.clear ();
1722         RecordEnableChanged (); /* EMIT SIGNAL */
1723 }
1724
1725 XMLNode&
1726 AudioDiskstream::get_state ()
1727 {
1728         XMLNode* node = new XMLNode ("Diskstream");
1729         char buf[64] = "";
1730         LocaleGuard lg (X_("POSIX"));
1731         boost::shared_ptr<ChannelList> c = channels.reader();
1732
1733         node->add_property ("flags", enum_2_string (_flags));
1734
1735         snprintf (buf, sizeof(buf), "%zd", c->size());
1736         node->add_property ("channels", buf);
1737
1738         node->add_property ("playlist", _playlist->name());
1739
1740         snprintf (buf, sizeof(buf), "%.12g", _visible_speed);
1741         node->add_property ("speed", buf);
1742
1743         node->add_property("name", _name);
1744         id().print (buf, sizeof (buf));
1745         node->add_property("id", buf);
1746
1747         if (!capturing_sources.empty() && _session.get_record_enabled()) {
1748
1749                 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1750                 XMLNode* cs_grandchild;
1751
1752                 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1753                         cs_grandchild = new XMLNode (X_("file"));
1754                         cs_grandchild->add_property (X_("path"), (*i)->path());
1755                         cs_child->add_child_nocopy (*cs_grandchild);
1756                 }
1757
1758                 /* store the location where capture will start */
1759
1760                 Location* pi;
1761
1762                 if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1763                         snprintf (buf, sizeof (buf), "%" PRId64, pi->start());
1764                 } else {
1765                         snprintf (buf, sizeof (buf), "%" PRId64, _session.transport_frame());
1766                 }
1767
1768                 cs_child->add_property (X_("at"), buf);
1769                 node->add_child_nocopy (*cs_child);
1770         }
1771
1772         if (_extra_xml) {
1773                 node->add_child_copy (*_extra_xml);
1774         }
1775
1776         return* node;
1777 }
1778
1779 int
1780 AudioDiskstream::set_state (const XMLNode& node, int /*version*/)
1781 {
1782         const XMLProperty* prop;
1783         XMLNodeList nlist = node.children();
1784         XMLNodeIterator niter;
1785         uint32_t nchans = 1;
1786         XMLNode* capture_pending_node = 0;
1787         LocaleGuard lg (X_("POSIX"));
1788
1789         in_set_state = true;
1790
1791         for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1792                 if ((*niter)->name() == IO::state_node_name) {
1793                         deprecated_io_node = new XMLNode (**niter);
1794                 }
1795
1796                 if ((*niter)->name() == X_("CapturingSources")) {
1797                         capture_pending_node = *niter;
1798                 }
1799         }
1800
1801         /* prevent write sources from being created */
1802
1803         in_set_state = true;
1804
1805         if ((prop = node.property ("name")) != 0) {
1806                 _name = prop->value();
1807         }
1808
1809         if (deprecated_io_node) {
1810                 if ((prop = deprecated_io_node->property ("id")) != 0) {
1811                         _id = prop->value ();
1812                 }
1813         } else {
1814                 if ((prop = node.property ("id")) != 0) {
1815                         _id = prop->value ();
1816                 }
1817         }
1818
1819         if ((prop = node.property ("flags")) != 0) {
1820                 _flags = Flag (string_2_enum (prop->value(), _flags));
1821         }
1822
1823         if ((prop = node.property ("channels")) != 0) {
1824                 nchans = atoi (prop->value().c_str());
1825         }
1826
1827         // create necessary extra channels
1828         // we are always constructed with one and we always need one
1829
1830         _n_channels.set(DataType::AUDIO, channels.reader()->size());
1831
1832         if (nchans > _n_channels.n_audio()) {
1833
1834                 add_channel (nchans - _n_channels.n_audio());
1835                 IO::PortCountChanged(_n_channels);
1836
1837         } else if (nchans < _n_channels.n_audio()) {
1838
1839                 remove_channel (_n_channels.n_audio() - nchans);
1840         }
1841
1842         if ((prop = node.property ("playlist")) == 0) {
1843                 return -1;
1844         }
1845
1846         {
1847                 bool had_playlist = (_playlist != 0);
1848
1849                 if (find_and_use_playlist (prop->value())) {
1850                         return -1;
1851                 }
1852
1853                 if (!had_playlist) {
1854                         _playlist->set_orig_diskstream_id (id());
1855                 }
1856
1857                 if (!destructive() && capture_pending_node) {
1858                         /* destructive streams have one and only one source per channel,
1859                            and so they never end up in pending capture in any useful
1860                            sense.
1861                         */
1862                         use_pending_capture_data (*capture_pending_node);
1863                 }
1864
1865         }
1866
1867         if ((prop = node.property ("speed")) != 0) {
1868                 double sp = atof (prop->value().c_str());
1869
1870                 if (realtime_set_speed (sp, false)) {
1871                         non_realtime_set_speed ();
1872                 }
1873         }
1874
1875         in_set_state = false;
1876
1877         /* make sure this is clear before we do anything else */
1878
1879         capturing_sources.clear ();
1880
1881         /* write sources are handled when we handle the input set
1882            up of the IO that owns this DS (::non_realtime_input_change())
1883         */
1884
1885         return 0;
1886 }
1887
1888 int
1889 AudioDiskstream::use_new_write_source (uint32_t n)
1890 {
1891         boost::shared_ptr<ChannelList> c = channels.reader();
1892
1893         if (!recordable()) {
1894                 return 1;
1895         }
1896
1897         if (n >= c->size()) {
1898                 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1899                 return -1;
1900         }
1901
1902         ChannelInfo* chan = (*c)[n];
1903
1904         try {
1905                 /* file starts off as a stub file, it will be converted
1906                    when we're done with a capture pass.
1907                 */
1908
1909                 if ((chan->write_source = _session.create_audio_source_for_session (n_channels().n_audio(), 
1910                                                                                     name(), n, destructive(), 
1911                                                                                     true)) == 0) {
1912                         throw failed_constructor();
1913                 }
1914         }
1915
1916         catch (failed_constructor &err) {
1917                 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1918                 chan->write_source.reset ();
1919                 return -1;
1920         }
1921
1922         /* do not remove destructive files even if they are empty */
1923
1924         chan->write_source->set_allow_remove_if_empty (!destructive());
1925         
1926         return 0;
1927 }
1928
1929 list<boost::shared_ptr<Source> > 
1930 AudioDiskstream::steal_write_sources()
1931 {
1932         /* not possible to steal audio write sources */
1933         list<boost::shared_ptr<Source> > ret;
1934         return ret;
1935 }
1936
1937 void
1938 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool /*force*/)
1939 {
1940         ChannelList::iterator chan;
1941         boost::shared_ptr<ChannelList> c = channels.reader();
1942         uint32_t n;
1943
1944         if (!_session.writable() || !recordable()) {
1945                 return;
1946         }
1947
1948         capturing_sources.clear ();
1949
1950         for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1951
1952                 if (!destructive()) {
1953
1954                         if ((*chan)->write_source) {
1955
1956                                 if (mark_write_complete) {
1957                                         (*chan)->write_source->mark_streaming_write_completed ();
1958                                         (*chan)->write_source->done_with_peakfile_writes ();
1959                                 }
1960
1961                                 if ((*chan)->write_source->removable()) {
1962                                         (*chan)->write_source->mark_for_remove ();
1963                                         (*chan)->write_source->drop_references ();
1964                                         _session.remove_source ((*chan)->write_source);
1965                                 }
1966                                 
1967                                 (*chan)->write_source.reset ();
1968                         }
1969
1970                         use_new_write_source (n);
1971
1972                         if (record_enabled()) {
1973                                 capturing_sources.push_back ((*chan)->write_source);
1974                         }
1975
1976                 } else {
1977
1978                         if ((*chan)->write_source == 0) {
1979                                 use_new_write_source (n);
1980                         }
1981                 }
1982         }
1983
1984         if (destructive() && !c->empty ()) {
1985
1986                 /* we now have all our write sources set up, so create the
1987                    playlist's single region.
1988                 */
1989
1990                 if (_playlist->empty()) {
1991                         setup_destructive_playlist ();
1992                 }
1993         }
1994 }
1995
1996 int
1997 AudioDiskstream::rename_write_sources ()
1998 {
1999         ChannelList::iterator chan;
2000         boost::shared_ptr<ChannelList> c = channels.reader();
2001         uint32_t n;
2002
2003         for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
2004                 if ((*chan)->write_source != 0) {
2005                         (*chan)->write_source->set_source_name (_name.val(), destructive());
2006                         /* XXX what to do if one of them fails ? */
2007                 }
2008         }
2009
2010         return 0;
2011 }
2012
2013 void
2014 AudioDiskstream::set_block_size (pframes_t /*nframes*/)
2015 {
2016         if (_session.get_block_size() > speed_buffer_size) {
2017                 speed_buffer_size = _session.get_block_size();
2018                 boost::shared_ptr<ChannelList> c = channels.reader();
2019
2020                 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2021                         if ((*chan)->speed_buffer)
2022                                 delete [] (*chan)->speed_buffer;
2023                         (*chan)->speed_buffer = new Sample[speed_buffer_size];
2024                 }
2025         }
2026         allocate_temporary_buffers ();
2027 }
2028
2029 void
2030 AudioDiskstream::allocate_temporary_buffers ()
2031 {
2032         /* make sure the wrap buffer is at least large enough to deal
2033            with the speeds up to 1.2, to allow for micro-variation
2034            when slaving to MTC, Timecode etc.
2035         */
2036
2037         double const sp = max (fabsf (_actual_speed), 1.2f);
2038         framecnt_t required_wrap_size = (framecnt_t) floor (_session.get_block_size() * sp) + 1;
2039
2040         if (required_wrap_size > wrap_buffer_size) {
2041
2042                 boost::shared_ptr<ChannelList> c = channels.reader();
2043
2044                 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2045                         if ((*chan)->playback_wrap_buffer)
2046                                 delete [] (*chan)->playback_wrap_buffer;
2047                         (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
2048                         if ((*chan)->capture_wrap_buffer)
2049                                 delete [] (*chan)->capture_wrap_buffer;
2050                         (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
2051                 }
2052
2053                 wrap_buffer_size = required_wrap_size;
2054         }
2055 }
2056
2057 void
2058 AudioDiskstream::monitor_input (bool yn)
2059 {
2060         boost::shared_ptr<ChannelList> c = channels.reader();
2061
2062         for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2063
2064                 if ((*chan)->source) {
2065                         (*chan)->source->ensure_monitor_input (yn);
2066                 }
2067         }
2068 }
2069
2070 void
2071 AudioDiskstream::set_align_style_from_io ()
2072 {
2073         bool have_physical = false;
2074
2075         if (_io == 0) {
2076                 return;
2077         }
2078
2079         get_input_sources ();
2080
2081         boost::shared_ptr<ChannelList> c = channels.reader();
2082
2083         for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2084                 if ((*chan)->source && (*chan)->source->flags() & JackPortIsPhysical) {
2085                         have_physical = true;
2086                         break;
2087                 }
2088         }
2089
2090         if (have_physical) {
2091                 set_align_style (ExistingMaterial);
2092         } else {
2093                 set_align_style (CaptureTime);
2094         }
2095 }
2096
2097 int
2098 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2099 {
2100         while (how_many--) {
2101                 c->push_back (new ChannelInfo(_session.butler()->audio_diskstream_playback_buffer_size(), 
2102                                               _session.butler()->audio_diskstream_capture_buffer_size(),
2103                                               speed_buffer_size, wrap_buffer_size));
2104                 interpolation.add_channel_to (_session.butler()->audio_diskstream_playback_buffer_size(), speed_buffer_size);
2105         }
2106
2107         _n_channels.set(DataType::AUDIO, c->size());
2108
2109         return 0;
2110 }
2111
2112 int
2113 AudioDiskstream::add_channel (uint32_t how_many)
2114 {
2115         RCUWriter<ChannelList> writer (channels);
2116         boost::shared_ptr<ChannelList> c = writer.get_copy();
2117
2118         return add_channel_to (c, how_many);
2119 }
2120
2121 int
2122 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2123 {
2124         while (how_many-- && !c->empty()) {
2125                 delete c->back();
2126                 c->pop_back();
2127                 interpolation.remove_channel_from ();
2128         }
2129
2130         _n_channels.set(DataType::AUDIO, c->size());
2131
2132         return 0;
2133 }
2134
2135 int
2136 AudioDiskstream::remove_channel (uint32_t how_many)
2137 {
2138         RCUWriter<ChannelList> writer (channels);
2139         boost::shared_ptr<ChannelList> c = writer.get_copy();
2140
2141         return remove_channel_from (c, how_many);
2142 }
2143
2144 float
2145 AudioDiskstream::playback_buffer_load () const
2146 {
2147         boost::shared_ptr<ChannelList> c = channels.reader();
2148
2149         if (c->empty ()) {
2150                 return 0;
2151         }
2152
2153         return (float) ((double) c->front()->playback_buf->read_space()/
2154                         (double) c->front()->playback_buf->bufsize());
2155 }
2156
2157 float
2158 AudioDiskstream::capture_buffer_load () const
2159 {
2160         boost::shared_ptr<ChannelList> c = channels.reader();
2161
2162         if (c->empty ()) {
2163                 return 0;
2164         }
2165         
2166         return (float) ((double) c->front()->capture_buf->write_space()/
2167                         (double) c->front()->capture_buf->bufsize());
2168 }
2169
2170 int
2171 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2172 {
2173         const XMLProperty* prop;
2174         XMLNodeList nlist = node.children();
2175         XMLNodeIterator niter;
2176         boost::shared_ptr<AudioFileSource> fs;
2177         boost::shared_ptr<AudioFileSource> first_fs;
2178         SourceList pending_sources;
2179         framepos_t position;
2180
2181         if ((prop = node.property (X_("at"))) == 0) {
2182                 return -1;
2183         }
2184
2185         if (sscanf (prop->value().c_str(), "%" PRIu64, &position) != 1) {
2186                 return -1;
2187         }
2188
2189         for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2190                 if ((*niter)->name() == X_("file")) {
2191
2192                         if ((prop = (*niter)->property (X_("path"))) == 0) {
2193                                 continue;
2194                         }
2195
2196                         // This protects sessions from errant CapturingSources in stored sessions
2197                         struct stat sbuf;
2198                         if (stat (prop->value().c_str(), &sbuf)) {
2199                                 continue;
2200                         }
2201
2202                         try {
2203                                 fs = boost::dynamic_pointer_cast<AudioFileSource> (
2204                                                 SourceFactory::createWritable (DataType::AUDIO, _session,
2205                                                                                prop->value(), string(), false, _session.frame_rate()));
2206                         }
2207
2208                         catch (failed_constructor& err) {
2209                                 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2210                                                   _name, prop->value())
2211                                       << endmsg;
2212                                 return -1;
2213                         }
2214
2215                         pending_sources.push_back (fs);
2216
2217                         if (first_fs == 0) {
2218                                 first_fs = fs;
2219                         }
2220
2221                         fs->set_captured_for (_name.val());
2222                 }
2223         }
2224
2225         if (pending_sources.size() == 0) {
2226                 /* nothing can be done */
2227                 return 1;
2228         }
2229
2230         if (pending_sources.size() != _n_channels.n_audio()) {
2231                 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2232                       << endmsg;
2233                 return -1;
2234         }
2235
2236         boost::shared_ptr<AudioRegion> region;
2237
2238         try {
2239                 
2240                 PropertyList plist;
2241                 
2242                 plist.add (Properties::start, 0);
2243                 plist.add (Properties::length, first_fs->length (first_fs->timeline_position()));
2244                 plist.add (Properties::name, region_name_from_path (first_fs->name(), true));
2245
2246                 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, plist));
2247
2248                 region->set_automatic (true);
2249                 region->set_whole_file (true);
2250                 region->special_set_position (0);
2251         }
2252
2253         catch (failed_constructor& err) {
2254                 error << string_compose (
2255                                 _("%1: cannot create whole-file region from pending capture sources"),
2256                                 _name) << endmsg;
2257
2258                 return -1;
2259         }
2260
2261         _playlist->add_region (region, position);
2262
2263         return 0;
2264 }
2265
2266 int
2267 AudioDiskstream::set_non_layered (bool yn)
2268 {
2269         if (yn != non_layered()) {
2270
2271                 if (yn) {
2272                         _flags = Flag (_flags | NonLayered);
2273                 } else {
2274                         _flags = Flag (_flags & ~NonLayered);
2275                 }
2276         }
2277
2278         return 0;
2279 }
2280
2281 int
2282 AudioDiskstream::set_destructive (bool yn)
2283 {
2284         if (yn != destructive()) {
2285
2286                 if (yn) {
2287                         bool bounce_ignored;
2288                         /* requestor should already have checked this and
2289                            bounced if necessary and desired
2290                         */
2291                         if (!can_become_destructive (bounce_ignored)) {
2292                                 return -1;
2293                         }
2294                         _flags = Flag (_flags | Destructive);
2295                         use_destructive_playlist ();
2296                 } else {
2297                         _flags = Flag (_flags & ~Destructive);
2298                         reset_write_sources (true, true);
2299                 }
2300         }
2301
2302         return 0;
2303 }
2304
2305 bool
2306 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2307 {
2308         if (!_playlist) {
2309                 requires_bounce = false;
2310                 return false;
2311         }
2312
2313         /* is there only one region ? */
2314
2315         if (_playlist->n_regions() != 1) {
2316                 requires_bounce = true;
2317                 return false;
2318         }
2319
2320         boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2321         if (!first) {
2322                 requires_bounce = false;
2323                 return true;
2324         }
2325
2326         /* do the source(s) for the region cover the session start position ? */
2327
2328         if (first->position() != _session.current_start_frame()) {
2329                 if (first->start() > _session.current_start_frame()) {
2330                         requires_bounce = true;
2331                         return false;
2332                 }
2333         }
2334
2335         /* is the source used by only 1 playlist ? */
2336
2337         boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2338
2339         assert (afirst);
2340
2341         if (_session.playlists->source_use_count (afirst->source()) > 1) {
2342                 requires_bounce = true;
2343                 return false;
2344         }
2345
2346         requires_bounce = false;
2347         return true;
2348 }
2349
2350 void 
2351 AudioDiskstream::adjust_playback_buffering ()
2352 {
2353         boost::shared_ptr<ChannelList> c = channels.reader();
2354
2355         for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2356                 (*chan)->resize_playback (_session.butler()->audio_diskstream_playback_buffer_size());
2357         }
2358 }
2359
2360 void 
2361 AudioDiskstream::adjust_capture_buffering ()
2362 {
2363         boost::shared_ptr<ChannelList> c = channels.reader();
2364
2365         for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2366                 (*chan)->resize_capture (_session.butler()->audio_diskstream_capture_buffer_size());
2367         }
2368 }
2369
2370 AudioDiskstream::ChannelInfo::ChannelInfo (framecnt_t playback_bufsize, framecnt_t capture_bufsize, framecnt_t speed_size, framecnt_t wrap_size)
2371 {
2372         peak_power = 0.0f;
2373         source = 0;
2374         current_capture_buffer = 0;
2375         current_playback_buffer = 0;
2376         curr_capture_cnt = 0;
2377
2378         speed_buffer = new Sample[speed_size];
2379         playback_wrap_buffer = new Sample[wrap_size];
2380         capture_wrap_buffer = new Sample[wrap_size];
2381
2382         playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2383         capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2384         capture_transition_buf = new RingBufferNPT<CaptureTransition> (256);
2385
2386         /* touch the ringbuffer buffers, which will cause
2387            them to be mapped into locked physical RAM if
2388            we're running with mlockall(). this doesn't do
2389            much if we're not.
2390         */
2391
2392         memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2393         memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2394         memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2395 }
2396
2397 void
2398 AudioDiskstream::ChannelInfo::resize_playback (framecnt_t playback_bufsize)
2399 {
2400         delete playback_buf;
2401         playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2402         memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2403 }
2404
2405 void
2406 AudioDiskstream::ChannelInfo::resize_capture (framecnt_t capture_bufsize)
2407 {
2408         delete capture_buf;
2409
2410         capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2411         memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2412 }
2413
2414 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2415 {
2416         write_source.reset ();
2417
2418         delete [] speed_buffer;
2419         speed_buffer = 0;
2420
2421         delete [] playback_wrap_buffer;
2422         playback_wrap_buffer = 0;
2423
2424         delete [] capture_wrap_buffer;
2425         capture_wrap_buffer = 0;
2426
2427         delete playback_buf;
2428         playback_buf = 0;
2429
2430         delete capture_buf;
2431         capture_buf = 0;
2432
2433         delete capture_transition_buf;
2434         capture_transition_buf = 0;
2435 }
2436