Remove unnecessary 0 checks before delete; see http://www.parashift.com/c++-faq-lite...
[ardour.git] / libs / ardour / audio_diskstream.cc
index d65183a84fa3c7f18a56da72eb3ca5abe8686197..8ba1825759de5ba8f59cf83427625e2843655e20 100644 (file)
@@ -39,6 +39,7 @@
 
 #include <ardour/ardour.h>
 #include <ardour/audioengine.h>
+#include <ardour/analyser.h>
 #include <ardour/audio_diskstream.h>
 #include <ardour/utils.h>
 #include <ardour/configuration.h>
@@ -204,6 +205,18 @@ AudioDiskstream::non_realtime_input_change ()
        }
 }
 
+void
+AudioDiskstream::non_realtime_locate (nframes_t location)
+{
+       /* now refill channel buffers */
+
+       if (speed() != 1.0f || speed() != -1.0f) {
+               seek ((nframes_t) (location * (double) speed()));
+       } else {
+               seek (location);
+       }
+}
+
 void
 AudioDiskstream::get_input_sources ()
 {
@@ -397,7 +410,7 @@ AudioDiskstream::check_record_status (nframes_t transport_frame, nframes_t nfram
 
        /* if per-track or global rec-enable turned on while the other was already on, we've started recording */
 
-       if ((change & track_rec_enabled) && record_enabled() && (!(change & global_rec_enabled) && can_record) || 
+       if (((change & track_rec_enabled) && record_enabled() && (!(change & global_rec_enabled) && can_record)) || 
            ((change & global_rec_enabled) && can_record && (!(change & track_rec_enabled) && record_enabled()))) {
                
                /* starting to record: compute first+last frames */
@@ -523,7 +536,7 @@ AudioDiskstream::process (nframes_t transport_frame, nframes_t nframes, nframes_
 
        commit_should_unlock = false;
 
-       if (!_io->active()) {
+       if (!_io || !_io->active()) {
                _processed = true;
                return 0;
        }
@@ -642,8 +655,8 @@ AudioDiskstream::process (nframes_t transport_frame, nframes_t nframes, nframes_
 
                                AudioPort* const ap = _io->audio_input(n);
                                assert(ap);
-                               assert(rec_nframes <= ap->get_audio_buffer().capacity());
-                               memcpy (chaninfo->current_capture_buffer, ap->get_audio_buffer().data(rec_nframes, offset + rec_offset), sizeof (Sample) * rec_nframes);
+                               assert(rec_nframes <= ap->get_audio_buffer( nframes, offset ).capacity());
+                               memcpy (chaninfo->current_capture_buffer, ap->get_audio_buffer( nframes, offset ).data(rec_nframes, offset + rec_offset), sizeof (Sample) * rec_nframes);
 
                        } else {
 
@@ -657,7 +670,7 @@ AudioDiskstream::process (nframes_t transport_frame, nframes_t nframes, nframes_
                                AudioPort* const ap = _io->audio_input(n);
                                assert(ap);
 
-                               Sample* buf = ap->get_audio_buffer().data(nframes, offset);
+                               Sample* buf = ap->get_audio_buffer( nframes, offset ).data(nframes, offset);
                                nframes_t first = chaninfo->capture_vector.len[0];
 
                                memcpy (chaninfo->capture_wrap_buffer, buf, sizeof (Sample) * first);
@@ -834,7 +847,7 @@ AudioDiskstream::commit (nframes_t nframes)
 {
        bool need_butler = false;
 
-       if (!_io->active()) {
+       if (!_io || !_io->active()) {
                return false;
        }
 
@@ -860,18 +873,18 @@ AudioDiskstream::commit (nframes_t nframes)
        }
        
        if (_slaved) {
-               /*if (_io && _io->active()) {*/
+               if (_io && _io->active()) {
                        need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
-               /*} else {
+               } else {
                        need_butler = false;
-               }*/
+               }
        } else {
-               /*if (_io && _io->active()) {*/
+               if (_io && _io->active()) {
                        need_butler = c->front()->playback_buf->write_space() >= disk_io_chunk_frames
                                || c->front()->capture_buf->read_space() >= disk_io_chunk_frames;
-               /*} else {
+               } else {
                        need_butler = c->front()->capture_buf->read_space() >= disk_io_chunk_frames;
-               }*/
+               }
        }
 
        if (commit_should_unlock) {
@@ -1569,6 +1582,9 @@ AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_ca
                        s->update_header (capture_info.front()->start, when, twhen);
                        s->set_captured_for (_name);
                        s->mark_immutable ();
+                       if (Config->get_auto_analyse_audio()) {
+                               Analyser::queue_source_for_analysis (s, true);
+                       }
                }
        }
 
@@ -1837,8 +1853,8 @@ AudioDiskstream::disengage_record_enable ()
 {
        g_atomic_int_set (&_record_enabled, 0);
        boost::shared_ptr<ChannelList> c = channels.reader();
-       for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
-               if (Config->get_monitoring_model() == HardwareMonitoring) {
+       if (Config->get_monitoring_model() == HardwareMonitoring) {
+               for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
                        if ((*chan)->source) {
                                (*chan)->source->ensure_monitor_input (false);
                        }
@@ -2198,7 +2214,7 @@ int
 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
 {
        while (how_many--) {
-               c->push_back (new ChannelInfo(_session.diskstream_buffer_size(), speed_buffer_size, wrap_buffer_size));
+               c->push_back (new ChannelInfo(_session.audio_diskstream_buffer_size(), speed_buffer_size, wrap_buffer_size));
        }
 
        _n_channels.set(DataType::AUDIO, c->size());
@@ -2218,7 +2234,7 @@ AudioDiskstream::add_channel (uint32_t how_many)
 int
 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
 {
-       while (--how_many && !c->empty()) {
+       while (how_many-- && !c->empty()) {
                delete c->back();
                c->pop_back();
        }
@@ -2454,33 +2470,21 @@ AudioDiskstream::ChannelInfo::~ChannelInfo ()
                write_source.reset ();
        }
                
-       if (speed_buffer) {
-               delete [] speed_buffer;
-               speed_buffer = 0;
-       }
+       delete [] speed_buffer;
+       speed_buffer = 0;
 
-       if (playback_wrap_buffer) {
-               delete [] playback_wrap_buffer;
-               playback_wrap_buffer = 0;
-       }
+       delete [] playback_wrap_buffer;
+       playback_wrap_buffer = 0;
 
-       if (capture_wrap_buffer) {
-               delete [] capture_wrap_buffer;
-               capture_wrap_buffer = 0;
-       }
+       delete [] capture_wrap_buffer;
+       capture_wrap_buffer = 0;
        
-       if (playback_buf) {
-               delete playback_buf;
-               playback_buf = 0;
-       }
+       delete playback_buf;
+       playback_buf = 0;
 
-       if (capture_buf) {
-               delete capture_buf;
-               capture_buf = 0;
-       }
+       delete capture_buf;
+       capture_buf = 0;
 
-       if (capture_transition_buf) {
-               delete capture_transition_buf;
-               capture_transition_buf = 0;
-       }
+       delete capture_transition_buf;
+       capture_transition_buf = 0;
 }