Make the session watch sources' DropReferences and drop accordingly. Remove a now...
[ardour.git] / libs / ardour / audio_diskstream.cc
index 5abdb97b3389155e7b0757e4d4d409d196bf9ae5..2c0dcb3e97a77dcf571d8d4cfa201f6fcad8ea07 100644 (file)
@@ -114,9 +114,6 @@ AudioDiskstream::init ()
 
        set_block_size (_session.get_block_size());
        allocate_temporary_buffers ();
-
-       add_channel (1);
-       assert(_n_channels == ChanCount(DataType::AUDIO, 1));
 }
 
 AudioDiskstream::~AudioDiskstream ()
@@ -410,8 +407,7 @@ AudioDiskstream::prepare_record_status(framepos_t capture_start_frame)
                                transvec.buf[0]->type = CaptureStart;
                                transvec.buf[0]->capture_val = capture_start_frame;
                                (*chan)->capture_transition_buf->increment_write_ptr(1);
-                       }
-                       else {
+                       } else {
                                // bad!
                                fatal << X_("programming error: capture_transition_buf is full on rec start!  inconceivable!")
                                        << endmsg;
@@ -708,7 +704,11 @@ AudioDiskstream::commit (framecnt_t /* nframes */)
                capture_captured += adjust_capture_position;
                adjust_capture_position = 0;
        }
-
+       
+       if (c->empty()) {
+               return false;
+       }
+       
        if (_slaved) {
                if (_io && _io->active()) {
                        need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
@@ -735,13 +735,22 @@ AudioDiskstream::set_pending_overwrite (bool yn)
        _pending_overwrite = yn;
 
        overwrite_frame = playback_sample;
-       overwrite_offset = channels.reader()->front()->playback_buf->get_read_ptr();
+
+       boost::shared_ptr<ChannelList> c = channels.reader ();
+       if (!c->empty ()) {
+               overwrite_offset = c->front()->playback_buf->get_read_ptr();
+       }
 }
 
 int
 AudioDiskstream::overwrite_existing_buffers ()
 {
        boost::shared_ptr<ChannelList> c = channels.reader();
+       if (c->empty ()) {
+               _pending_overwrite = false;
+               return 0;
+       }
+       
        Sample* mixdown_buffer;
        float* gain_buffer;
        int ret = -1;
@@ -917,12 +926,12 @@ AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer,
                //cerr << "start is " << start << "  loopstart: " << loop_start << "  loopend: " << loop_end << endl;
        }
 
+       if (reversed) {
+               start -= cnt;
+       }
+       
        while (cnt) {
 
-               if (reversed) {
-                       start -= cnt;
-               }
-
                /* take any loop into account. we can't read past the end of the loop. */
 
                if (loc && (loop_end - start < cnt)) {
@@ -1076,7 +1085,6 @@ AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
 
                        zero_fill = total_space - file_frame;
                        total_space = file_frame;
-                       file_frame = 0;
 
                } else {
 
@@ -1159,6 +1167,8 @@ AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
                to_read = min (ts, len1);
                to_read = min (to_read, disk_io_chunk_frames);
 
+               assert (to_read >= 0);
+
                if (to_read) {
 
                        if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
@@ -1193,7 +1203,8 @@ AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
        }
 
        file_frame = file_frame_tmp;
-
+       assert (file_frame >= 0);
+       
   out:
 
        return ret;
@@ -1393,7 +1404,6 @@ AudioDiskstream::transport_stopped_wallclock (struct tm& when, time_t twhen, boo
 
                                (*chan)->write_source->mark_for_remove ();
                                (*chan)->write_source->drop_references ();
-                                _session.remove_source ((*chan)->write_source);
                                (*chan)->write_source.reset ();
                        }
 
@@ -1952,7 +1962,6 @@ AudioDiskstream::reset_write_sources (bool mark_write_complete, bool /*force*/)
                                 if ((*chan)->write_source->removable()) {
                                         (*chan)->write_source->mark_for_remove ();
                                         (*chan)->write_source->drop_references ();
-                                        _session.remove_source ((*chan)->write_source);
                                 }
                                
                                 (*chan)->write_source.reset ();
@@ -2137,6 +2146,10 @@ AudioDiskstream::playback_buffer_load () const
 {
        boost::shared_ptr<ChannelList> c = channels.reader();
 
+       if (c->empty ()) {
+               return 0;
+       }
+
        return (float) ((double) c->front()->playback_buf->read_space()/
                        (double) c->front()->playback_buf->bufsize());
 }
@@ -2146,6 +2159,10 @@ AudioDiskstream::capture_buffer_load () const
 {
        boost::shared_ptr<ChannelList> c = channels.reader();
 
+       if (c->empty ()) {
+               return 0;
+       }
+       
        return (float) ((double) c->front()->capture_buf->write_space()/
                        (double) c->front()->capture_buf->bufsize());
 }