diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2007-03-16 17:48:13 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2007-03-16 17:48:13 +0000 |
commit | 3e369073533988b8536216389d52cc947535e51c (patch) | |
tree | e5b0cdbc7540df68222f76574cf84fa48d3e70f7 /libs/ardour/ardour | |
parent | bca0450c188cdac82fbc74d05b5d72aff9115646 (diff) |
a much better fix for track-add crashes, albeit slightly more complex
git-svn-id: svn://localhost/ardour2/trunk@1604 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/ardour')
-rw-r--r-- | libs/ardour/ardour/audio_diskstream.h | 61 | ||||
-rw-r--r-- | libs/ardour/ardour/diskstream.h | 4 | ||||
-rw-r--r-- | libs/ardour/ardour/session.h | 4 |
3 files changed, 37 insertions, 32 deletions
diff --git a/libs/ardour/ardour/audio_diskstream.h b/libs/ardour/ardour/audio_diskstream.h index cb70903d13..4846a20cbd 100644 --- a/libs/ardour/ardour/audio_diskstream.h +++ b/libs/ardour/ardour/audio_diskstream.h @@ -32,6 +32,7 @@ #include <pbd/fastlog.h> #include <pbd/ringbufferNPT.h> #include <pbd/stateful.h> +#include <pbd/rcu.h> #include <ardour/ardour.h> #include <ardour/configuration.h> @@ -65,24 +66,28 @@ class AudioDiskstream : public Diskstream float capture_buffer_load() const; string input_source (uint32_t n=0) const { - if (n < channels.size()) { - return channels[n].source ? channels[n].source->name() : ""; + boost::shared_ptr<ChannelList> c = channels.reader(); + if (n < c->size()) { + return (*c)[n]->source ? (*c)[n]->source->name() : ""; } else { return ""; } } Port *input_source_port (uint32_t n=0) const { - if (n < channels.size()) return channels[n].source; return 0; + boost::shared_ptr<ChannelList> c = channels.reader(); + if (n < c->size()) return (*c)[n]->source; return 0; } void set_record_enabled (bool yn); int set_destructive (bool yn); bool can_become_destructive (bool& requires_bounce) const; - float peak_power(uint32_t n=0) { - float x = channels[n].peak_power; - channels[n].peak_power = 0.0f; + float peak_power(uint32_t n = 0) { + boost::shared_ptr<ChannelList> c = channels.reader(); + ChannelInfo* chaninfo = (*c)[n]; + float x = chaninfo->peak_power; + chaninfo->peak_power = 0.0f; if (x > 0.0f) { return 20.0f * fast_log10(x); } else { @@ -96,27 +101,29 @@ class AudioDiskstream : public Diskstream int use_new_playlist (); int use_copy_playlist (); - Sample *playback_buffer (uint32_t n=0) { - if (n < channels.size()) - return channels[n].current_playback_buffer; + Sample *playback_buffer (uint32_t n = 0) { + boost::shared_ptr<ChannelList> c = channels.reader(); + if (n < c->size()) + return (*c)[n]->current_playback_buffer; return 0; } - Sample *capture_buffer (uint32_t n=0) { - if (n < channels.size()) - return channels[n].current_capture_buffer; + Sample *capture_buffer (uint32_t n = 0) { + boost::shared_ptr<ChannelList> c = channels.reader(); + if (n < c->size()) + return (*c)[n]->current_capture_buffer; return 0; } boost::shared_ptr<AudioFileSource> write_source (uint32_t n=0) { - if (n < channels.size()) - return channels[n].write_source; + boost::shared_ptr<ChannelList> c = channels.reader(); + if (n < c->size()) + return (*c)[n]->write_source; return boost::shared_ptr<AudioFileSource>(); } - int add_channel (); - int remove_channel (); - + int add_channel (uint32_t how_many); + int remove_channel (uint32_t how_many); /* stateful */ @@ -174,12 +181,9 @@ class AudioDiskstream : public Diskstream struct ChannelInfo { - ChannelInfo (); + ChannelInfo (nframes_t buffer_size, nframes_t speed_buffer_size, nframes_t wrap_buffer_size); ~ChannelInfo (); - void init (nframes_t buffer_size, nframes_t speed_buffer_size, nframes_t wrap_buffer_size); - void release (); - Sample *playback_wrap_buffer; Sample *capture_wrap_buffer; Sample *speed_buffer; @@ -208,6 +212,8 @@ class AudioDiskstream : public Diskstream nframes_t curr_capture_cnt; }; + typedef std::vector<ChannelInfo*> ChannelList; + /* The two central butler operations */ int do_flush (Session::RunContext context, bool force = false); int do_refill () { return _do_refill(_mixdown_buffer, _gain_buffer); } @@ -215,10 +221,10 @@ class AudioDiskstream : public Diskstream int do_refill_with_alloc (); int read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer, - nframes_t& start, nframes_t cnt, - ChannelInfo& channel_info, int channel, bool reversed); + nframes_t& start, nframes_t cnt, + ChannelInfo* channel_info, int channel, bool reversed); - void finish_capture (bool rec_monitors_input); + void finish_capture (bool rec_monitors_input, boost::shared_ptr<ChannelList>); void transport_stopped (struct tm&, time_t, bool abort); void init (Diskstream::Flag); @@ -253,12 +259,15 @@ class AudioDiskstream : public Diskstream std::vector<boost::shared_ptr<AudioFileSource> > capturing_sources; - typedef vector<ChannelInfo> ChannelList; - ChannelList channels; + SerializedRCUManager<ChannelList> channels; /* really */ private: int _do_refill (Sample *mixdown_buffer, float *gain_buffer); + + int add_channel_to (boost::shared_ptr<ChannelList>, uint32_t how_many); + int remove_channel_from (boost::shared_ptr<ChannelList>, uint32_t how_many); + }; } // namespace ARDOUR diff --git a/libs/ardour/ardour/diskstream.h b/libs/ardour/ardour/diskstream.h index a03b778dd9..c6371f180d 100644 --- a/libs/ardour/ardour/diskstream.h +++ b/libs/ardour/ardour/diskstream.h @@ -21,7 +21,6 @@ #define __ardour_diskstream_h__ #include <sigc++/signal.h> -#include <boost/enable_shared_from_this.hpp> #include <cmath> #include <string> @@ -54,7 +53,7 @@ class Session; class Playlist; class IO; -class Diskstream : public PBD::StatefulDestructible, public boost::enable_shared_from_this<ARDOUR::Diskstream> +class Diskstream : public PBD::StatefulDestructible { public: enum Flag { @@ -207,7 +206,6 @@ class Diskstream : public PBD::StatefulDestructible, public boost::enable_shared virtual void playlist_modified (); virtual void playlist_deleted (boost::weak_ptr<Playlist>); - virtual void finish_capture (bool rec_monitors_input) = 0; virtual void transport_stopped (struct tm&, time_t, bool abort) = 0; struct CaptureInfo { diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 9955dd9311..919d9a8162 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -165,7 +165,6 @@ class Session : public PBD::StatefulDestructible }; boost::shared_ptr<Region> region; - boost::shared_ptr<Diskstream> diskstream; list<AudioRange> audio_range; list<MusicRange> music_range; @@ -362,7 +361,7 @@ class Session : public PBD::StatefulDestructible void request_transport_speed (float speed); void request_overwrite_buffer (Diskstream*); void request_diskstream_speed (Diskstream&, float speed); - void request_input_change_handling (boost::shared_ptr<ARDOUR::Diskstream>); + void request_input_change_handling (); bool locate_pending() const { return static_cast<bool>(post_transport_work&PostTransportLocate); } bool transport_locked () const; @@ -1425,7 +1424,6 @@ class Session : public PBD::StatefulDestructible /* disk-streams */ SerializedRCUManager<DiskstreamList> diskstreams; - SerializedRCUManager<DiskstreamList> diskstreams_input_pending; uint32_t dstream_buffer_size; int load_diskstreams (const XMLNode&); |