LADSPA logarithmic handling patches from nickm and robsch
[ardour.git] / libs / ardour / audio_diskstream.cc
index 9a562acf9e40d2bebcfdc5d225954ef496c22ad9..5c00f10f48fd4aee8c769c7fca071d5c8c712119 100644 (file)
@@ -160,8 +160,6 @@ AudioDiskstream::free_working_buffers()
 void
 AudioDiskstream::non_realtime_input_change ()
 {
-       cerr << "AD::NRIC ... " << name() << endl;
-
        {
                Glib::Mutex::Lock lm (state_lock);
 
@@ -390,7 +388,7 @@ AudioDiskstream::use_destructive_playlist ()
 }
 
 void
-AudioDiskstream::check_record_status (nframes_t transport_frame, nframes_t nframes, bool can_record)
+AudioDiskstream::check_record_status (nframes_t transport_frame, nframes_t /*nframes*/, bool can_record)
 {
        int possibly_recording;
        int rolling;
@@ -818,21 +816,23 @@ AudioDiskstream::process (nframes_t transport_frame, nframes_t nframes, bool can
 void
 AudioDiskstream::process_varispeed_playback(nframes_t nframes, boost::shared_ptr<ChannelList> c)
 {
-       ChannelList::iterator chan;
-
-       interpolation.set_target_speed (_target_speed);
-       interpolation.set_speed (_speed);
+         ChannelList::iterator chan;
        
-       for (chan = c->begin(); chan != c->end(); ++chan) {
-               ChannelInfo* chaninfo (*chan);
-
-               playback_distance = interpolation.interpolate (
-                               nframes, chaninfo->current_playback_buffer, chaninfo->speed_buffer); 
-       }       
+               interpolation.set_speed (_target_speed);
+               
+               int channel = 0;
+               for (chan = c->begin(); chan != c->end(); ++chan, ++channel) {
+                       ChannelInfo* chaninfo (*chan);
+       
+                       playback_distance = interpolation.interpolate (
+                                       channel, nframes, chaninfo->current_playback_buffer, chaninfo->speed_buffer);
+                                       
+                       chaninfo->current_playback_buffer = chaninfo->speed_buffer;
+               }
 }
 
 bool
-AudioDiskstream::commit (nframes_t nframes)
+AudioDiskstream::commit (nframes_t /*nframes*/)
 {
        bool need_butler = false;
 
@@ -1030,7 +1030,7 @@ AudioDiskstream::internal_playback_seek (nframes_t distance)
 
 int
 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer, nframes_t& start, nframes_t cnt, 
-                      ChannelInfo* channel_info, int channel, bool reversed)
+                      ChannelInfo* /*channel_info*/, int channel, bool reversed)
 {
        nframes_t this_read = 0;
        bool reloop = false;
@@ -1364,7 +1364,7 @@ AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
  * written at all unless @a force_flush is true.
  */
 int
-AudioDiskstream::do_flush (RunContext context, bool force_flush)
+AudioDiskstream::do_flush (RunContext /*context*/, bool force_flush)
 {
        uint32_t to_write;
        int32_t ret = 0;
@@ -1724,7 +1724,7 @@ AudioDiskstream::transport_looped (nframes_t transport_frame)
 }
 
 void
-AudioDiskstream::finish_capture (bool rec_monitors_input, boost::shared_ptr<ChannelList> c)
+AudioDiskstream::finish_capture (bool /*rec_monitors_input*/, boost::shared_ptr<ChannelList> c)
 {
        was_recording = false;
        
@@ -1892,7 +1892,7 @@ AudioDiskstream::get_state ()
                Location* pi;
 
                if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
-                       snprintf (buf, sizeof (buf), "%" PRIu32, pi->start());
+                       snprintf (buf, sizeof (buf), "%" PRId64, pi->start());
                } else {
                        snprintf (buf, sizeof (buf), "%" PRIu32, _session.transport_frame());
                }
@@ -2059,14 +2059,12 @@ AudioDiskstream::use_new_write_source (uint32_t n)
 }
 
 void
-AudioDiskstream::reset_write_sources (bool mark_write_complete, bool force)
+AudioDiskstream::reset_write_sources (bool mark_write_complete, bool /*force*/)
 {
        ChannelList::iterator chan;
        boost::shared_ptr<ChannelList> c = channels.reader();
        uint32_t n;
 
-       cerr << _name << " RWS!!!\n";
-
        if (!recordable()) {
                return;
        }
@@ -2122,7 +2120,7 @@ AudioDiskstream::rename_write_sources ()
 }
 
 void
-AudioDiskstream::set_block_size (nframes_t nframes)
+AudioDiskstream::set_block_size (nframes_t /*nframes*/)
 {
        if (_session.get_block_size() > speed_buffer_size) {
                speed_buffer_size = _session.get_block_size();
@@ -2208,12 +2206,14 @@ AudioDiskstream::set_align_style_from_io ()
 int
 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
 {
+
        while (how_many--) {
                c->push_back (new ChannelInfo(_session.audio_diskstream_buffer_size(), speed_buffer_size, wrap_buffer_size));
+               interpolation.add_channel_to (_session.audio_diskstream_buffer_size(), speed_buffer_size);
        }
 
        _n_channels.set(DataType::AUDIO, c->size());
-
+       
        return 0;
 }
 
@@ -2230,8 +2230,11 @@ int
 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
 {
        while (how_many-- && !c->empty()) {
-               //delete c->back(); // FIXME: crash (thread safe with RCU?)
+               // FIXME: crash (thread safe with RCU?)
+               // memory leak, when disabled.... :(
+               //delete c->back(); 
                c->pop_back();
+               interpolation.remove_channel_from ();
        }
 
        _n_channels.set(DataType::AUDIO, c->size());