diff options
author | David Robillard <d@drobilla.net> | 2006-06-13 07:27:52 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2006-06-13 07:27:52 +0000 |
commit | 868f557f2612903f72614a2b3a317c7a528188d1 (patch) | |
tree | 979151d7bbb25fb633adb662d386ef4df0d46158 /libs/ardour | |
parent | edc7a146f5f3c9facd97b3e8951e1607b5e9ec31 (diff) |
Merged with trunk (painfully)
git-svn-id: svn://localhost/ardour2/branches/midi@581 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour')
69 files changed, 758 insertions, 628 deletions
diff --git a/libs/ardour/SConscript b/libs/ardour/SConscript index 4f3fff3945..33e4633a79 100644 --- a/libs/ardour/SConscript +++ b/libs/ardour/SConscript @@ -58,7 +58,6 @@ ladspa_plugin.cc location.cc mtc_slave.cc named_selection.cc -osc.cc panner.cc pcm_utils.cc playlist.cc @@ -98,6 +97,7 @@ smpte.cc arch_specific_objects = [ ] +osc_files = [ 'osc.cc' ] vst_files = [ 'vst_plugin.cc', 'session_vst.cc' ] coreaudio_files = [ 'coreaudio_source.cc' ] extra_sources = [ ] @@ -105,6 +105,9 @@ extra_sources = [ ] if ardour['VST']: extra_sources += vst_files +if ardour['LIBLO']: + extra_sources += osc_files + ardour.Append(CCFLAGS="-D_REENTRANT -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE") ardour.Append(CXXFLAGS="-DDATA_DIR=\\\""+final_prefix+"/share\\\"") ardour.Append(CXXFLAGS="-DMODULE_DIR=\\\""+final_prefix+"/lib\\\"") @@ -173,7 +176,7 @@ if conf.CheckCHeader('sys/vfs.h'): if conf.CheckCHeader('/System/Library/Frameworks/CoreMIDI.framework/Headers/CoreMIDI.h'): ardour.Append(LINKFLAGS="-framework CoreMIDI") -if conf.CheckCHeader('/System/Library/Frameworks/AudioToolbox.framework/Headers/ExtendedAudioFile.h'): +if conf.CheckCHeader('/System/Library/Frameworks/AudioToolbox.framework/Headers/ExtendedAudioFile.h') and ardour['COREAUDIO'] == 1: ardour.Append(CXXFLAGS="-DHAVE_COREAUDIO") ardour.Append(LINKFLAGS="-framework AudioToolbox") @@ -199,9 +202,12 @@ ardour.Merge ([ libraries['pbd3'], libraries['soundtouch'], libraries['midi++2'], - libraries['lo'], + libraries['glib2'], + libraries['glibmm2'] ]) +if ardour['LIBLO']: + ardour.Merge ([ libraries['lo'] ]) ardour.VersionBuild(['version.cc', 'ardour/version.h'], 'SConscript') diff --git a/libs/ardour/ardour/ardour.h b/libs/ardour/ardour/ardour.h index 3308266f2f..fee6c601a2 100644 --- a/libs/ardour/ardour/ardour.h +++ b/libs/ardour/ardour/ardour.h @@ -26,14 +26,11 @@ #include <signal.h> #include <pbd/error.h> -#include <pbd/lockmonitor.h> #include <pbd/failed_constructor.h> #include <ardour/configuration.h> #include <ardour/types.h> -using namespace PBD; - namespace MIDI { class MachineControl; class Port; diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h index 788ac679dd..50bf7dddcc 100644 --- a/libs/ardour/ardour/audioengine.h +++ b/libs/ardour/ardour/audioengine.h @@ -28,7 +28,9 @@ #include <string> #include <sigc++/signal.h> -#include <pthread.h> + +#include <glibmm/thread.h> + #include <ardour/ardour.h> #include <jack/jack.h> #include <jack/transport.h> @@ -59,7 +61,7 @@ class AudioEngine : public sigc::trackable int start (); bool running() const { return _running; } - PBD::NonBlockingLock& process_lock() { return _process_lock; } + Glib::Mutex& process_lock() { return _process_lock; } jack_nframes_t frame_rate(); jack_nframes_t frames_per_cycle(); @@ -185,10 +187,10 @@ class AudioEngine : public sigc::trackable ARDOUR::Session *session; jack_client_t *_jack; std::string jack_client_name; - PBD::NonBlockingLock port_lock; - PBD::NonBlockingLock _process_lock; - PBD::Lock session_remove_lock; - pthread_cond_t session_removed; + Glib::Mutex port_lock; + Glib::Mutex _process_lock; + Glib::Mutex session_remove_lock; + Glib::Cond session_removed; bool session_remove_pending; bool _running; bool _has_run; @@ -202,8 +204,6 @@ class AudioEngine : public sigc::trackable sigc::slot<int,jack_nframes_t> freewheel_action; bool reconnect_on_halt; int _usecs_per_cycle; - jack_nframes_t last_meter_point; - jack_nframes_t meter_interval; typedef std::set<Port*> Ports; Ports ports; diff --git a/libs/ardour/ardour/audioregion.h b/libs/ardour/ardour/audioregion.h index a146a20417..f210fa595b 100644 --- a/libs/ardour/ardour/audioregion.h +++ b/libs/ardour/ardour/audioregion.h @@ -75,10 +75,11 @@ class AudioRegion : public Region AudioRegion (SourceList &, const XMLNode&); ~AudioRegion(); - bool region_list_equivalent (const AudioRegion&); - bool source_equivalent (const AudioRegion&); - bool equivalent (const AudioRegion&); - bool size_equivalent (const AudioRegion&); + bool region_list_equivalent (const AudioRegion&) const ; + bool source_equivalent (const AudioRegion&) const; + bool equivalent (const AudioRegion&) const; + bool size_equivalent (const AudioRegion&) const; + bool overlap_equivalent (const AudioRegion&) const; bool speed_mismatch (float) const; diff --git a/libs/ardour/ardour/auditioner.h b/libs/ardour/ardour/auditioner.h index a21ba94ac6..434ec32f97 100644 --- a/libs/ardour/ardour/auditioner.h +++ b/libs/ardour/ardour/auditioner.h @@ -22,10 +22,8 @@ #define __ardour_auditioner_h__ #include <string> -#include <pthread.h> -#include <pbd/lockmonitor.h> -#include <pbd/atomic.h> +#include <glibmm/thread.h> #include <ardour/ardour.h> #include <ardour/audio_track.h> @@ -50,10 +48,10 @@ class Auditioner : public AudioTrack int play_audition (jack_nframes_t nframes); void cancel_audition () { - atomic_set (&_active, 0); + g_atomic_int_set (&_active, 0); } - bool active() const { return atomic_read (&_active); } + bool active() const { return g_atomic_int_get (&_active); } private: AudioRegion *the_region; diff --git a/libs/ardour/ardour/automation_event.h b/libs/ardour/ardour/automation_event.h index f26828a114..78daa531dd 100644 --- a/libs/ardour/ardour/automation_event.h +++ b/libs/ardour/ardour/automation_event.h @@ -26,7 +26,7 @@ #include <cmath> #include <sigc++/signal.h> -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> #include <pbd/undo.h> #include <pbd/xml++.h> #include <ardour/ardour.h> @@ -144,7 +144,7 @@ class AutomationList : public StateManager std::pair<AutomationList::iterator,AutomationList::iterator> control_points_adjacent (double when); template<class T> void apply_to_points (T& obj, void (T::*method)(const AutomationList&)) { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); (obj.*method)(*this); } @@ -157,13 +157,13 @@ class AutomationList : public StateManager double get_max_xval() const { return max_xval; } double eval (double where) { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); return unlocked_eval (where); } double rt_safe_eval (double where, bool& ok) { - TentativeLockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock, Glib::TRY_LOCK); if ((ok = lm.locked())) { return unlocked_eval (where); @@ -186,7 +186,7 @@ class AutomationList : public StateManager }; AutomationEventList events; - mutable PBD::NonBlockingLock lock; + mutable Glib::Mutex lock; bool _frozen; bool changed_when_thawed; bool _dirty; diff --git a/libs/ardour/ardour/connection.h b/libs/ardour/ardour/connection.h index b33af9cb21..899bffc06a 100644 --- a/libs/ardour/ardour/connection.h +++ b/libs/ardour/ardour/connection.h @@ -24,7 +24,7 @@ #include <vector> #include <string> #include <sigc++/signal.h> -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> #include <ardour/stateful.h> using std::vector; @@ -67,7 +67,7 @@ class Connection : public Stateful, public sigc::trackable { Connection (const XMLNode&); private: - mutable PBD::Lock port_lock; + mutable Glib::Mutex port_lock; vector<PortList> _ports; string _name; bool _sysdep; diff --git a/libs/ardour/ardour/control_protocol_manager.h b/libs/ardour/ardour/control_protocol_manager.h index 42b5a69a48..03b21a299c 100644 --- a/libs/ardour/ardour/control_protocol_manager.h +++ b/libs/ardour/ardour/control_protocol_manager.h @@ -6,7 +6,7 @@ #include <sigc++/sigc++.h> -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> #include <ardour/stateful.h> @@ -52,7 +52,7 @@ struct ControlProtocolInfo { static ControlProtocolManager* _instance; Session* _session; - PBD::Lock protocols_lock; + Glib::Mutex protocols_lock; std::list<ControlProtocol*> control_protocols; void drop_session (); diff --git a/libs/ardour/ardour/coreaudio_source.h b/libs/ardour/ardour/coreaudio_source.h index 4193623006..736ea32df7 100644 --- a/libs/ardour/ardour/coreaudio_source.h +++ b/libs/ardour/ardour/coreaudio_source.h @@ -40,7 +40,7 @@ class CoreAudioSource : public ExternalSource { mutable float *tmpbuf; mutable jack_nframes_t tmpbufsize; - mutable PBD::Lock _tmpbuf_lock; + mutable Glib::Mutex _tmpbuf_lock; void init (const string &str, bool build_peak); }; diff --git a/libs/ardour/ardour/curve.h b/libs/ardour/ardour/curve.h index 1c6a4c5bc4..ede060e1cb 100644 --- a/libs/ardour/ardour/curve.h +++ b/libs/ardour/ardour/curve.h @@ -23,11 +23,10 @@ #include <sys/types.h> #include <sigc++/signal.h> -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> #include <pbd/undo.h> #include <list> #include <algorithm> -#include <pthread.h> #include <ardour/automation_event.h> namespace ARDOUR { diff --git a/libs/ardour/ardour/diskstream.h b/libs/ardour/ardour/diskstream.h index 9d2d336b02..316daba52f 100644 --- a/libs/ardour/ardour/diskstream.h +++ b/libs/ardour/ardour/diskstream.h @@ -33,7 +33,7 @@ #include <pbd/fastlog.h> #include <pbd/ringbufferNPT.h> -#include <pbd/atomic.h> + #include <ardour/ardour.h> #include <ardour/configuration.h> @@ -115,7 +115,7 @@ class DiskStream : public Stateful, public sigc::trackable } void set_record_enabled (bool yn, void *src); - bool record_enabled() const { return atomic_read (&_record_enabled); } + bool record_enabled() const { return g_atomic_int_get (&_record_enabled); } void punch_in (); void punch_out (); @@ -365,7 +365,7 @@ class DiskStream : public Stateful, public sigc::trackable AlignStyle _persistent_alignment_style; bool first_input_change; - PBD::NonBlockingLock state_lock; + Glib::Mutex state_lock; jack_nframes_t scrub_start; jack_nframes_t scrub_buffer_size; @@ -404,7 +404,7 @@ class DiskStream : public Stateful, public sigc::trackable }; vector<CaptureInfo*> capture_info; - PBD::Lock capture_info_lock; + Glib::Mutex capture_info_lock; void init (Flag); diff --git a/libs/ardour/ardour/io.h b/libs/ardour/ardour/io.h index 8321e9afda..c80a7abfaa 100644 --- a/libs/ardour/ardour/io.h +++ b/libs/ardour/ardour/io.h @@ -27,10 +27,11 @@ #include <sigc++/signal.h> #include <jack/jack.h> -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> + #include <pbd/fastlog.h> #include <pbd/undo.h> -#include <pbd/atomic.h> + #include <midi++/controllable.h> #include <ardour/ardour.h> @@ -205,7 +206,15 @@ class IO : public Stateful, public ARDOUR::StateManager } } - static sigc::signal<void> Meter; + static void update_meters(); + +private: + + static sigc::signal<void> Meter; + static Glib::StaticMutex m_meter_signal_lock; + sigc::connection m_meter_connection; + +public: /* automation */ @@ -261,7 +270,7 @@ class IO : public Stateful, public ARDOUR::StateManager int ports_became_legal (); private: - mutable PBD::Lock io_lock; + mutable Glib::Mutex io_lock; protected: Session& _session; @@ -269,7 +278,7 @@ class IO : public Stateful, public ARDOUR::StateManager gain_t _gain; gain_t _effective_gain; gain_t _desired_gain; - PBD::NonBlockingLock declick_lock; + Glib::Mutex declick_lock; vector<Port*> _outputs; vector<Port*> _inputs; vector<float> _peak_power; @@ -322,7 +331,7 @@ class IO : public Stateful, public ARDOUR::StateManager jack_nframes_t last_automation_snapshot; static jack_nframes_t _automation_interval; - AutoState _gain_automation_state; + AutoState _gain_automation_state; AutoStyle _gain_automation_style; bool apply_gain_automation; @@ -331,7 +340,7 @@ class IO : public Stateful, public ARDOUR::StateManager int save_automation (const string&); int load_automation (const string&); - PBD::NonBlockingLock automation_lock; + Glib::Mutex automation_lock; /* AudioTrack::deprecated_use_diskstream_connections() needs these */ diff --git a/libs/ardour/ardour/location.h b/libs/ardour/ardour/location.h index ee55adb600..75f4c5d12a 100644 --- a/libs/ardour/ardour/location.h +++ b/libs/ardour/ardour/location.h @@ -27,10 +27,10 @@ #include <map> #include <sys/types.h> -#include <pthread.h> #include <sigc++/signal.h> -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> + #include <pbd/undo.h> #include "ardour.h" @@ -159,18 +159,21 @@ class Locations : public Stateful, public StateManager Location *first_location_before (jack_nframes_t); Location *first_location_after (jack_nframes_t); + jack_nframes_t first_mark_before (jack_nframes_t); + jack_nframes_t first_mark_after (jack_nframes_t); + sigc::signal<void,Location*> current_changed; sigc::signal<void> changed; sigc::signal<void,Location*> added; sigc::signal<void,Location*> removed; template<class T> void apply (T& obj, void (T::*method)(LocationList&)) { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); (obj.*method)(locations); } template<class T1, class T2> void apply (T1& obj, void (T1::*method)(LocationList&, T2& arg), T2& arg) { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); (obj.*method)(locations, arg); } @@ -187,7 +190,7 @@ class Locations : public Stateful, public StateManager LocationList locations; Location *current_location; - mutable PBD::Lock lock; + mutable Glib::Mutex lock; int set_current_unlocked (Location *); void location_changed (Location*); diff --git a/libs/ardour/ardour/logcurve.h b/libs/ardour/ardour/logcurve.h index 84911b0369..e65be55772 100644 --- a/libs/ardour/ardour/logcurve.h +++ b/libs/ardour/ardour/logcurve.h @@ -22,7 +22,7 @@ #define __ardour_logcurve_h__ #include <pbd/fastlog.h> -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> namespace ARDOUR { @@ -94,7 +94,7 @@ class LogCurve { } void set_length (uint32_t len) { l = len; } - mutable PBD::NonBlockingLock lock; + mutable Glib::Mutex lock; protected: float a; diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h index 78e3353084..d322f564ee 100644 --- a/libs/ardour/ardour/playlist.h +++ b/libs/ardour/ardour/playlist.h @@ -28,8 +28,9 @@ #include <sys/stat.h> +#include <glib.h> + #include <sigc++/signal.h> -#include <pbd/atomic.h> #include <pbd/undo.h> #include <ardour/ardour.h> @@ -197,8 +198,8 @@ class Playlist : public Stateful, public StateManager { void init (bool hide); bool holding_state () const { - return atomic_read (&block_notifications) != 0 || - atomic_read (&ignore_state_changes) != 0; + return g_atomic_int_get (&block_notifications) != 0 || + g_atomic_int_get (&ignore_state_changes) != 0; } /* prevent the compiler from ever generating these */ diff --git a/libs/ardour/ardour/redirect.h b/libs/ardour/ardour/redirect.h index b370589079..ede55a1d80 100644 --- a/libs/ardour/ardour/redirect.h +++ b/libs/ardour/ardour/redirect.h @@ -27,7 +27,8 @@ #include <map> #include <sigc++/signal.h> -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> + #include <pbd/undo.h> #include <ardour/ardour.h> @@ -131,7 +132,7 @@ class Redirect : public IO map<uint32_t,AutomationList*> parameter_automation; set<uint32_t> visible_parameter_automation; - mutable PBD::NonBlockingLock _automation_lock; + mutable Glib::Mutex _automation_lock; void can_automate (uint32_t); set<uint32_t> can_automate_list; diff --git a/libs/ardour/ardour/region.h b/libs/ardour/ardour/region.h index 5af5a660c1..3c94dad6fd 100644 --- a/libs/ardour/ardour/region.h +++ b/libs/ardour/ardour/region.h @@ -221,7 +221,7 @@ class Region : public Stateful, public StateManager string _name; mutable RegionEditState _first_edit; int _frozen; - PBD::Lock lock; + Glib::Mutex lock; ARDOUR::id_t _id; ARDOUR::Playlist* _playlist; mutable uint32_t _read_data_count; // modified in read() diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h index 8a707eb902..5699d9ef14 100644 --- a/libs/ardour/ardour/route.h +++ b/libs/ardour/ardour/route.h @@ -27,11 +27,8 @@ #include <map> #include <string> -#include <pthread.h> - -#include <pbd/atomic.h> #include <pbd/fastlog.h> -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> #include <pbd/xml++.h> #include <pbd/undo.h> #include <midi++/controllable.h> @@ -142,14 +139,14 @@ class Route : public IO void flush_redirects (); template<class T> void foreach_redirect (T *obj, void (T::*func)(Redirect *)) { - RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (redirect_lock); for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) { (obj->*func) (*i); } } Redirect *nth_redirect (uint32_t n) { - RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (redirect_lock); RedirectList::iterator i; for (i = _redirects.begin(); i != _redirects.end() && n; ++i, --n); if (i == _redirects.end()) { @@ -294,9 +291,9 @@ class Route : public IO jack_nframes_t _roll_delay; jack_nframes_t _own_latency; RedirectList _redirects; - PBD::NonBlockingRWLock redirect_lock; + Glib::RWLock redirect_lock; IO *_control_outs; - PBD::NonBlockingLock control_outs_lock; + Glib::Mutex control_outs_lock; RouteGroup *_edit_group; RouteGroup *_mix_group; std::string _comment; diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 923a5101fb..9339e448db 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -31,9 +31,9 @@ #include <sndfile.h> +#include <glibmm/thread.h> + #include <pbd/error.h> -#include <pbd/atomic.h> -#include <pbd/lockmonitor.h> #include <pbd/undo.h> #include <pbd/pool.h> @@ -47,6 +47,8 @@ #include <ardour/gain.h> #include <ardour/io.h> +#include <ardour/smpte.h> + class XMLTree; class XMLNode; class AEffect; @@ -274,7 +276,7 @@ class Session : public sigc::trackable, public Stateful typedef list<DiskStream *> DiskStreamList; Session::DiskStreamList disk_streams() const { - RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (diskstream_lock); return diskstreams; /* XXX yes, force a copy */ } @@ -284,7 +286,7 @@ class Session : public sigc::trackable, public Stateful typedef list<Route *> RouteList; RouteList get_routes() const { - RWLockMonitor rlock (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock rlock (route_lock); return routes; /* XXX yes, force a copy */ } @@ -310,7 +312,7 @@ class Session : public sigc::trackable, public Stateful } RecordState record_status() const { - return (RecordState) atomic_read (&_record_status); + return (RecordState) g_atomic_int_get (&_record_status); } bool actively_recording () { @@ -1402,22 +1404,14 @@ class Session : public sigc::trackable, public Stateful static MultiAllocSingleReleasePool pool; }; -<<<<<<< .working + mutable gint butler_active; + //PBD::Lock midi_lock; //pthread_t midi_thread; //int midi_request_pipe[2]; - atomic_t butler_active; - //RingBuffer<MIDIRequest*> midi_requests; -/* -======= - Glib::Mutex midi_lock; - pthread_t midi_thread; - int midi_request_pipe[2]; - mutable gint butler_active; - RingBuffer<MIDIRequest*> midi_requests; ->>>>>>> .merge-right.r579 - int start_midi_thread (); + //RingBuffer<MIDIRequest*> midi_requests; + /*int start_midi_thread (); void terminate_midi_thread (); void poke_midi_thread (); static void *_midi_thread_work (void *arg); @@ -1465,7 +1459,7 @@ class Session : public sigc::trackable, public Stateful /* disk-streams */ DiskStreamList diskstreams; - mutable PBD::NonBlockingRWLock diskstream_lock; + mutable Glib::RWLock diskstream_lock; uint32_t dstream_buffer_size; void add_diskstream (DiskStream*); int load_diskstreams (const XMLNode&); @@ -1473,7 +1467,7 @@ class Session : public sigc::trackable, public Stateful /* routes stuff */ RouteList routes; - mutable PBD::NonBlockingRWLock route_lock; + mutable Glib::RWLock route_lock; void add_route (Route*); uint32_t destructive_index; @@ -1496,7 +1490,7 @@ class Session : public sigc::trackable, public Stateful /* REGION MANAGEMENT */ - mutable PBD::Lock region_lock; + mutable Glib::Mutex region_lock; typedef map<ARDOUR::id_t,AudioRegion *> AudioRegionList; AudioRegionList audio_regions; @@ -1509,7 +1503,7 @@ class Session : public sigc::trackable, public Stateful /* SOURCES */ - mutable PBD::Lock source_lock; + mutable Glib::Mutex source_lock; typedef std::map<id_t, Source *> SourceList; SourceList sources; @@ -1523,7 +1517,7 @@ class Session : public sigc::trackable, public Stateful /* PLAYLISTS */ - mutable PBD::Lock playlist_lock; + mutable Glib::Mutex playlist_lock; typedef set<Playlist *> PlaylistList; PlaylistList playlists; PlaylistList unused_playlists; @@ -1541,7 +1535,7 @@ class Session : public sigc::trackable, public Stateful /* NAMED SELECTIONS */ - mutable PBD::Lock named_selection_lock; + mutable Glib::Mutex named_selection_lock; typedef set<NamedSelection *> NamedSelectionList; NamedSelectionList named_selections; @@ -1601,7 +1595,7 @@ class Session : public sigc::trackable, public Stateful vector<space_and_path> session_dirs; vector<space_and_path>::iterator last_rr_session_dir; uint32_t _total_free_4k_blocks; - PBD::Lock space_lock; + Glib::Mutex space_lock; static const char* sound_dir_name; static const char* tape_dir_name; @@ -1612,22 +1606,15 @@ class Session : public sigc::trackable, public Stateful int ensure_sound_dir (string, string&); void refresh_disk_space (); -<<<<<<< .working - atomic_t _playback_load; - atomic_t _capture_load; - atomic_t _playback_load_min; - atomic_t _capture_load_min; -======= mutable gint _playback_load; mutable gint _capture_load; mutable gint _playback_load_min; mutable gint _capture_load_min; ->>>>>>> .merge-right.r579 /* I/O Connections */ typedef list<Connection *> ConnectionList; - mutable PBD::Lock connection_lock; + mutable Glib::Mutex connection_lock; ConnectionList _connections; int load_connections (const XMLNode&); @@ -1686,7 +1673,7 @@ class Session : public sigc::trackable, public Stateful Sample* click_emphasis_data; jack_nframes_t click_length; jack_nframes_t click_emphasis_length; - mutable PBD::NonBlockingRWLock click_lock; + mutable Glib::RWLock click_lock; static const Sample default_click[]; static const jack_nframes_t default_click_length; diff --git a/libs/ardour/ardour/session_connection.h b/libs/ardour/ardour/session_connection.h index caa20ed387..addc896b0b 100644 --- a/libs/ardour/ardour/session_connection.h +++ b/libs/ardour/ardour/session_connection.h @@ -29,7 +29,7 @@ namespace ARDOUR { template<class T> void Session::foreach_connection (T *obj, void (T::*func)(Connection *)) { - LockMonitor lm (connection_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (connection_lock); for (ConnectionList::iterator i = _connections.begin(); i != _connections.end(); i++) { (obj->*func) (*i); } diff --git a/libs/ardour/ardour/session_diskstream.h b/libs/ardour/ardour/session_diskstream.h index 24693c5793..3c888c92c3 100644 --- a/libs/ardour/ardour/session_diskstream.h +++ b/libs/ardour/ardour/session_diskstream.h @@ -29,7 +29,7 @@ namespace ARDOUR { template<class T> void Session::foreach_diskstream (T *obj, void (T::*func)(DiskStream&)) { - RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (diskstream_lock); for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); i++) { if (!(*i)->hidden()) { (obj->*func) (**i); diff --git a/libs/ardour/ardour/session_playlist.h b/libs/ardour/ardour/session_playlist.h index 925a60182a..6f1b8dbd12 100644 --- a/libs/ardour/ardour/session_playlist.h +++ b/libs/ardour/ardour/session_playlist.h @@ -29,7 +29,7 @@ namespace ARDOUR { template<class T> void Session::foreach_playlist (T *obj, void (T::*func)(Playlist *)) { - LockMonitor lm (playlist_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (playlist_lock); for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); i++) { if (!(*i)->hidden()) { (obj->*func) (*i); diff --git a/libs/ardour/ardour/session_region.h b/libs/ardour/ardour/session_region.h index 16580d8e73..13d88a9aa4 100644 --- a/libs/ardour/ardour/session_region.h +++ b/libs/ardour/ardour/session_region.h @@ -8,7 +8,7 @@ namespace ARDOUR { template<class T> void Session::foreach_audio_region (T *obj, void (T::*func)(AudioRegion *)) { - LockMonitor lm (region_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (region_lock); for (AudioRegionList::iterator i = audio_regions.begin(); i != audio_regions.end(); i++) { (obj->*func) ((*i).second); } diff --git a/libs/ardour/ardour/session_route.h b/libs/ardour/ardour/session_route.h index f3c8e3f5fb..afe78b394e 100644 --- a/libs/ardour/ardour/session_route.h +++ b/libs/ardour/ardour/session_route.h @@ -23,7 +23,8 @@ #include <iostream> -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> + #include <ardour/session.h> #include <ardour/route.h> @@ -35,7 +36,7 @@ Session::foreach_route (T *obj, void (T::*func)(Route&)) RouteList public_order; { - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (route_lock); public_order = routes; } @@ -53,7 +54,7 @@ Session::foreach_route (T *obj, void (T::*func)(Route*)) RouteList public_order; { - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (route_lock); public_order = routes; } @@ -72,7 +73,7 @@ Session::foreach_route (T *obj, void (T::*func)(Route&, A), A arg1) RouteList public_order; { - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (route_lock); public_order = routes; } diff --git a/libs/ardour/ardour/session_selection.h b/libs/ardour/ardour/session_selection.h index a1dd31d7ff..a110c2c3da 100644 --- a/libs/ardour/ardour/session_selection.h +++ b/libs/ardour/ardour/session_selection.h @@ -29,7 +29,7 @@ namespace ARDOUR { template<class T> void Session::foreach_named_selection (T& obj, void (T::*func)(NamedSelection&)) { - LockMonitor lm (named_selection_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (named_selection_lock); for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); i++) { (obj.*func) (**i); } diff --git a/libs/ardour/ardour/slave.h b/libs/ardour/ardour/slave.h index 90e63aed83..0079c10e0a 100644 --- a/libs/ardour/ardour/slave.h +++ b/libs/ardour/ardour/slave.h @@ -25,7 +25,6 @@ #include <jack/jack.h> -#include <pthread.h> #include <sigc++/signal.h> #include <ardour/ardour.h> #include <midi++/parser.h> diff --git a/libs/ardour/ardour/sndfilesource.h b/libs/ardour/ardour/sndfilesource.h index 2bd6042ec2..5d11c9ef09 100644 --- a/libs/ardour/ardour/sndfilesource.h +++ b/libs/ardour/ardour/sndfilesource.h @@ -43,7 +43,7 @@ class SndFileSource : public ExternalSource { mutable float *tmpbuf; mutable jack_nframes_t tmpbufsize; - mutable PBD::Lock _tmpbuf_lock; + mutable Glib::Mutex _tmpbuf_lock; void init (const string &str, bool build_peak); }; diff --git a/libs/ardour/ardour/source.h b/libs/ardour/ardour/source.h index 2eee7a7634..3781950fbf 100644 --- a/libs/ardour/ardour/source.h +++ b/libs/ardour/ardour/source.h @@ -25,10 +25,12 @@ #include <vector> #include <string> -#include <time.h> +#include <ctime> #include <sigc++/signal.h> +#include <glibmm/thread.h> + #include <ardour/ardour.h> #include <ardour/stateful.h> #include <pbd/xml++.h> @@ -125,7 +127,7 @@ class Source : public Stateful, public sigc::trackable string _name; uint32_t _use_cnt; bool _peaks_built; - mutable PBD::Lock _lock; + mutable Glib::Mutex _lock; jack_nframes_t _length; bool next_peak_clear_should_notify; string peakpath; @@ -156,7 +158,7 @@ class Source : public Stateful, public sigc::trackable }; static vector<Source*> pending_peak_sources; - static PBD::Lock pending_peak_sources_lock; + static Glib::StaticMutex pending_peak_sources_lock; static void queue_for_peaks (Source&); static void clear_queue_for_peaks (); diff --git a/libs/ardour/ardour/tempo.h b/libs/ardour/ardour/tempo.h index 2f04f603e7..13e8eb6348 100644 --- a/libs/ardour/ardour/tempo.h +++ b/libs/ardour/ardour/tempo.h @@ -25,8 +25,7 @@ #include <string> #include <vector> #include <cmath> -#include <pthread.h> -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> #include <pbd/undo.h> #include <sigc++/signal.h> @@ -198,7 +197,7 @@ class TempoMap : public Stateful, public StateManager { typedef vector<BBTPoint> BBTPointList; template<class T> void apply_with_metrics (T& obj, void (T::*method)(const Metrics&)) { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); (obj.*method)(*metrics); } @@ -285,7 +284,7 @@ class TempoMap : public Stateful, public StateManager { jack_nframes_t last_bbt_when; bool last_bbt_valid; BBT_Time last_bbt; - mutable PBD::Lock lock; + mutable Glib::Mutex lock; void timestamp_metrics (); diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 9cfe9d3a27..3d7ab4b59a 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -29,7 +29,6 @@ #include <inttypes.h> #include <jack/types.h> -#include <ardour/smpte.h> #include <map> #if __GNUC__ < 3 @@ -100,6 +99,33 @@ namespace ARDOUR { Destructive }; + enum smpte_wrap_t { + smpte_wrap_none = 0, + smpte_wrap_frames, + smpte_wrap_seconds, + smpte_wrap_minutes, + smpte_wrap_hours + }; + + struct SMPTE_Time { + bool negative; + uint32_t hours; + uint32_t minutes; + uint32_t seconds; + uint32_t frames; + uint32_t subframes; // mostly not used + + SMPTE_Time() { + negative = false; + hours = 0; + minutes = 0; + seconds = 0; + frames = 0; + subframes = 0; + } + + }; + struct BBT_Time { uint32_t bars; uint32_t beats; @@ -138,7 +164,7 @@ namespace ARDOUR { Type type; - SMPTE::Time smpte; + SMPTE_Time smpte; BBT_Time bbt; union { diff --git a/libs/ardour/ardour/vst_plugin.h b/libs/ardour/ardour/vst_plugin.h index 6ae64ab50c..ee8e6e986b 100644 --- a/libs/ardour/ardour/vst_plugin.h +++ b/libs/ardour/ardour/vst_plugin.h @@ -35,7 +35,6 @@ #include <ardour/stateful.h> #include <ardour/plugin_state.h> #include <ardour/plugin.h> -#include <ardour/vst_plugin.h> using std::string; using std::vector; diff --git a/libs/ardour/audio_playlist.cc b/libs/ardour/audio_playlist.cc index 53aa173ffd..9f3c02ce43 100644 --- a/libs/ardour/audio_playlist.cc +++ b/libs/ardour/audio_playlist.cc @@ -203,7 +203,7 @@ AudioPlaylist::read (Sample *buf, Sample *mixdown_buffer, float *gain_buffer, ch its OK to block (for short intervals). */ - LockMonitor rm (region_lock, __LINE__, __FILE__); + Glib::Mutex::Lock rm (region_lock); end = start + cnt - 1; @@ -504,7 +504,7 @@ AudioPlaylist::add_crossfade (Crossfade& xfade) void AudioPlaylist::notify_crossfade_added (Crossfade *x) { - if (atomic_read(&block_notifications)) { + if (g_atomic_int_get(&block_notifications)) { _pending_xfade_adds.insert (_pending_xfade_adds.end(), x); } else { NewCrossfade (x); /* EMIT SIGNAL */ @@ -886,8 +886,14 @@ AudioPlaylist::get_equivalent_regions (const AudioRegion& other, vector<AudioReg AudioRegion* ar = dynamic_cast<AudioRegion*> (*i); - if (ar && ar->equivalent (other)) { - results.push_back (ar); + if (ar) { + if (Config->get_use_overlap_equivalency()) { + if (ar->overlap_equivalent (other)) { + results.push_back (ar); + } else if (ar->equivalent (other)) { + results.push_back (ar); + } + } } } } diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc index 702d167a4f..30adc54d1a 100644 --- a/libs/ardour/audio_track.cc +++ b/libs/ardour/audio_track.cc @@ -625,7 +625,7 @@ AudioTrack::roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nfram jack_nframes_t transport_frame; { - TentativeRWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK); if (lm.locked()) { // automation snapshot can also be called from the non-rt context // and it uses the redirect list, so we take the lock out here @@ -709,7 +709,7 @@ AudioTrack::roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nfram /* don't waste time with automation if we're recording or we've just stopped (yes it can happen) */ if (!diskstream->record_enabled() && _session.transport_rolling()) { - TentativeLockMonitor am (automation_lock, __LINE__, __FILE__); + Glib::Mutex::Lock am (automation_lock, Glib::TRY_LOCK); if (am.locked() && gain_automation_playback()) { apply_gain_automation = _gain_automation_curve.rt_safe_get_vector (start_frame, end_frame, _session.gain_automation_buffer(), nframes); @@ -789,7 +789,7 @@ AudioTrack::export_stuff (vector<Sample*>& buffers, char * workbuf, uint32_t nbu vector<Sample*>::iterator bi; Sample * b; - RWLockMonitor rlock (redirect_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock rlock (redirect_lock); if (diskstream->playlist()->read (buffers[0], mix_buffer, gain_buffer, workbuf, start, nframes) != nframes) { return -1; @@ -958,7 +958,7 @@ AudioTrack::freeze (InterThreadInfo& itt) _freeze_record.have_mementos = true; { - RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (redirect_lock); for (RedirectList::iterator r = _redirects.begin(); r != _redirects.end(); ++r) { @@ -1015,7 +1015,7 @@ AudioTrack::unfreeze () } else { - RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__); // should this be a write lock? jlc + Glib::RWLock::ReaderLock lm (redirect_lock); // should this be a write lock? jlc for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) { for (vector<FreezeRecordInsertInfo*>::iterator ii = _freeze_record.insert_info.begin(); ii != _freeze_record.insert_info.end(); ++ii) { if ((*ii)->id == (*i)->id()) { diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index a0cf29eb89..87866e7b31 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -22,6 +22,7 @@ #include <cerrno> #include <vector> +#include <glibmm/timer.h> #include <pbd/pthread_utils.h> #include <ardour/audioengine.h> @@ -45,7 +46,6 @@ jack_nframes_t Port::long_over_length = 10; AudioEngine::AudioEngine (string client_name) { - pthread_cond_init (&session_removed, 0); session = 0; session_remove_pending = false; _running = false; @@ -60,10 +60,12 @@ AudioEngine::AudioEngine (string client_name) _buffer_size = 0; _freewheeling = false; _freewheel_thread_registered = false; - last_meter_point = 0; - meter_interval = 0; - meter_thread_id = (pthread_t) 0; + + m_meter_thread = 0; + m_meter_exit = false; + start_metering_thread(); + if (connect_to_jack (client_name)) { throw NoBackendAvailable (); } @@ -76,9 +78,9 @@ AudioEngine::~AudioEngine () jack_client_close (_jack); } - if (meter_thread_id != (pthread_t) 0) { - pthread_cancel (meter_thread_id); - } + if(m_meter_thread) { + g_atomic_int_inc(&m_meter_exit); + } } void @@ -212,7 +214,6 @@ AudioEngine::_graph_order_callback (void *arg) return 0; } -/** @callgraph */ int AudioEngine::_process_callback (jack_nframes_t nframes, void *arg) { @@ -225,11 +226,10 @@ AudioEngine::_freewheel_callback (int onoff, void *arg) static_cast<AudioEngine*>(arg)->_freewheeling = onoff; } -/** @callgraph */ int AudioEngine::process_callback (jack_nframes_t nframes) { - TentativeLockMonitor tm (_process_lock, __LINE__, __FILE__); + Glib::Mutex::Lock tm (_process_lock, Glib::TRY_LOCK); jack_nframes_t next_processed_frames; /* handle wrap around of total frames counter */ @@ -248,7 +248,7 @@ AudioEngine::process_callback (jack_nframes_t nframes) if (session_remove_pending) { session = 0; session_remove_pending = false; - pthread_cond_signal (&session_removed); + session_removed.signal(); _processed_frames = next_processed_frames; return 0; } @@ -271,14 +271,7 @@ AudioEngine::process_callback (jack_nframes_t nframes) _processed_frames = next_processed_frames; return 0; } - - /* manage meters */ - if ((meter_interval > _buffer_size) && (last_meter_point + meter_interval < next_processed_frames)) { - IO::Meter (); - last_meter_point = next_processed_frames; - } - if (last_monitor_check + monitor_check_interval < next_processed_frames) { for (Ports::iterator i = ports.begin(); i != ports.end(); ++i) { @@ -317,11 +310,6 @@ AudioEngine::jack_sample_rate_callback (jack_nframes_t nframes) monitor_check_interval = nframes / 10; last_monitor_check = 0; - meter_interval = nframes / 100; - last_meter_point = 0; - - maybe_start_metering_thread (); - if (session) { session->set_frame_rate (nframes); } @@ -352,48 +340,25 @@ AudioEngine::jack_bufsize_callback (jack_nframes_t nframes) session->set_block_size (_buffer_size); } - maybe_start_metering_thread (); - return 0; } void -AudioEngine::maybe_start_metering_thread () -{ - if (meter_interval == 0) { - return; - } - - if (_buffer_size == 0) { - return; - } - - if (meter_interval < _buffer_size) { - if (meter_thread_id != (pthread_t) 0) { - pthread_cancel (meter_thread_id); - } - pthread_create (&meter_thread_id, 0, _meter_thread, this); - } -} - -void* -AudioEngine::_meter_thread (void *arg) +AudioEngine::start_metering_thread () { - return static_cast<AudioEngine*>(arg)->meter_thread (); + if(m_meter_thread == 0) { + m_meter_thread = Glib::Thread::create (sigc::mem_fun(this, &AudioEngine::meter_thread), false); + } } -void* +void AudioEngine::meter_thread () { - PBD::ThreadCreated (pthread_self(), "Metering"); - - while (true) { - usleep (10000); /* 1/100th sec interval */ - pthread_testcancel(); - IO::Meter (); + while (g_atomic_int_get(&m_meter_exit) != true) { + Glib::usleep (10000); /* 1/100th sec interval */ + IO::update_meters (); } - - return 0; + return; } void @@ -407,13 +372,13 @@ AudioEngine::set_session (Session *s) void AudioEngine::remove_session () { - LockMonitor lm (_process_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (_process_lock); if (_running) { if (session) { session_remove_pending = true; - pthread_cond_wait (&session_removed, _process_lock.mutex()); + session_removed.wait(_process_lock); } } else { @@ -450,7 +415,7 @@ AudioEngine::register_audio_input_port (const string& portname) } else { - pthread_mutex_unlock (_process_lock.mutex()); + _process_lock.unlock(); throw PortRegistrationFailure(); } @@ -478,7 +443,7 @@ AudioEngine::register_audio_output_port (const string& portname) } else { - pthread_mutex_unlock (_process_lock.mutex()); + _process_lock.unlock(); throw PortRegistrationFailure (); } @@ -635,7 +600,7 @@ AudioEngine::frames_per_cycle () Port * AudioEngine::get_port_by_name (const string& portname, bool keep) { - LockMonitor lm (_process_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (_process_lock); if (!_running) { if (!_has_run) { @@ -968,7 +933,7 @@ AudioEngine::reconnect_to_jack () if (_jack) { disconnect_from_jack (); /* XXX give jackd a chance */ - usleep (250000); + Glib::usleep (250000); } if (connect_to_jack (jack_client_name)) { diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc index 95201ab6f7..21773d9222 100644 --- a/libs/ardour/audioregion.cc +++ b/libs/ardour/audioregion.cc @@ -27,8 +27,9 @@ #include <sigc++/bind.h> #include <sigc++/class_slot.h> +#include <glibmm/thread.h> + #include <pbd/basename.h> -#include <pbd/lockmonitor.h> #include <pbd/xml++.h> #include <ardour/audioregion.h> @@ -1139,15 +1140,15 @@ AudioRegion::master_source_names () } bool -AudioRegion::region_list_equivalent (const AudioRegion& other) +AudioRegion::region_list_equivalent (const AudioRegion& other) const { return size_equivalent (other) && source_equivalent (other) && _name == other._name; } bool -AudioRegion::source_equivalent (const AudioRegion& other) +AudioRegion::source_equivalent (const AudioRegion& other) const { - SourceList::iterator i; + SourceList::const_iterator i; SourceList::const_iterator io; for (i = sources.begin(), io = other.sources.begin(); i != sources.end() && io != other.sources.end(); ++i, ++io) { @@ -1166,7 +1167,13 @@ AudioRegion::source_equivalent (const AudioRegion& other) } bool -AudioRegion::equivalent (const AudioRegion& other) +AudioRegion::overlap_equivalent (const AudioRegion& other) const +{ + return coverage (other.first_frame(), other.last_frame()) != OverlapNone; +} + +bool +AudioRegion::equivalent (const AudioRegion& other) const { return _start == other._start && _position == other._position && @@ -1174,7 +1181,7 @@ AudioRegion::equivalent (const AudioRegion& other) } bool -AudioRegion::size_equivalent (const AudioRegion& other) +AudioRegion::size_equivalent (const AudioRegion& other) const { return _start == other._start && _length == other._length; diff --git a/libs/ardour/auditioner.cc b/libs/ardour/auditioner.cc index ed97cf7b39..ce7b9a3e6f 100644 --- a/libs/ardour/auditioner.cc +++ b/libs/ardour/auditioner.cc @@ -18,7 +18,7 @@ $Id$ */ -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> #include <ardour/diskstream.h> #include <ardour/audioregion.h> @@ -57,7 +57,7 @@ Auditioner::Auditioner (Session& s) IO::output_changed.connect (mem_fun (*this, &Auditioner::output_changed)); the_region = 0; - atomic_set (&_active, 0); + g_atomic_int_set (&_active, 0); } Auditioner::~Auditioner () @@ -74,14 +74,14 @@ Auditioner::prepare_playlist () void Auditioner::audition_current_playlist () { - if (atomic_read (&_active)) { + if (g_atomic_int_get (&_active)) { /* don't go via session for this, because we are going to remain active. */ cancel_audition (); } - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); diskstream->seek (0); length = diskstream->playlist()->get_maximum_extent(); current_frame = 0; @@ -90,20 +90,20 @@ Auditioner::audition_current_playlist () _panner->reset (n_outputs(), diskstream->n_channels()); - atomic_set (&_active, 1); + g_atomic_int_set (&_active, 1); } void Auditioner::audition_region (AudioRegion& region) { - if (atomic_read (&_active)) { + if (g_atomic_int_get (&_active)) { /* don't go via session for this, because we are going to remain active. */ cancel_audition (); } - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); the_region = new AudioRegion (region); the_region->set_position (0, this); @@ -126,7 +126,7 @@ Auditioner::audition_region (AudioRegion& region) length = the_region->length(); diskstream->seek (0); current_frame = 0; - atomic_set (&_active, 1); + g_atomic_int_set (&_active, 1); } int @@ -136,7 +136,7 @@ Auditioner::play_audition (jack_nframes_t nframes) jack_nframes_t this_nframes; int ret; - if (atomic_read (&_active) == 0) { + if (g_atomic_int_get (&_active) == 0) { silence (nframes, 0); return 0; } diff --git a/libs/ardour/automation_event.cc b/libs/ardour/automation_event.cc index 88932009bf..17888c4a7c 100644 --- a/libs/ardour/automation_event.cc +++ b/libs/ardour/automation_event.cc @@ -225,7 +225,7 @@ void AutomationList::clear () { { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); events.clear (); if (!no_state) { save_state (_("cleared")); @@ -239,14 +239,14 @@ AutomationList::clear () void AutomationList::x_scale (double factor) { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); _x_scale (factor); } bool AutomationList::extend_to (double when) { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); if (events.empty() || events.back()->when == when) { return false; } @@ -285,7 +285,7 @@ AutomationList::rt_add (double when, double value) // cerr << "RT: alist @ " << this << " add " << value << " @ " << when << endl; { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); iterator where; TimeComparator cmp; @@ -369,7 +369,7 @@ AutomationList::add (double when, double value, bool for_loading) /* this is for graphical editing and loading data from storage */ { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); TimeComparator cmp; ControlEvent cp (when, 0.0f); bool insert = true; @@ -413,7 +413,7 @@ void AutomationList::erase (AutomationList::iterator i) { { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); events.erase (i); reposition_for_rt_add (0); if (!no_state) { @@ -428,7 +428,7 @@ void AutomationList::erase (AutomationList::iterator start, AutomationList::iterator end) { { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); events.erase (start, end); reposition_for_rt_add (0); if (!no_state) { @@ -445,7 +445,7 @@ AutomationList::reset_range (double start, double endt) bool reset = false; { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); TimeComparator cmp; ControlEvent cp (start, 0.0f); iterator s; @@ -481,7 +481,7 @@ AutomationList::erase_range (double start, double endt) bool erased = false; { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); TimeComparator cmp; ControlEvent cp (start, 0.0f); iterator s; @@ -515,7 +515,7 @@ AutomationList::move_range (iterator start, iterator end, double xdelta, double */ { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); while (start != end) { (*start)->when += xdelta; @@ -542,7 +542,7 @@ AutomationList::modify (iterator iter, double when, double val) */ { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); (*iter)->when = when; (*iter)->value = val; if (!no_state) { @@ -558,7 +558,7 @@ AutomationList::modify (iterator iter, double when, double val) std::pair<AutomationList::iterator,AutomationList::iterator> AutomationList::control_points_adjacent (double xval) { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); iterator i; TimeComparator cmp; ControlEvent cp (xval, 0.0f); @@ -620,7 +620,7 @@ Change AutomationList::restore_state (StateManager::State& state) { { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); State* lstate = dynamic_cast<State*> (&state); events.clear (); @@ -655,7 +655,7 @@ void AutomationList::truncate_end (double last_coordinate) { { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); ControlEvent cp (last_coordinate, 0); list<ControlEvent*>::reverse_iterator i; double last_val; @@ -760,7 +760,7 @@ void AutomationList::truncate_start (double overall_length) { { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); AutomationList::iterator i; double first_legal_value; double first_legal_coordinate; @@ -998,7 +998,7 @@ AutomationList::cut (iterator start, iterator end) AutomationList* nal = new AutomationList (default_value); { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); for (iterator x = start; x != end; ) { iterator tmp; @@ -1032,7 +1032,7 @@ AutomationList::cut_copy_clear (double start, double end, int op) bool changed = false; { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); if ((s = lower_bound (events.begin(), events.end(), &cp, cmp)) == events.end()) { return nal; @@ -1094,7 +1094,7 @@ AutomationList::copy (iterator start, iterator end) AutomationList* nal = new AutomationList (default_value); { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); for (iterator x = start; x != end; ) { iterator tmp; @@ -1141,7 +1141,7 @@ AutomationList::paste (AutomationList& alist, double pos, float times) } { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); iterator where; iterator prev; double end = 0; diff --git a/libs/ardour/connection.cc b/libs/ardour/connection.cc index 83e0a87dc1..719751f7ba 100644 --- a/libs/ardour/connection.cc +++ b/libs/ardour/connection.cc @@ -28,7 +28,6 @@ #include "i18n.h" using namespace ARDOUR; -using namespace PBD; Connection::Connection (const XMLNode& node) { @@ -58,7 +57,7 @@ void Connection::add_connection (int port, string portname) { { - LockMonitor lm (port_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (port_lock); _ports[port].push_back (portname); } ConnectionsChanged (port); /* EMIT SIGNAL */ @@ -70,7 +69,7 @@ Connection::remove_connection (int port, string portname) bool changed = false; { - LockMonitor lm (port_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (port_lock); PortList& pl = _ports[port]; PortList::iterator i = find (pl.begin(), pl.end(), portname); @@ -88,7 +87,7 @@ Connection::remove_connection (int port, string portname) const Connection::PortList& Connection::port_connections (int port) const { - LockMonitor lm (port_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (port_lock); return _ports[port]; } @@ -102,7 +101,7 @@ void Connection::add_port () { { - LockMonitor lm (port_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (port_lock); _ports.push_back (PortList()); } ConfigurationChanged(); /* EMIT SIGNAL */ @@ -114,7 +113,7 @@ Connection::remove_port (int which_port) bool changed = false; { - LockMonitor lm (port_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (port_lock); vector<PortList>::iterator i; int n; @@ -135,7 +134,7 @@ void Connection::clear () { { - LockMonitor lm (port_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (port_lock); _ports.clear (); } diff --git a/libs/ardour/control_protocol_manager.cc b/libs/ardour/control_protocol_manager.cc index ca1eefc3fe..57a89cc2d9 100644 --- a/libs/ardour/control_protocol_manager.cc +++ b/libs/ardour/control_protocol_manager.cc @@ -13,7 +13,6 @@ using namespace ARDOUR; -using namespace PBD; using namespace std; #include "i18n.h" @@ -32,7 +31,7 @@ ControlProtocolManager::ControlProtocolManager () ControlProtocolManager::~ControlProtocolManager() { - LockMonitor lm (protocols_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (protocols_lock); for (list<ControlProtocol*>::iterator i = control_protocols.begin(); i != control_protocols.end(); ++i) { delete (*i); @@ -62,7 +61,7 @@ ControlProtocolManager::drop_session () _session = 0; { - LockMonitor lm (protocols_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (protocols_lock); for (list<ControlProtocol*>::iterator p = control_protocols.begin(); p != control_protocols.end(); ++p) { delete *p; } @@ -89,7 +88,7 @@ ControlProtocolManager::instantiate (ControlProtocolInfo& cpi) return 0; } - LockMonitor lm (protocols_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (protocols_lock); control_protocols.push_back (cpi.protocol); return cpi.protocol; @@ -113,7 +112,7 @@ ControlProtocolManager::teardown (ControlProtocolInfo& cpi) cpi.descriptor->destroy (cpi.descriptor, cpi.protocol); { - LockMonitor lm (protocols_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (protocols_lock); list<ControlProtocol*>::iterator p = find (control_protocols.begin(), control_protocols.end(), cpi.protocol); if (p != control_protocols.end()) { control_protocols.erase (p); @@ -281,7 +280,7 @@ XMLNode& ControlProtocolManager::get_state (void) { XMLNode* root = new XMLNode (state_node_name); - LockMonitor lm (protocols_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (protocols_lock); for (list<ControlProtocolInfo*>::iterator i = control_protocol_info.begin(); i != control_protocol_info.end(); ++i) { XMLNode* child = new XMLNode (X_("Protocol")); diff --git a/libs/ardour/coreaudio_source.cc b/libs/ardour/coreaudio_source.cc index d81630d6b7..67aaabfb88 100644 --- a/libs/ardour/coreaudio_source.cc +++ b/libs/ardour/coreaudio_source.cc @@ -66,29 +66,34 @@ CoreAudioSource::init (const string& idstr, bool build_peak) } /* note that we temporarily truncated _id at the colon */ - FSRef ref; - err = FSPathMakeRef ((UInt8*)file.c_str(), &ref, 0); + FSRef fsr; + err = FSPathMakeRef ((UInt8*)file.c_str(), &fsr, 0); if (err != noErr) { + cerr << "FSPathMakeRef " << err << endl; throw failed_constructor(); } - err = ExtAudioFileOpen (&ref, &af); + err = ExtAudioFileOpen (&fsr, &af); if (err != noErr) { + cerr << "ExtAudioFileOpen " << err << endl; ExtAudioFileDispose (af); throw failed_constructor(); } AudioStreamBasicDescription file_asbd; - memset(&file_asbd, 0, sizeof(file_asbd)); - size_t asbd_size = sizeof(file_asbd); + memset(&file_asbd, 0, sizeof(AudioStreamBasicDescription)); + size_t asbd_size = sizeof(AudioStreamBasicDescription); err = ExtAudioFileGetProperty(af, kExtAudioFileProperty_FileDataFormat, &asbd_size, &file_asbd); if (err != noErr) { + cerr << "ExtAudioFileGetProperty1 " << err << endl; ExtAudioFileDispose (af); throw failed_constructor(); } n_channels = file_asbd.mChannelsPerFrame; + cerr << "number of channels: " << n_channels << endl; + if (channel >= n_channels) { error << string_compose(_("CoreAudioSource: file only contains %1 channels; %2 is invalid as a channel number"), n_channels, channel) << endmsg; ExtAudioFileDispose (af); @@ -96,42 +101,43 @@ CoreAudioSource::init (const string& idstr, bool build_peak) } int64_t ca_frames; - size_t prop_size = sizeof(ca_frames); + size_t prop_size = sizeof(int64_t); err = ExtAudioFileGetProperty(af, kExtAudioFileProperty_FileLengthFrames, &prop_size, &ca_frames); if (err != noErr) { + cerr << "ExtAudioFileGetProperty2 " << err << endl; ExtAudioFileDispose (af); throw failed_constructor(); } - _length = ca_frames; + _length = ca_frames; _path = file; - if (build_peak) { - if (initialize_peakfile (false, file)) { - error << "initialize peakfile failed" << endmsg; - ExtAudioFileDispose (af); - throw failed_constructor (); - } - } - AudioStreamBasicDescription client_asbd; - memset(&client_asbd, 0, sizeof(client_asbd)); + memset(&client_asbd, 0, sizeof(AudioStreamBasicDescription)); + client_asbd.mSampleRate = file_asbd.mSampleRate; client_asbd.mFormatID = kAudioFormatLinearPCM; client_asbd.mFormatFlags = kLinearPCMFormatFlagIsFloat; - client_asbd.mSampleRate = file_asbd.mSampleRate; - - err = AudioFormatGetProperty(kAudioFormatProperty_FormatInfo, 0, NULL, &asbd_size, &client_asbd); - if (err != noErr) { - ExtAudioFileDispose (af); - throw failed_constructor (); - } + client_asbd.mBytesPerPacket = file_asbd.mChannelsPerFrame * 4; + client_asbd.mFramesPerPacket = 1; + client_asbd.mBytesPerFrame = client_asbd.mBytesPerPacket; + client_asbd.mChannelsPerFrame = file_asbd.mChannelsPerFrame; + client_asbd.mBitsPerChannel = 32; err = ExtAudioFileSetProperty (af, kExtAudioFileProperty_ClientDataFormat, asbd_size, &client_asbd); if (err != noErr) { + cerr << "ExtAudioFileSetProperty3 " << err << endl; ExtAudioFileDispose (af); throw failed_constructor (); } + + if (build_peak) { + if (initialize_peakfile (false, file)) { + error << "initialize peakfile failed" << endmsg; + ExtAudioFileDispose (af); + throw failed_constructor (); + } + } } CoreAudioSource::~CoreAudioSource () @@ -173,7 +179,7 @@ CoreAudioSource::read (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, ch uint32_t real_cnt = cnt * n_channels; { - LockMonitor lm (_tmpbuf_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (_tmpbuf_lock); if (tmpbufsize < real_cnt) { diff --git a/libs/ardour/curve.cc b/libs/ardour/curve.cc index 613222020c..a515c3a39a 100644 --- a/libs/ardour/curve.cc +++ b/libs/ardour/curve.cc @@ -28,7 +28,7 @@ #include <cfloat> #include <cmath> -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> #include <sigc++/bind.h> #include "ardour/curve.h" @@ -37,7 +37,6 @@ using namespace std; using namespace ARDOUR; -using namespace PBD; using namespace sigc; Curve::Curve (double minv, double maxv, double canv, bool nostate) @@ -204,7 +203,7 @@ Curve::solve () bool Curve::rt_safe_get_vector (double x0, double x1, float *vec, int32_t veclen) { - TentativeLockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock, Glib::TRY_LOCK); if (!lm.locked()) { return false; @@ -217,7 +216,7 @@ Curve::rt_safe_get_vector (double x0, double x1, float *vec, int32_t veclen) void Curve::get_vector (double x0, double x1, float *vec, int32_t veclen) { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); _get_vector (x0, x1, vec, veclen); } diff --git a/libs/ardour/destructive_filesource.cc b/libs/ardour/destructive_filesource.cc index eaa1242f8c..9a4c2425e9 100644 --- a/libs/ardour/destructive_filesource.cc +++ b/libs/ardour/destructive_filesource.cc @@ -268,7 +268,7 @@ jack_nframes_t DestructiveFileSource::write (Sample* data, jack_nframes_t cnt, char * workbuf) { { - LockMonitor lm (_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (_lock); jack_nframes_t old_file_pos; diff --git a/libs/ardour/diskstream.cc b/libs/ardour/diskstream.cc index 4fb13210fa..90e8387f3f 100644 --- a/libs/ardour/diskstream.cc +++ b/libs/ardour/diskstream.cc @@ -33,7 +33,7 @@ #include <pbd/error.h> #include <pbd/basename.h> -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> #include <pbd/xml++.h> #include <ardour/ardour.h> @@ -139,7 +139,7 @@ DiskStream::init (Flag f) first_input_change = true; _playlist = 0; i_am_the_modifier = 0; - atomic_set (&_record_enabled, 0); + g_atomic_int_set (&_record_enabled, 0); was_recording = false; capture_start_frame = 0; capture_captured = 0; @@ -213,7 +213,7 @@ DiskStream::destroy_channel (ChannelInfo &chan) DiskStream::~DiskStream () { - LockMonitor lm (state_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (state_lock); if (_playlist) { _playlist->unref (); @@ -229,7 +229,7 @@ DiskStream::~DiskStream () void DiskStream::handle_input_change (IOChange change, void *src) { - LockMonitor lm (state_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (state_lock); if (!(input_change_pending & change)) { input_change_pending = IOChange (input_change_pending|change); @@ -241,7 +241,7 @@ void DiskStream::non_realtime_input_change () { { - LockMonitor lm (state_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (state_lock); if (input_change_pending == NoChange) { return; @@ -349,7 +349,7 @@ int DiskStream::use_playlist (AudioPlaylist* playlist) { { - LockMonitor lm (state_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (state_lock); if (playlist == _playlist) { return 0; @@ -565,7 +565,7 @@ DiskStream::non_realtime_set_speed () { if (_buffer_reallocation_required) { - LockMonitor lm (state_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (state_lock); allocate_temporary_buffers (); _buffer_reallocation_required = false; @@ -753,7 +753,8 @@ DiskStream::process (jack_nframes_t transport_frame, jack_nframes_t nframes, jac returns a non-zero value, in which case, ::commit should not be called. */ - if (pthread_mutex_trylock (state_lock.mutex())) { + // If we can't take the state lock return. + if (!state_lock.trylock()) { return 1; } @@ -1002,7 +1003,7 @@ DiskStream::process (jack_nframes_t transport_frame, jack_nframes_t nframes, jac be called. unlock the state lock. */ - pthread_mutex_unlock (state_lock.mutex()); + state_lock.unlock(); } return ret; @@ -1011,7 +1012,7 @@ DiskStream::process (jack_nframes_t transport_frame, jack_nframes_t nframes, jac void DiskStream::recover () { - pthread_mutex_unlock (state_lock.mutex()); + state_lock.unlock(); _processed = false; } @@ -1047,7 +1048,7 @@ DiskStream::commit (jack_nframes_t nframes) || channels[0].capture_buf->read_space() >= disk_io_chunk_frames; } - pthread_mutex_unlock (state_lock.mutex()); + state_lock.unlock(); _processed = false; @@ -1140,7 +1141,7 @@ DiskStream::overwrite_existing_buffers () int DiskStream::seek (jack_nframes_t frame, bool complete_refill) { - LockMonitor lm (state_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (state_lock); uint32_t n; int ret; ChannelList::iterator chan; @@ -1702,7 +1703,7 @@ DiskStream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture } /* XXX is there anything we can do if err != 0 ? */ - LockMonitor lm (capture_info_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (capture_info_lock); if (capture_info.empty()) { return; @@ -1925,7 +1926,7 @@ DiskStream::set_record_enabled (bool yn, void* src) if (record_enabled() != yn) { if (yn) { - atomic_set (&_record_enabled, 1); + g_atomic_int_set (&_record_enabled, 1); capturing_sources.clear (); if (Config->get_use_hardware_monitoring()) { for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) { @@ -1941,7 +1942,7 @@ DiskStream::set_record_enabled (bool yn, void* src) } } else { - atomic_set (&_record_enabled, 0); + g_atomic_int_set (&_record_enabled, 0); if (Config->get_use_hardware_monitoring()) { for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) { if ((*chan).source) { @@ -2415,7 +2416,7 @@ DiskStream::set_loop (Location *location) jack_nframes_t DiskStream::get_capture_start_frame (uint32_t n) { - LockMonitor lm (capture_info_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (capture_info_lock); if (capture_info.size() > n) { return capture_info[n]->start; @@ -2428,7 +2429,7 @@ DiskStream::get_capture_start_frame (uint32_t n) jack_nframes_t DiskStream::get_captured_frames (uint32_t n) { - LockMonitor lm (capture_info_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (capture_info_lock); if (capture_info.size() > n) { return capture_info[n]->frames; diff --git a/libs/ardour/filesource.cc b/libs/ardour/filesource.cc index 568ce46bd1..63a9a3d014 100644 --- a/libs/ardour/filesource.cc +++ b/libs/ardour/filesource.cc @@ -53,10 +53,11 @@ #include <vector> #include <cstdio> /* for rename(2) */ +#include <glibmm.h> + #include <pbd/stl_delete.h> -#include <pbd/basename.h> -#include <pbd/dirname.h> -#include <pbd/lockmonitor.h> + +#include <glibmm/thread.h> #include <pbd/pathscanner.h> #include <ardour/ardour.h> @@ -351,7 +352,7 @@ FileSource::set_allow_remove_if_empty (bool yn) int FileSource::set_name (string newname, bool destructive) { - LockMonitor lm (_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (_lock); string oldpath = _path; string newpath = Session::change_audio_path_by_name (oldpath, _name, newname, destructive); @@ -365,7 +366,7 @@ FileSource::set_name (string newname, bool destructive) return -1; } - _name = basename (newpath); + _name = Glib::path_get_basename (newpath); _path = newpath; return rename_peakfile (peak_path (_path)); @@ -680,7 +681,7 @@ FileSource::compute_header_size () int FileSource::update_header (jack_nframes_t when, struct tm& now, time_t tnow) { - LockMonitor lm (_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (_lock); if (is_bwf) { /* random code is 9 digits */ @@ -1009,7 +1010,7 @@ FileSource::mark_for_remove () jack_nframes_t FileSource::read (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const { - LockMonitor lm (_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (_lock); return read_unlocked (dst, start, cnt, workbuf); } @@ -1055,7 +1056,7 @@ jack_nframes_t FileSource::write (Sample *data, jack_nframes_t cnt, char * workbuf) { { - LockMonitor lm (_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (_lock); jack_nframes_t oldlen; int32_t frame_pos = _length; @@ -1287,7 +1288,7 @@ FileSource::is_empty (string path) void FileSource::mark_streaming_write_completed () { - LockMonitor lm (_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (_lock); next_peak_clear_should_notify = true; @@ -1313,13 +1314,15 @@ FileSource::move_to_trash (const string trash_dir_name) on whichever filesystem it was already on. */ - newpath = PBD::dirname (_path); - newpath = PBD::dirname (newpath); + // XXX Portability + + newpath = Glib::path_get_dirname (_path); + newpath = Glib::path_get_dirname (newpath); newpath += '/'; newpath += trash_dir_name; newpath += '/'; - newpath += PBD::basename (_path); + newpath += Glib::path_get_basename (_path); if (access (newpath.c_str(), F_OK) == 0) { diff --git a/libs/ardour/gdither.cc b/libs/ardour/gdither.cc index 3cdd7ee89e..ec6bfaa2ea 100644 --- a/libs/ardour/gdither.cc +++ b/libs/ardour/gdither.cc @@ -175,7 +175,7 @@ inline static void gdither_innner_loop(const GDitherType dt, const int clamp_l) { uint32_t pos, i; - u_int8_t *o8 = (u_int8_t*) y; + uint8_t *o8 = (uint8_t*) y; int16_t *o16 = (int16_t*) y; int32_t *o32 = (int32_t*) y; float tmp, r, ideal; diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc index a618f17be5..762ee101f8 100644 --- a/libs/ardour/globals.cc +++ b/libs/ardour/globals.cc @@ -40,7 +40,6 @@ #include <midi++/mmc.h> #include <ardour/ardour.h> -#include <ardour/audioengine.h> #include <ardour/audio_library.h> #include <ardour/configuration.h> #include <ardour/plugin_manager.h> @@ -48,7 +47,10 @@ #include <ardour/utils.h> #include <ardour/session.h> #include <ardour/control_protocol_manager.h> + +#ifdef HAVE_LIBLO #include <ardour/osc.h> +#endif #include <ardour/mix.h> @@ -60,7 +62,10 @@ ARDOUR::Configuration* ARDOUR::Config = 0; ARDOUR::AudioLibrary* ARDOUR::Library = 0; + +#ifdef HAVE_LIBLO ARDOUR::OSC* ARDOUR::osc = 0; +#endif using namespace ARDOUR; using namespace std; @@ -75,6 +80,7 @@ Change ARDOUR::PositionChanged = ARDOUR::new_change (); Change ARDOUR::NameChanged = ARDOUR::new_change (); Change ARDOUR::BoundsChanged = Change (0); // see init(), below +#ifdef HAVE_LIBLO static int setup_osc () { @@ -90,9 +96,10 @@ setup_osc () return 0; } } +#endif static int -setup_midi (AudioEngine& engine) +setup_midi () { std::map<string,Configuration::MidiPortDescriptor*>::iterator i; int nports; @@ -102,8 +109,6 @@ setup_midi (AudioEngine& engine) return 0; } - MIDI::Manager::instance()->set_api_data(engine.jack()); - for (i = Config->midi_ports.begin(); i != Config->midi_ports.end(); ++i) { Configuration::MidiPortDescriptor* port_descriptor; @@ -115,9 +120,7 @@ setup_midi (AudioEngine& engine) port_descriptor->type); if (request.status != MIDI::PortRequest::OK) { - error << string_compose( - _("MIDI port specifications for \"%1\" (%2, %3) are not understandable."), - port_descriptor->tag, port_descriptor->mode, port_descriptor->type) << endmsg; + error << string_compose(_("MIDI port specifications for \"%1\" are not understandable."), port_descriptor->tag) << endmsg; continue; } @@ -168,6 +171,7 @@ setup_midi (AudioEngine& engine) if (default_mmc_port == 0) { warning << string_compose (_("No MMC control (MIDI port \"%1\" not available)"), Config->get_mmc_port_name()) << endmsg; + return 0; } if (default_mtc_port == 0) { @@ -198,13 +202,15 @@ ARDOUR::init (AudioEngine& engine, bool use_vst, bool try_optimization, void (*s Config->set_use_vst (use_vst); - if (setup_midi (engine)) { + if (setup_midi ()) { return -1; } - + +#ifdef HAVE_LIBLO if (setup_osc ()) { return -1; } +#endif #ifdef VST_SUPPORT if (Config->get_use_vst() && fst_init (sighandler)) { @@ -327,10 +333,17 @@ ARDOUR::new_change () Change c; static uint32_t change_bit = 1; - /* XXX catch out-of-range */ + /* catch out-of-range */ + if (!change_bit) + { + fatal << _("programming error: ") + << "change_bit out of range in ARDOUR::new_change()" + << endmsg; + /*NOTREACHED*/ + } c = Change (change_bit); - change_bit <<= 1; + change_bit <<= 1; // if it shifts too far, change_bit == 0 return c; } diff --git a/libs/ardour/import.cc b/libs/ardour/import.cc index 69d5ee7b11..c13816e648 100644 --- a/libs/ardour/import.cc +++ b/libs/ardour/import.cc @@ -30,7 +30,10 @@ #include <sndfile.h> #include <samplerate.h> +#include <glibmm.h> + #include <pbd/basename.h> + #include <ardour/ardour.h> #include <ardour/session.h> #include <ardour/diskstream.h> @@ -212,7 +215,7 @@ Session::import_audiofile (import_status& status) sources.push_back(newfiles[n]); } - AudioRegion *r = new AudioRegion (sources, 0, newfiles[0]->length(), region_name_from_path (PBD::basename(basepath)), + AudioRegion *r = new AudioRegion (sources, 0, newfiles[0]->length(), region_name_from_path (Glib::path_get_basename (basepath)), 0, AudioRegion::Flag (AudioRegion::DefaultFlags | AudioRegion::WholeFile)); status.new_regions.push_back (r); @@ -228,7 +231,7 @@ Session::import_audiofile (import_status& status) did not bother to create whole-file AudioRegions for them. Do it now. */ - AudioRegion *r = new AudioRegion (*newfiles[n], 0, newfiles[n]->length(), region_name_from_path (PBD::basename (newfiles[n]->name())), + AudioRegion *r = new AudioRegion (*newfiles[n], 0, newfiles[n]->length(), region_name_from_path (Glib::path_get_basename (newfiles[n]->name())), 0, AudioRegion::Flag (AudioRegion::DefaultFlags | AudioRegion::WholeFile | AudioRegion::Import)); status.new_regions.push_back (r); @@ -285,7 +288,7 @@ Session::import_audiofile (import_status& status) string Session::build_tmp_convert_name(string infile) { - string tmp_name(_path + "/." + PBD::basename (infile.c_str()) + "XXXXXX"); + string tmp_name(_path + "/." + Glib::path_get_basename (infile.c_str()) + "XXXXXX"); char* tmp = new char[tmp_name.length() + 1]; tmp_name.copy(tmp, string::npos); tmp[tmp_name.length()] = 0; diff --git a/libs/ardour/insert.cc b/libs/ardour/insert.cc index 2c74bdc1c0..c3c3462016 100644 --- a/libs/ardour/insert.cc +++ b/libs/ardour/insert.cc @@ -76,7 +76,7 @@ PluginInsert::PluginInsert (Session& s, Plugin& plug, Placement placement) save_state (_("initial state")); { - LockMonitor em (_session.engine().process_lock(), __LINE__, __FILE__); + Glib::Mutex::Lock em (_session.engine().process_lock()); IO::MoreOutputs (output_streams ()); } @@ -97,7 +97,7 @@ PluginInsert::PluginInsert (Session& s, const XMLNode& node) _plugins[0]->ParameterChanged.connect (mem_fun (*this, &PluginInsert::parameter_changed)); { - LockMonitor em (_session.engine().process_lock(), __LINE__, __FILE__); + Glib::Mutex::Lock em (_session.engine().process_lock()); IO::MoreOutputs (output_streams()); } } @@ -410,7 +410,7 @@ PluginInsert::automation_run (vector<Sample *>& bufs, uint32_t nbufs, jack_nfram jack_nframes_t now = _session.transport_frame (); jack_nframes_t end = now + nframes; - TentativeLockMonitor lm (_automation_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (_automation_lock, Glib::TRY_LOCK); if (!lm.locked()) { connect_and_run (bufs, nbufs, nframes, offset, false); diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc index b6ea1eee6e..fa30463bd4 100644 --- a/libs/ardour/io.cc +++ b/libs/ardour/io.cc @@ -25,7 +25,8 @@ #include <sigc++/bind.h> -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> + #include <pbd/xml++.h> #include <ardour/audioengine.h> @@ -70,6 +71,8 @@ sigc::signal<int> IO::PannersLegal; sigc::signal<void,uint32_t> IO::MoreOutputs; sigc::signal<int> IO::PortsCreated; +Glib::StaticMutex IO::m_meter_signal_lock = GLIBMM_STATIC_MUTEX_INIT; + /* this is a default mapper of MIDI control values to a gain coefficient. others can be imagined. see IO::set_midi_to_gain_function(). */ @@ -126,13 +129,20 @@ IO::IO (Session& s, string name, _gain_automation_state = Off; _gain_automation_style = Absolute; - - Meter.connect (mem_fun (*this, &IO::meter)); + + { + // IO::Meter is emitted from another thread so the + // Meter signal must be protected. + Glib::Mutex::Lock guard (m_meter_signal_lock); + m_meter_connection = Meter.connect (mem_fun (*this, &IO::meter)); + } } IO::~IO () { - LockMonitor lm (io_lock, __LINE__, __FILE__); + + Glib::Mutex::Lock guard (m_meter_signal_lock); + Glib::Mutex::Lock lm (io_lock); vector<Port *>::iterator i; for (i = _inputs.begin(); i != _inputs.end(); ++i) { @@ -142,6 +152,8 @@ IO::~IO () for (i = _outputs.begin(); i != _outputs.end(); ++i) { _session.engine().unregister_port (*i); } + + m_meter_connection.disconnect(); } void @@ -380,7 +392,7 @@ IO::deliver_output (vector<Sample *>& bufs, uint32_t nbufs, jack_nframes_t nfram gain_t pangain = _gain; { - TentativeLockMonitor dm (declick_lock, __LINE__, __FILE__); + Glib::Mutex::Lock dm (declick_lock, Glib::TRY_LOCK); if (dm.locked()) { dg = _desired_gain; @@ -427,7 +439,7 @@ IO::deliver_output_no_pan (vector<Sample *>& bufs, uint32_t nbufs, jack_nframes_ } else { - TentativeLockMonitor dm (declick_lock, __LINE__, __FILE__); + Glib::Mutex::Lock dm (declick_lock, Glib::TRY_LOCK); if (dm.locked()) { dg = _desired_gain; @@ -568,10 +580,10 @@ IO::disconnect_input (Port* our_port, string other_port, void* src) } { - LockMonitor em (_session.engine().process_lock(), __LINE__, __FILE__); + Glib::Mutex::Lock em (_session.engine().process_lock()); { - LockMonitor lm (io_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (io_lock); /* check that our_port is really one of ours */ @@ -604,10 +616,10 @@ IO::connect_input (Port* our_port, string other_port, void* src) } { - LockMonitor em(_session.engine().process_lock(), __LINE__, __FILE__); + Glib::Mutex::Lock em(_session.engine().process_lock()); { - LockMonitor lm (io_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (io_lock); /* check that our_port is really one of ours */ @@ -638,10 +650,10 @@ IO::disconnect_output (Port* our_port, string other_port, void* src) } { - LockMonitor em(_session.engine().process_lock(), __LINE__, __FILE__); + Glib::Mutex::Lock em(_session.engine().process_lock()); { - LockMonitor lm (io_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (io_lock); if (find (_outputs.begin(), _outputs.end(), our_port) == _outputs.end()) { return -1; @@ -671,10 +683,10 @@ IO::connect_output (Port* our_port, string other_port, void* src) } { - LockMonitor em(_session.engine().process_lock(), __LINE__, __FILE__); + Glib::Mutex::Lock em(_session.engine().process_lock()); { - LockMonitor lm (io_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (io_lock); /* check that our_port is really one of ours */ @@ -730,10 +742,10 @@ IO::remove_output_port (Port* port, void* src) IOChange change (NoChange); { - LockMonitor em(_session.engine().process_lock(), __LINE__, __FILE__); + Glib::Mutex::Lock em(_session.engine().process_lock()); { - LockMonitor lm (io_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (io_lock); if (_noutputs - 1 == (uint32_t) _output_minimum) { /* sorry, you can't do this */ @@ -779,10 +791,10 @@ IO::add_output_port (string destination, void* src) char buf[64]; { - LockMonitor em(_session.engine().process_lock(), __LINE__, __FILE__); + Glib::Mutex::Lock em(_session.engine().process_lock()); { - LockMonitor lm (io_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (io_lock); if (_output_maximum >= 0 && (int) _noutputs == _output_maximum) { return -1; @@ -830,10 +842,10 @@ IO::remove_input_port (Port* port, void* src) IOChange change (NoChange); { - LockMonitor em(_session.engine().process_lock(), __LINE__, __FILE__); + Glib::Mutex::Lock em(_session.engine().process_lock()); { - LockMonitor lm (io_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (io_lock); if (((int)_ninputs - 1) < _input_minimum) { /* sorry, you can't do this */ @@ -880,10 +892,10 @@ IO::add_input_port (string source, void* src) char buf[64]; { - LockMonitor em (_session.engine().process_lock(), __LINE__, __FILE__); + Glib::Mutex::Lock em (_session.engine().process_lock()); { - LockMonitor lm (io_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (io_lock); if (_input_maximum >= 0 && (int) _ninputs == _input_maximum) { return -1; @@ -931,10 +943,10 @@ int IO::disconnect_inputs (void* src) { { - LockMonitor em (_session.engine().process_lock(), __LINE__, __FILE__); + Glib::Mutex::Lock em (_session.engine().process_lock()); { - LockMonitor lm (io_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (io_lock); for (vector<Port *>::iterator i = _inputs.begin(); i != _inputs.end(); ++i) { _session.engine().disconnect (*i); @@ -951,10 +963,10 @@ int IO::disconnect_outputs (void* src) { { - LockMonitor em (_session.engine().process_lock(), __LINE__, __FILE__); + Glib::Mutex::Lock em (_session.engine().process_lock()); { - LockMonitor lm (io_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (io_lock); for (vector<Port *>::iterator i = _outputs.begin(); i != _outputs.end(); ++i) { _session.engine().disconnect (*i); @@ -1063,8 +1075,8 @@ IO::ensure_io (uint32_t nin, uint32_t nout, bool clear, void* src) } { - LockMonitor em (_session.engine().process_lock(), __LINE__, __FILE__); - LockMonitor lm (io_lock, __LINE__, __FILE__); + Glib::Mutex::Lock em (_session.engine().process_lock()); + Glib::Mutex::Lock lm (io_lock); Port* port; @@ -1212,8 +1224,8 @@ IO::ensure_inputs (uint32_t n, bool clear, bool lockit, void* src) } if (lockit) { - LockMonitor em (_session.engine().process_lock(), __LINE__, __FILE__); - LockMonitor im (io_lock, __LINE__, __FILE__); + Glib::Mutex::Lock em (_session.engine().process_lock()); + Glib::Mutex::Lock im (io_lock); changed = ensure_inputs_locked (n, clear, src); } else { changed = ensure_inputs_locked (n, clear, src); @@ -1314,8 +1326,8 @@ IO::ensure_outputs (uint32_t n, bool clear, bool lockit, void* src) /* XXX caller should hold io_lock, but generally doesn't */ if (lockit) { - LockMonitor em (_session.engine().process_lock(), __LINE__, __FILE__); - LockMonitor im (io_lock, __LINE__, __FILE__); + Glib::Mutex::Lock em (_session.engine().process_lock()); + Glib::Mutex::Lock im (io_lock); changed = ensure_outputs_locked (n, clear, src); } else { changed = ensure_outputs_locked (n, clear, src); @@ -1389,7 +1401,7 @@ IO::state (bool full_state) bool need_ins = true; bool need_outs = true; LocaleGuard lg (X_("POSIX")); - LockMonitor lm (io_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (io_lock); node->add_property("name", _name); snprintf (buf, sizeof(buf), "%" PRIu64, id()); @@ -2058,7 +2070,7 @@ IO::set_output_maximum (int n) void IO::set_port_latency (jack_nframes_t nframes) { - LockMonitor lm (io_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (io_lock); for (vector<Port *>::iterator i = _outputs.begin(); i != _outputs.end(); ++i) { (*i)->set_latency (nframes); @@ -2109,8 +2121,8 @@ IO::use_input_connection (Connection& c, void* src) uint32_t limit; { - LockMonitor lm (_session.engine().process_lock(), __LINE__, __FILE__); - LockMonitor lm2 (io_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (_session.engine().process_lock()); + Glib::Mutex::Lock lm2 (io_lock); limit = c.nports(); @@ -2187,8 +2199,8 @@ IO::use_output_connection (Connection& c, void* src) uint32_t limit; { - LockMonitor lm (_session.engine().process_lock(), __LINE__, __FILE__); - LockMonitor lm2 (io_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (_session.engine().process_lock()); + Glib::Mutex::Lock lm2 (io_lock); limit = c.nports(); @@ -2437,10 +2449,26 @@ IO::send_state_changed () return; } +/** + Update the peak meters. + + The meter signal lock is taken to prevent modification of the + Meter signal while updating the meters, taking the meter signal + lock prior to taking the io_lock ensures that all IO will remain + valid while metering. +*/ +void +IO::update_meters() +{ + Glib::Mutex::Lock guard (m_meter_signal_lock); + + Meter(); +} + void IO::meter () { - LockMonitor lm (io_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (io_lock); // READER: meter thread. uint32_t limit = max (_ninputs, _noutputs); for (uint32_t n = 0; n < limit; ++n) { @@ -2602,7 +2630,7 @@ IO::load_automation (const string& path) void IO::clear_automation () { - LockMonitor lm (automation_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (automation_lock); _gain_automation_curve.clear (); _panner->clear_automation (); } @@ -2613,7 +2641,7 @@ IO::set_gain_automation_state (AutoState state) bool changed = false; { - LockMonitor lm (automation_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (automation_lock); if (state != _gain_automation_curve.automation_state()) { changed = true; @@ -2638,7 +2666,7 @@ IO::set_gain_automation_style (AutoStyle style) bool changed = false; { - LockMonitor lm (automation_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (automation_lock); if (style != _gain_automation_curve.automation_style()) { changed = true; @@ -2666,7 +2694,7 @@ IO::set_gain (gain_t val, void *src) if (val>1.99526231f) val=1.99526231f; { - LockMonitor dm (declick_lock, __LINE__, __FILE__); + Glib::Mutex::Lock dm (declick_lock); _desired_gain = val; } diff --git a/libs/ardour/location.cc b/libs/ardour/location.cc index 87a27e5c3d..28ec42a394 100644 --- a/libs/ardour/location.cc +++ b/libs/ardour/location.cc @@ -371,7 +371,7 @@ Locations::set_current (Location *loc, bool want_lock) int ret; if (want_lock) { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); ret = set_current_unlocked (loc); } else { ret = set_current_unlocked (loc); @@ -399,7 +399,7 @@ void Locations::clear () { { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); LocationList::iterator tmp; for (LocationList::iterator i = locations.begin(); i != locations.end(); ) { tmp = i; @@ -424,7 +424,7 @@ void Locations::clear_markers () { { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); LocationList::iterator tmp; for (LocationList::iterator i = locations.begin(); i != locations.end(); ) { @@ -448,7 +448,7 @@ void Locations::clear_ranges () { { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); LocationList::iterator tmp; for (LocationList::iterator i = locations.begin(); i != locations.end(); ) { @@ -477,7 +477,7 @@ void Locations::add (Location *loc, bool make_current) { { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); locations.push_back (loc); if (make_current) { @@ -507,7 +507,7 @@ Locations::remove (Location *loc) } { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); for (i = locations.begin(); i != locations.end(); ++i) { if ((*i) == loc) { @@ -547,7 +547,7 @@ Locations::get_state () { XMLNode *node = new XMLNode ("Locations"); LocationList::iterator iter; - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); for (iter = locations.begin(); iter != locations.end(); ++iter) { node->add_child_nocopy ((*iter)->get_state ()); @@ -570,7 +570,7 @@ Locations::set_state (const XMLNode& node) nlist = node.children(); { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); for (niter = nlist.begin(); niter != nlist.end(); ++niter) { Location *loc = new Location; @@ -614,7 +614,7 @@ Locations::first_location_before (jack_nframes_t frame) LocationList locs; { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); locs = locations; } @@ -638,7 +638,7 @@ Locations::first_location_after (jack_nframes_t frame) LocationList locs; { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); locs = locations; } @@ -656,6 +656,80 @@ Locations::first_location_after (jack_nframes_t frame) return 0; } +jack_nframes_t +Locations::first_mark_before (jack_nframes_t frame) +{ + LocationList locs; + + { + Glib::Mutex::Lock lm (lock); + locs = locations; + } + + LocationStartLaterComparison cmp; + locs.sort (cmp); + + /* locs is now sorted latest..earliest */ + + for (LocationList::iterator i = locs.begin(); i != locs.end(); ++i) { + if (!(*i)->is_hidden()) { + if ((*i)->is_mark()) { + /* MARK: start == end */ + if ((*i)->start() < frame) { + return (*i)->start(); + } + } else { + /* RANGE: start != end, compare start and end */ + if ((*i)->end() < frame) { + return (*i)->end(); + } + if ((*i)->start () < frame) { + return (*i)->start(); + } + } + } + } + + return 0; +} + +jack_nframes_t +Locations::first_mark_after (jack_nframes_t frame) +{ + LocationList locs; + + { + Glib::Mutex::Lock lm (lock); + locs = locations; + } + + LocationStartEarlierComparison cmp; + locs.sort (cmp); + + /* locs is now sorted earliest..latest */ + + for (LocationList::iterator i = locs.begin(); i != locs.end(); ++i) { + if (!(*i)->is_hidden()) { + if ((*i)->is_mark()) { + /* MARK, start == end so just compare start */ + if ((*i)->start() > frame) { + return (*i)->start(); + } + } else { + /* RANGE, start != end, compare start and end */ + if ((*i)->start() > frame ) { + return (*i)->start (); + } + if ((*i)->end() > frame) { + return (*i)->end (); + } + } + } + } + + return max_frames; +} + Location* Locations::end_location () const { @@ -718,7 +792,7 @@ Change Locations::restore_state (StateManager::State& state) { { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); State* lstate = dynamic_cast<State*> (&state); locations = lstate->locations; @@ -743,7 +817,7 @@ uint32_t Locations::num_range_markers () const { uint32_t cnt = 0; - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); for (LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) { if ((*i)->is_range_marker()) { ++cnt; diff --git a/libs/ardour/panner.cc b/libs/ardour/panner.cc index 6b0013cada..bc7b472732 100644 --- a/libs/ardour/panner.cc +++ b/libs/ardour/panner.cc @@ -28,9 +28,10 @@ #include <unistd.h> #include <float.h> +#include <glibmm.h> + #include <pbd/error.h> #include <pbd/failed_constructor.h> -#include <pbd/basename.h> #include <pbd/xml++.h> #include <ardour/session.h> @@ -1369,7 +1370,7 @@ Panner::state (bool full) if (full) { if (save () == 0) { - root->add_property (X_("automation"), PBD::basename (automation_path)); + root->add_property (X_("automation"), Glib::path_get_basename (automation_path)); } } diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index 73be1da86d..1bc6ccac6d 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -225,8 +225,8 @@ Playlist::copy_regions (RegionList& newlist) const void Playlist::init (bool hide) { - atomic_set (&block_notifications, 0); - atomic_set (&ignore_state_changes, 0); + g_atomic_int_set (&block_notifications, 0); + g_atomic_int_set (&ignore_state_changes, 0); pending_modified = false; pending_length = false; _refcnt = 0; @@ -292,13 +292,13 @@ void Playlist::freeze () { delay_notifications (); - atomic_inc (&ignore_state_changes); + g_atomic_int_inc (&ignore_state_changes); } void Playlist::thaw () { - atomic_dec (&ignore_state_changes); + g_atomic_int_dec_and_test (&ignore_state_changes); release_notifications (); } @@ -306,14 +306,14 @@ Playlist::thaw () void Playlist::delay_notifications () { - atomic_inc (&block_notifications); + g_atomic_int_inc (&block_notifications); freeze_length = _get_maximum_extent(); } void Playlist::release_notifications () { - if (atomic_dec_and_test(&block_notifications)) { + if (g_atomic_int_dec_and_test (&block_notifications)) { flush_notifications (); } } diff --git a/libs/ardour/redirect.cc b/libs/ardour/redirect.cc index 403e6edddd..746d2790e2 100644 --- a/libs/ardour/redirect.cc +++ b/libs/ardour/redirect.cc @@ -126,7 +126,7 @@ Redirect::load_automation (string path) return 1; } - LockMonitor lm (_automation_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (_automation_lock); set<uint32_t> tosave; parameter_automation.clear (); @@ -159,7 +159,7 @@ Redirect::load_automation (string path) int Redirect::save_automation (string path) { - LockMonitor lm (_automation_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (_automation_lock); string fullpath; if (parameter_automation.empty()) { @@ -268,7 +268,7 @@ Redirect::state (bool full_state) void Redirect::what_has_automation (set<uint32_t>& s) const { - LockMonitor lm (_automation_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (_automation_lock); map<uint32_t,AutomationList*>::const_iterator li; for (li = parameter_automation.begin(); li != parameter_automation.end(); ++li) { @@ -279,7 +279,7 @@ Redirect::what_has_automation (set<uint32_t>& s) const void Redirect::what_has_visible_automation (set<uint32_t>& s) const { - LockMonitor lm (_automation_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (_automation_lock); set<uint32_t>::const_iterator li; for (li = visible_parameter_automation.begin(); li != visible_parameter_automation.end(); ++li) { diff --git a/libs/ardour/region.cc b/libs/ardour/region.cc index 91d5704db2..08df23146b 100644 --- a/libs/ardour/region.cc +++ b/libs/ardour/region.cc @@ -26,7 +26,7 @@ #include <sigc++/bind.h> #include <sigc++/class_slot.h> -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> #include <pbd/xml++.h> #include <ardour/region.h> @@ -178,7 +178,7 @@ Region::restore_and_return_flags (RegionState& state) Change what_changed = Change (0); { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); if (_start != state._start) { what_changed = Change (what_changed|StartChanged); @@ -947,7 +947,7 @@ Region::thaw (const string& why) Change what_changed = Change (0); { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); if (_frozen && --_frozen > 0) { return; @@ -978,7 +978,7 @@ void Region::send_change (Change what_changed) { { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); if (_frozen) { pending_changed = Change (pending_changed|what_changed); return; diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 2ce7f939b4..93fbb85e49 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -235,7 +235,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs, declick = _pending_declick; { - TentativeLockMonitor cm (control_outs_lock, __LINE__, __FILE__); + Glib::Mutex::Lock cm (control_outs_lock, Glib::TRY_LOCK); if (cm.locked()) { co = _control_outs; @@ -245,7 +245,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs, } { - TentativeLockMonitor dm (declick_lock, __LINE__, __FILE__); + Glib::Mutex::Lock dm (declick_lock, Glib::TRY_LOCK); if (dm.locked()) { dmg = desired_mute_gain; @@ -330,7 +330,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs, -------------------------------------------------------------------------------------------------- */ if (with_redirects) { - TentativeRWLockMonitor rm (redirect_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK); if (rm.locked()) { if (mute_gain > 0 || !_mute_affects_pre_fader) { for (i = _redirects.begin(); i != _redirects.end(); ++i) { @@ -499,7 +499,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs, if (post_fader_work) { - TentativeRWLockMonitor rm (redirect_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK); if (rm.locked()) { if (mute_gain > 0 || !_mute_affects_post_fader) { for (i = _redirects.begin(); i != _redirects.end(); ++i) { @@ -540,9 +540,6 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs, solo_audible = solo_gain > 0; mute_audible = dmg > 0 || !_mute_affects_control_outs; - cerr << _name << " have control outs, solo audible = " << solo_audible << " mute audible = " << mute_audible - << endl; - if ( // silent anyway (_gain == 0 && !apply_gain_automation) || @@ -726,7 +723,7 @@ Route::set_solo (bool yn, void *src) void Route::set_solo_mute (bool yn) { - LockMonitor lm (declick_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (declick_lock); /* Called by Session in response to another Route being soloed. */ @@ -760,7 +757,7 @@ Route::set_mute (bool yn, void *src) _midi_mute_control.send_feedback (_muted); } - LockMonitor lm (declick_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (declick_lock); desired_mute_gain = (yn?0.0f:1.0f); } } @@ -775,7 +772,7 @@ Route::add_redirect (Redirect *redirect, void *src, uint32_t* err_streams) } { - RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__); + Glib::RWLock::WriterLock lm (redirect_lock); PluginInsert* pi; PortInsert* porti; @@ -848,7 +845,7 @@ Route::add_redirects (const RedirectList& others, void *src, uint32_t* err_strea } { - RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__); + Glib::RWLock::WriterLock lm (redirect_lock); RedirectList::iterator existing_end = _redirects.end(); --existing_end; @@ -907,7 +904,7 @@ Route::clear_redirects (void *src) } { - RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__); + Glib::RWLock::WriterLock lm (redirect_lock); for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) { delete *i; @@ -937,7 +934,7 @@ Route::remove_redirect (Redirect *redirect, void *src, uint32_t* err_streams) redirect_max_outs = 0; { - RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__); + Glib::RWLock::WriterLock lm (redirect_lock); RedirectList::iterator i; bool removed = false; @@ -1016,7 +1013,7 @@ Route::remove_redirect (Redirect *redirect, void *src, uint32_t* err_streams) int Route::reset_plugin_counts (uint32_t* lpc) { - RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__); + Glib::RWLock::WriterLock lm (redirect_lock); return _reset_plugin_counts (lpc); } @@ -1186,7 +1183,7 @@ Route::copy_redirects (const Route& other, Placement placement, uint32_t* err_st RedirectList to_be_deleted; { - RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__); + Glib::RWLock::WriterLock lm (redirect_lock); RedirectList::iterator tmp; RedirectList the_copy; @@ -1265,7 +1262,7 @@ Route::copy_redirects (const Route& other, Placement placement, uint32_t* err_st void Route::all_redirects_flip () { - RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (redirect_lock); if (_redirects.empty()) { return; @@ -1281,7 +1278,7 @@ Route::all_redirects_flip () void Route::all_redirects_active (bool state) { - RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (redirect_lock); if (_redirects.empty()) { return; @@ -1303,7 +1300,7 @@ Route::sort_redirects (uint32_t* err_streams) { { RedirectSorter comparator; - RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__); + Glib::RWLock::WriterLock lm (redirect_lock); uint32_t old_rmo = redirect_max_outs; /* the sweet power of C++ ... */ @@ -1782,7 +1779,7 @@ Route::silence (jack_nframes_t nframes, jack_nframes_t offset) } { - TentativeRWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK); if (lm.locked()) { for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) { @@ -1807,7 +1804,7 @@ Route::silence (jack_nframes_t nframes, jack_nframes_t offset) int Route::set_control_outs (const vector<string>& ports) { - LockMonitor lm (control_outs_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (control_outs_lock); vector<string>::const_iterator i; if (_control_outs) { @@ -2010,7 +2007,7 @@ Route::transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_re jack_nframes_t now = _session.transport_frame(); { - RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (redirect_lock); if (!did_locate) { automation_snapshot (now); @@ -2129,7 +2126,7 @@ Route::roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t bool can_record, bool rec_monitors_input) { { - TentativeRWLockMonitor lm(redirect_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK); if (lm.locked()) { // automation snapshot can also be called from the non-rt context // and it uses the redirect list, so we take the lock out here @@ -2153,7 +2150,7 @@ Route::roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t apply_gain_automation = false; { - TentativeLockMonitor am (automation_lock, __LINE__, __FILE__); + Glib::Mutex::Lock am (automation_lock, Glib::TRY_LOCK); if (am.locked() && _session.transport_rolling()) { @@ -2245,7 +2242,7 @@ Route::send_all_midi_feedback () if (_session.get_midi_feedback()) { { - RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (redirect_lock); for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) { (*i)->send_all_midi_feedback (); } @@ -2265,7 +2262,7 @@ Route::write_midi_feedback (MIDI::byte* buf, int32_t& bufsize) buf = _midi_mute_control.write_feedback (buf, bufsize, _muted); { - RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (redirect_lock); for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) { buf = (*i)->write_midi_feedback (buf, bufsize); } @@ -2281,7 +2278,7 @@ Route::flush_redirects () this is called from the RT audio thread. */ - RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (redirect_lock); for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) { (*i)->deactivate (); diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 569060fe65..6c1dec8e81 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -32,12 +32,13 @@ #include <sigc++/bind.h> #include <sigc++/retype.h> +#include <glibmm.h> + #include <pbd/error.h> -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> #include <pbd/pathscanner.h> #include <pbd/stl_delete.h> #include <pbd/basename.h> -#include <pbd/dirname.h> #include <ardour/audioengine.h> #include <ardour/configuration.h> @@ -64,7 +65,10 @@ #include <ardour/crossfade.h> #include <ardour/playlist.h> #include <ardour/click.h> + +#ifdef HAVE_LIBLO #include <ardour/osc.h> +#endif #include "i18n.h" @@ -551,7 +555,7 @@ Session::set_worst_io_latencies (bool take_lock) } if (take_lock) { - route_lock.read_lock (); + route_lock.reader_lock (); } for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) { @@ -560,7 +564,7 @@ Session::set_worst_io_latencies (bool take_lock) } if (take_lock) { - route_lock.unlock (); + route_lock.reader_unlock (); } } @@ -795,9 +799,11 @@ Session::when_engine_running () _engine.set_session (this); +#ifdef HAVE_LIBLO /* and to OSC */ osc->set_session (*this); +#endif _state_of_the_state = Clean; @@ -955,7 +961,7 @@ Session::set_auto_input (bool yn) a non-tentative rwlock here, because the action must occur. The rarity and short potential lock duration makes this "OK" */ - RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock dsm (diskstream_lock); for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->record_enabled ()) { //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl; @@ -973,7 +979,7 @@ void Session::reset_input_monitor_state () { if (transport_rolling()) { - RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock dsm (diskstream_lock); for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->record_enabled ()) { //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl; @@ -981,7 +987,7 @@ Session::reset_input_monitor_state () } } } else { - RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock dsm (diskstream_lock); for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->record_enabled ()) { //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl; @@ -1248,10 +1254,9 @@ void Session::enable_record () { /* XXX really atomic compare+swap here */ - if (atomic_read (&_record_status) != Recording) { - atomic_set (&_record_status, Recording); + if (g_atomic_int_get (&_record_status) != Recording) { + g_atomic_int_set (&_record_status, Recording); _last_record_location = _transport_frame; - // FIXME //send_mmc_in_another_thread (MIDI::MachineControl::cmdRecordStrobe); if (Config->get_use_hardware_monitoring() && auto_input) { @@ -1259,7 +1264,7 @@ Session::enable_record () a non-tentative rwlock here, because the action must occur. The rarity and short potential lock duration makes this "OK" */ - RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock dsm (diskstream_lock); for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->record_enabled ()) { @@ -1277,17 +1282,16 @@ Session::disable_record (bool rt_context, bool force) { RecordState rs; - if ((rs = (RecordState) atomic_read (&_record_status)) != Disabled) { + if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) { if (!Config->get_latched_record_enable () || force) { - atomic_set (&_record_status, Disabled); + g_atomic_int_set (&_record_status, Disabled); } else { if (rs == Recording) { - atomic_set (&_record_status, Enabled); + g_atomic_int_set (&_record_status, Enabled); } } - // FIXME //send_mmc_in_another_thread (MIDI::MachineControl::cmdRecordExit); if (Config->get_use_hardware_monitoring() && auto_input) { @@ -1295,7 +1299,7 @@ Session::disable_record (bool rt_context, bool force) a non-tentative rwlock here, because the action must occur. The rarity and short potential lock duration makes this "OK" */ - RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock dsm (diskstream_lock); for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->record_enabled ()) { @@ -1315,14 +1319,14 @@ Session::disable_record (bool rt_context, bool force) void Session::step_back_from_record () { - atomic_set (&_record_status, Enabled); + g_atomic_int_set (&_record_status, Enabled); if (Config->get_use_hardware_monitoring()) { /* Even though this can be called from RT context we are using a non-tentative rwlock here, because the action must occur. The rarity and short potential lock duration makes this "OK" */ - RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock dsm (diskstream_lock); for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if (auto_input && (*i)->record_enabled ()) { @@ -1336,7 +1340,7 @@ Session::step_back_from_record () void Session::maybe_enable_record () { - atomic_set (&_record_status, Enabled); + g_atomic_int_set (&_record_status, Enabled); /* XXX this save should really happen in another thread. its needed so that pending capture state can be recovered if we crash. @@ -1445,8 +1449,8 @@ Session::set_block_size (jack_nframes_t nframes) */ { - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); - RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (route_lock); + Glib::RWLock::ReaderLock dsm (diskstream_lock); vector<Sample*>::iterator i; uint32_t np; @@ -1523,7 +1527,7 @@ Session::set_default_fade (float steepness, float fade_msecs) { // jlc, WTF is this! - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (route_lock); AudioRegion::set_default_fade (steepness, fade_frames); } @@ -1674,7 +1678,7 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod /* count existing audio tracks */ { - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (route_lock); for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) { if (dynamic_cast<AudioTrack*>(*i) != 0) { if (!(*i)->hidden()) { @@ -1790,7 +1794,7 @@ Session::new_audio_route (int input_channels, int output_channels) /* count existing audio busses */ { - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (route_lock); for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) { if (dynamic_cast<AudioTrack*>(*i) == 0) { if (!(*i)->hidden()) { @@ -1873,7 +1877,7 @@ void Session::add_route (Route* route) { { - RWLockMonitor lm (route_lock, true, __LINE__, __FILE__); + Glib::RWLock::WriterLock lm (route_lock); routes.push_front (route); resort_routes(0); } @@ -1904,7 +1908,7 @@ Session::add_diskstream (DiskStream* dstream) dstream->do_refill(0, 0, 0); { - RWLockMonitor lm (diskstream_lock, true, __LINE__, __FILE__); + Glib::RWLock::WriterLock lm (diskstream_lock); diskstreams.push_back (dstream); } @@ -1932,7 +1936,7 @@ void Session::remove_route (Route& route) { { - RWLockMonitor lm (route_lock, true, __LINE__, __FILE__); + Glib::RWLock::WriterLock lm (route_lock); routes.remove (&route); /* deleting the master out seems like a dumb @@ -1960,7 +1964,7 @@ Session::remove_route (Route& route) } { - RWLockMonitor lm (diskstream_lock, true, __LINE__, __FILE__); + Glib::RWLock::WriterLock lm (diskstream_lock); AudioTrack* at; @@ -1996,7 +2000,7 @@ Session::route_solo_changed (void* src, Route* route) return; } - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (route_lock); bool is_track; is_track = (dynamic_cast<AudioTrack*>(route) != 0); @@ -2195,14 +2199,14 @@ Session::catch_up_on_solo () basis, but needs the global overview that only the session has. */ - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (route_lock); update_route_solo_state(); } Route * Session::route_by_name (string name) { - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (route_lock); for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) { if ((*i)->name() == name) { @@ -2216,7 +2220,7 @@ Session::route_by_name (string name) Route * Session::route_by_remote_id (uint32_t id) { - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (route_lock); for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) { if ((*i)->remote_control_id() == id) { @@ -2266,7 +2270,7 @@ Session::get_maximum_extent () const DiskStream * Session::diskstream_by_name (string name) { - RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (diskstream_lock); for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->name() == name) { @@ -2280,7 +2284,7 @@ Session::diskstream_by_name (string name) DiskStream * Session::diskstream_by_id (id_t id) { - RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (diskstream_lock); for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->id() == id) { @@ -2352,7 +2356,7 @@ Session::region_name (string& result, string base, bool newlevel) const if (base == "") { - LockMonitor lm (region_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (region_lock); snprintf (buf, sizeof (buf), "%d", (int)audio_regions.size() + 1); @@ -2380,7 +2384,7 @@ Session::region_name (string& result, string base, bool newlevel) const bool name_taken = true; { - LockMonitor lm (region_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (region_lock); for (int n = 1; n < 5000; ++n) { @@ -2419,7 +2423,7 @@ Session::add_region (Region* region) bool added = false; { - LockMonitor lm (region_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (region_lock); if ((ar = dynamic_cast<AudioRegion*> (region)) != 0) { @@ -2496,7 +2500,7 @@ Session::remove_region (Region* region) bool removed = false; { - LockMonitor lm (region_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (region_lock); if ((ar = dynamic_cast<AudioRegion*> (region)) != 0) { if ((i = audio_regions.find (region->id())) != audio_regions.end()) { @@ -2527,7 +2531,7 @@ Session::find_whole_file_parent (AudioRegion& child) { AudioRegionList::iterator i; AudioRegion* region; - LockMonitor lm (region_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (region_lock); for (i = audio_regions.begin(); i != audio_regions.end(); ++i) { @@ -2603,7 +2607,7 @@ Session::remove_last_capture () { list<Region*> r; - RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (diskstream_lock); for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { list<Region*>& l = (*i)->last_capture_regions(); @@ -2633,7 +2637,7 @@ Session::add_source (Source* source) pair<SourceList::key_type, SourceList::mapped_type> entry; { - LockMonitor lm (source_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (source_lock); entry.first = source->id(); entry.second = source; sources.insert (entry); @@ -2651,7 +2655,7 @@ Session::remove_source (Source* source) SourceList::iterator i; { - LockMonitor lm (source_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (source_lock); if ((i = sources.find (source->id())) != sources.end()) { sources.erase (i); @@ -2673,7 +2677,7 @@ Session::remove_source (Source* source) Source * Session::get_source (ARDOUR::id_t id) { - LockMonitor lm (source_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (source_lock); SourceList::iterator i; Source* source = 0; @@ -2691,8 +2695,8 @@ Session::peak_path_from_audio_path (string audio_path) string res; - res = PBD::dirname (audio_path); - res = PBD::dirname (res); + res = Glib::path_get_dirname (audio_path); + res = Glib::path_get_dirname (res); res += '/'; res += peak_dir_name; res += '/'; @@ -2706,7 +2710,7 @@ string Session::change_audio_path_by_name (string path, string oldname, string newname, bool destructive) { string look_for; - string old_basename = basename_nosuffix (oldname); + string old_basename = PBD::basename_nosuffix (oldname); string new_legalized = legalize_for_path (newname); /* note: we know (or assume) the old path is already valid */ @@ -2919,7 +2923,7 @@ Session::get_playlist (string name) Playlist * Session::playlist_by_name (string name) { - LockMonitor lm (playlist_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (playlist_lock); for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) { if ((*i)->name() == name) { return* i; @@ -2941,7 +2945,7 @@ Session::add_playlist (Playlist* playlist) } { - LockMonitor lm (playlist_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (playlist_lock); if (find (playlists.begin(), playlists.end(), playlist) == playlists.end()) { playlists.insert (playlists.begin(), playlist); // playlist->ref(); @@ -2961,7 +2965,7 @@ Session::track_playlist (Playlist* pl, bool inuse) PlaylistList::iterator x; { - LockMonitor lm (playlist_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (playlist_lock); if (!inuse) { //cerr << "shifting playlist to unused: " << pl->name() << endl; @@ -2993,7 +2997,7 @@ Session::remove_playlist (Playlist* playlist) } { - LockMonitor lm (playlist_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (playlist_lock); // cerr << "removing playlist: " << playlist->name() << endl; PlaylistList::iterator i; @@ -3109,7 +3113,7 @@ void Session::set_all_solo (bool yn) { { - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (route_lock); for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) { if (!(*i)->hidden()) { @@ -3125,7 +3129,7 @@ void Session::set_all_mute (bool yn) { { - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (route_lock); for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) { if (!(*i)->hidden()) { @@ -3140,7 +3144,7 @@ Session::set_all_mute (bool yn) uint32_t Session::n_diskstreams () const { - RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (diskstream_lock); uint32_t n = 0; for (DiskStreamList::const_iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { @@ -3154,7 +3158,7 @@ Session::n_diskstreams () const void Session::foreach_diskstream (void (DiskStream::*func)(void)) { - RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (diskstream_lock); for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if (!(*i)->hidden()) { ((*i)->*func)(); @@ -3172,9 +3176,9 @@ Session::graph_reordered () if (_state_of_the_state & InitialConnecting) { return; } - - RWLockMonitor lm1 (route_lock, true, __LINE__, __FILE__); - RWLockMonitor lm2 (diskstream_lock, false, __LINE__, __FILE__); + + Glib::RWLock::WriterLock lm1 (route_lock); + Glib::RWLock::ReaderLock lm2 (diskstream_lock); resort_routes (0); @@ -3202,7 +3206,7 @@ Session::record_enable_all () void Session::record_enable_change_all (bool yn) { - RWLockMonitor lm1 (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm1 (route_lock); for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) { AudioTrack* at; @@ -3287,7 +3291,7 @@ void Session::add_connection (ARDOUR::Connection* connection) { { - LockMonitor (connection_lock, __LINE__, __FILE__); + Glib::Mutex::Lock guard (connection_lock); _connections.push_back (connection); } @@ -3302,7 +3306,7 @@ Session::remove_connection (ARDOUR::Connection* connection) bool removed = false; { - LockMonitor (connection_lock, __LINE__, __FILE__); + Glib::Mutex::Lock guard (connection_lock); ConnectionList::iterator i = find (_connections.begin(), _connections.end(), connection); if (i != _connections.end()) { @@ -3321,7 +3325,7 @@ Session::remove_connection (ARDOUR::Connection* connection) ARDOUR::Connection * Session::connection_by_name (string name) const { - LockMonitor lm (connection_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (connection_lock); for (ConnectionList::const_iterator i = _connections.begin(); i != _connections.end(); ++i) { if ((*i)->name() == name) { @@ -3338,7 +3342,7 @@ Session::set_edit_mode (EditMode mode) _edit_mode = mode; { - LockMonitor lm (playlist_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (playlist_lock); for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) { (*i)->set_edit_mode (mode); @@ -3413,7 +3417,7 @@ Session::next_insert_name () NamedSelection * Session::named_selection_by_name (string name) { - LockMonitor lm (named_selection_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (named_selection_lock); for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) { if ((*i)->name == name) { return* i; @@ -3426,7 +3430,7 @@ void Session::add_named_selection (NamedSelection* named_selection) { { - LockMonitor lm (named_selection_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (named_selection_lock); named_selections.insert (named_selections.begin(), named_selection); } @@ -3441,7 +3445,7 @@ Session::remove_named_selection (NamedSelection* named_selection) bool removed = false; { - LockMonitor lm (named_selection_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (named_selection_lock); NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection); @@ -3463,7 +3467,7 @@ Session::reset_native_file_format () { // jlc - WHY take routelock? //RWLockMonitor lm1 (route_lock, true, __LINE__, __FILE__); - RWLockMonitor lm2 (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm2 (diskstream_lock); for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { (*i)->reset_write_sources (false); @@ -3473,7 +3477,7 @@ Session::reset_native_file_format () bool Session::route_name_unique (string n) const { - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (route_lock); for (RouteList::const_iterator i = routes.begin(); i != routes.end(); ++i) { if ((*i)->name() == n) { @@ -3493,7 +3497,7 @@ Session::remove_file_source (FileSource& fs) uint32_t Session::n_playlists () const { - LockMonitor lm (playlist_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (playlist_lock); return playlists.size(); } @@ -3542,7 +3546,7 @@ Session::add_instant_xml (XMLNode& node, const std::string& dir) int Session::freeze (InterThreadInfo& itt) { - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (route_lock); for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) { @@ -3577,7 +3581,7 @@ Session::write_one_track (AudioTrack& track, jack_nframes_t start, jack_nframes_ char * workbuf = 0; const jack_nframes_t chunk_size = (256 * 1024)/4; - atomic_set (&processing_prohibited, 1); + g_atomic_int_set (&processing_prohibited, 1); /* call tree *MUST* hold route_lock */ @@ -3698,7 +3702,7 @@ Session::write_one_track (AudioTrack& track, jack_nframes_t start, jack_nframes_ delete [] workbuf; } - atomic_set (&processing_prohibited, 0); + g_atomic_int_set (&processing_prohibited, 0); itt.done = true; @@ -3718,7 +3722,7 @@ uint32_t Session::ntracks () const { uint32_t n = 0; - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (route_lock); for (RouteList::const_iterator i = routes.begin(); i != routes.end(); ++i) { if (dynamic_cast<AudioTrack*> (*i)) { @@ -3733,7 +3737,7 @@ uint32_t Session::nbusses () const { uint32_t n = 0; - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (route_lock); for (RouteList::const_iterator i = routes.begin(); i != routes.end(); ++i) { if (dynamic_cast<AudioTrack*> (*i) == 0) { diff --git a/libs/ardour/session_butler.cc b/libs/ardour/session_butler.cc index dafc28385b..ebe0d64548 100644 --- a/libs/ardour/session_butler.cc +++ b/libs/ardour/session_butler.cc @@ -26,8 +26,9 @@ #include <fcntl.h> #include <poll.h> +#include <glibmm/thread.h> + #include <pbd/error.h> -#include <pbd/lockmonitor.h> #include <pbd/pthread_utils.h> #include <ardour/configuration.h> @@ -73,8 +74,6 @@ Session::start_butler_thread () Crossfade::set_buffer_size (dstream_buffer_size); - pthread_cond_init (&butler_paused, 0); - butler_should_run = false; if (pipe (butler_request_pipe)) { @@ -114,7 +113,7 @@ Session::terminate_butler_thread () void Session::schedule_butler_transport_work () { - atomic_inc (&butler_should_do_transport_work); + g_atomic_int_inc (&butler_should_do_transport_work); summon_butler (); } @@ -135,19 +134,19 @@ Session::summon_butler () void Session::stop_butler () { - LockMonitor lm (butler_request_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (butler_request_lock); char c = ButlerRequest::Pause; ::write (butler_request_pipe[1], &c, 1); - pthread_cond_wait (&butler_paused, butler_request_lock.mutex()); + butler_paused.wait(butler_request_lock); } void Session::wait_till_butler_finished () { - LockMonitor lm (butler_request_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (butler_request_lock); char c = ButlerRequest::Wake; ::write (butler_request_pipe[1], &c, 1); - pthread_cond_wait (&butler_paused, butler_request_lock.mutex()); + butler_paused.wait(butler_request_lock); } void * @@ -158,7 +157,7 @@ Session::_butler_thread_work (void* arg) return 0; } -#define transport_work_requested() atomic_read(&butler_should_do_transport_work) +#define transport_work_requested() g_atomic_int_get(&butler_should_do_transport_work) void * Session::butler_thread_work () @@ -256,7 +255,7 @@ Session::butler_thread_work () gettimeofday (&begin, 0); - RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock dsm (diskstream_lock); for (i = diskstreams.begin(); !transport_work_requested() && butler_should_run && i != diskstreams.end(); ++i) { @@ -355,7 +354,7 @@ Session::butler_thread_work () { - LockMonitor lm (butler_request_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (butler_request_lock); if (butler_should_run && (disk_work_outstanding || transport_work_requested())) { // for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { @@ -365,7 +364,7 @@ Session::butler_thread_work () continue; } - pthread_cond_signal (&butler_paused); + butler_paused.signal(); } } @@ -398,7 +397,7 @@ Session::overwrite_some_buffers (DiskStream* ds) } else { - RWLockMonitor dm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock dm (diskstream_lock); for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { (*i)->set_pending_overwrite (true); } @@ -429,36 +428,36 @@ Session::write_data_rate () const uint32_t Session::playback_load () { - return (uint32_t) atomic_read (&_playback_load); + return (uint32_t) g_atomic_int_get (&_playback_load); } uint32_t Session::capture_load () { - return (uint32_t) atomic_read (&_capture_load); + return (uint32_t) g_atomic_int_get (&_capture_load); } uint32_t Session::playback_load_min () { - return (uint32_t) atomic_read (&_playback_load_min); + return (uint32_t) g_atomic_int_get (&_playback_load_min); } uint32_t Session::capture_load_min () { - return (uint32_t) atomic_read (&_capture_load_min); + return (uint32_t) g_atomic_int_get (&_capture_load_min); } void Session::reset_capture_load_min () { - atomic_set (&_capture_load_min, 100); + g_atomic_int_set (&_capture_load_min, 100); } void Session::reset_playback_load_min () { - atomic_set (&_playback_load_min, 100); + g_atomic_int_set (&_playback_load_min, 100); } diff --git a/libs/ardour/session_click.cc b/libs/ardour/session_click.cc index c9777500a2..4503287da1 100644 --- a/libs/ardour/session_click.cc +++ b/libs/ardour/session_click.cc @@ -47,7 +47,7 @@ Session::click (jack_nframes_t start, jack_nframes_t nframes, jack_nframes_t off return; } - TentativeRWLockMonitor clickm (click_lock, true, __LINE__, __FILE__); + Glib::RWLock::WriterLock clickm (click_lock, Glib::TRY_LOCK); if (!clickm.locked() || _transport_speed != 1.0 || !_clicking || click_data == 0) { _click_io->silence (nframes, offset); @@ -209,7 +209,7 @@ Session::setup_click_sounds (int which) void Session::clear_clicks () { - RWLockMonitor lm (click_lock, true, __LINE__, __FILE__); + Glib::RWLock::WriterLock lm (click_lock); for (Clicks::iterator i = clicks.begin(); i != clicks.end(); ++i) { delete *i; diff --git a/libs/ardour/session_events.cc b/libs/ardour/session_events.cc index 7e0b6fbef5..c9b4339686 100644 --- a/libs/ardour/session_events.cc +++ b/libs/ardour/session_events.cc @@ -24,7 +24,7 @@ #include <ardour/timestamps.h> #include <pbd/error.h> -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> #include <ardour/ardour.h> #include <ardour/session.h> diff --git a/libs/ardour/session_export.cc b/libs/ardour/session_export.cc index 677b2c1258..183b6df237 100644 --- a/libs/ardour/session_export.cc +++ b/libs/ardour/session_export.cc @@ -37,7 +37,7 @@ #include <sigc++/bind.h> #include <pbd/error.h> -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> #include <ardour/gdither.h> #include <ardour/timestamps.h> @@ -485,7 +485,7 @@ Session::prepare_to_export (AudioExportSpecification& spec) /* take everyone out of awrite to avoid disasters */ { - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (route_lock); for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) { (*i)->protect_automation (); } @@ -494,7 +494,7 @@ Session::prepare_to_export (AudioExportSpecification& spec) /* get everyone to the right position */ { - RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (diskstream_lock); for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)-> seek (spec.start_frame, true)) { error << string_compose (_("%1: cannot seek to %2 for export"), @@ -524,7 +524,7 @@ Session::prepare_to_export (AudioExportSpecification& spec) set_transport_speed (1.0, false); butler_transport_work (); - atomic_set (&butler_should_do_transport_work, 0); + g_atomic_int_set (&butler_should_do_transport_work, 0); post_transport (); /* we are ready to go ... */ diff --git a/libs/ardour/session_feedback.cc b/libs/ardour/session_feedback.cc index 600567892e..ea8580b3c2 100644 --- a/libs/ardour/session_feedback.cc +++ b/libs/ardour/session_feedback.cc @@ -28,8 +28,10 @@ #include <midi++/types.h> #include <midi++/port.h> #include <midi++/manager.h> + +#include <glibmm/thread.h> + #include <pbd/error.h> -#include <pbd/lockmonitor.h> #include <pbd/pthread_utils.h> #include <ardour/configuration.h> diff --git a/libs/ardour/session_midi.cc b/libs/ardour/session_midi.cc index 91428a8ce4..9b6f0bf6ba 100644 --- a/libs/ardour/session_midi.cc +++ b/libs/ardour/session_midi.cc @@ -31,7 +31,7 @@ #include <midi++/port.h> #include <midi++/manager.h> #include <pbd/error.h> -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> #include <pbd/pthread_utils.h> #include <ardour/configuration.h> @@ -114,7 +114,7 @@ Session::set_midi_control (bool yn) poke_midi_thread (); if (_midi_port) { - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock guard (route_lock); for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) { (*i)->reset_midi_control (_midi_port, midi_control); } @@ -607,7 +607,7 @@ Session::mmc_record_strobe (MIDI::MachineControl &mmc) */ save_state ("", true); - atomic_set (&_record_status, Enabled); + g_atomic_int_set (&_record_status, Enabled); RecordStateChanged (); /* EMIT SIGNAL */ request_transport_speed (1.0); @@ -789,7 +789,7 @@ Session::mmc_record_enable (MIDI::MachineControl &mmc, size_t trk, bool enabled) if (mmc_control) { RouteList::iterator i; - RWLockMonitor (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock guard (route_lock); for (i = routes.begin(); i != routes.end(); ++i) { AudioTrack *at; @@ -1073,8 +1073,8 @@ Session::deliver_mmc (MIDI::MachineControl::Command cmd, jack_nframes_t where) mmc_buffer[nbytes++] = 0xf7; // terminate SysEx/MMC message - LockMonitor lm (midi_lock, __LINE__, __FILE__); - + Glib::Mutex::Lock lm (midi_lock); + if (_mmc_port->write (mmc_buffer, nbytes) != nbytes) { error << string_compose(_("MMC: cannot send command %1%2%3"), &hex, cmd, &dec) << endmsg; } diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc index ba66d3ea2d..411c749ade 100644 --- a/libs/ardour/session_process.cc +++ b/libs/ardour/session_process.cc @@ -23,14 +23,13 @@ #include <algorithm> #include <unistd.h> -#include <ardour/timestamps.h> - #include <pbd/error.h> -#include <pbd/atomic.h> -#include <pbd/lockmonitor.h> + +#include <glibmm/thread.h> #include <ardour/ardour.h> #include <ardour/session.h> +#include <ardour/timestamps.h> #include <ardour/diskstream.h> #include <ardour/audioengine.h> #include <ardour/slave.h> @@ -60,7 +59,7 @@ Session::process (jack_nframes_t nframes) } if (non_realtime_work_pending()) { - if (atomic_read (&butler_should_do_transport_work) == 0) { + if (g_atomic_int_get (&butler_should_do_transport_work) == 0) { post_transport (); } } @@ -95,7 +94,7 @@ Session::no_roll (jack_nframes_t nframes, jack_nframes_t offset) this is really bad ... */ - if (atomic_read (&processing_prohibited)) { + if (g_atomic_int_get (&processing_prohibited)) { for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) { (*i)->silence (nframes, offset); } @@ -232,15 +231,15 @@ Session::commit_diskstreams (jack_nframes_t nframes, bool &needs_butler) cworst = min (cworst, (*i)->capture_buffer_load()); } - uint32_t pmin = atomic_read (&_playback_load); - uint32_t pminold = atomic_read (&_playback_load_min); - uint32_t cmin = atomic_read (&_capture_load); - uint32_t cminold = atomic_read (&_capture_load_min); + uint32_t pmin = g_atomic_int_get (&_playback_load); + uint32_t pminold = g_atomic_int_get (&_playback_load_min); + uint32_t cmin = g_atomic_int_get (&_capture_load); + uint32_t cminold = g_atomic_int_get (&_capture_load_min); - atomic_set (&_playback_load, (uint32_t) floor (pworst * 100.0f)); - atomic_set (&_capture_load, (uint32_t) floor (cworst * 100.0f)); - atomic_set (&_playback_load_min, min (pmin, pminold)); - atomic_set (&_capture_load_min, min (cmin, cminold)); + g_atomic_int_set (&_playback_load, (uint32_t) floor (pworst * 100.0f)); + g_atomic_int_set (&_capture_load, (uint32_t) floor (cworst * 100.0f)); + g_atomic_int_set (&_playback_load_min, min (pmin, pminold)); + g_atomic_int_set (&_capture_load_min, min (cmin, cminold)); if (actively_recording()) { set_dirty(); @@ -299,9 +298,9 @@ Session::process_with_events (jack_nframes_t nframes) end_frame = _transport_frame + nframes; { - TentativeRWLockMonitor rm (route_lock, false, __LINE__, __FILE__); - TentativeRWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__); - + Glib::RWLock::ReaderLock rm (route_lock, Glib::TRY_LOCK); + Glib::RWLock::ReaderLock dsm (diskstream_lock, Glib::TRY_LOCK); + Event* this_event; Events::iterator the_next_one; @@ -570,8 +569,8 @@ Session::follow_slave (jack_nframes_t nframes, jack_nframes_t offset) if (slave_state == Waiting) { // cerr << "waiting at " << slave_transport_frame << endl; - TentativeRWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__); - + Glib::RWLock::ReaderLock dsm (diskstream_lock, Glib::TRY_LOCK); + if (dsm.locked() && slave_transport_frame >= slave_wait_end) { // cerr << "\tstart at " << _transport_frame << endl; @@ -692,7 +691,7 @@ Session::follow_slave (jack_nframes_t nframes, jack_nframes_t offset) bool need_butler; - TentativeRWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock dsm (diskstream_lock, Glib::TRY_LOCK); if (!dsm.locked()) { goto noroll; } @@ -743,8 +742,8 @@ Session::process_without_events (jack_nframes_t nframes) long frames_moved; { - TentativeRWLockMonitor rm (route_lock, false, __LINE__, __FILE__); - TentativeRWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock rm (route_lock, Glib::TRY_LOCK); + Glib::RWLock::ReaderLock dsm (diskstream_lock, Glib::TRY_LOCK); if (!rm.locked() || !dsm.locked() || (post_transport_work & (PostTransportLocate|PostTransportStop))) { no_roll (nframes, 0); @@ -810,7 +809,7 @@ Session::process_without_events (jack_nframes_t nframes) void Session::process_audition (jack_nframes_t nframes) { - TentativeRWLockMonitor rm (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock rm (route_lock, Glib::TRY_LOCK); Event* ev; if (rm.locked()) { diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 602ac94314..466a546aee 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -44,14 +44,15 @@ #include <sys/param.h> #endif +#include <glibmm.h> + #include <midi++/mmc.h> #include <midi++/port.h> #include <pbd/error.h> -#include <pbd/dirname.h> -#include <pbd/lockmonitor.h> + +#include <glibmm/thread.h> #include <pbd/pathscanner.h> #include <pbd/pthread_utils.h> -#include <pbd/basename.h> #include <pbd/strsplit.h> #include <ardour/audioengine.h> @@ -118,7 +119,7 @@ Session::first_stage_init (string fullpath, string snapshot_name) _tempo_map = new TempoMap (_current_frame_rate); _tempo_map->StateChanged.connect (mem_fun (*this, &Session::tempo_map_changed)); - atomic_set (&processing_prohibited, 0); + g_atomic_int_set (&processing_prohibited, 0); send_cnt = 0; insert_cnt = 0; _transport_speed = 0; @@ -129,7 +130,7 @@ Session::first_stage_init (string fullpath, string snapshot_name) end_location = new Location (0, 0, _("end"), Location::Flags ((Location::IsMark|Location::IsEnd))); start_location = new Location (0, 0, _("start"), Location::Flags ((Location::IsMark|Location::IsStart))); _end_location_is_free = true; - atomic_set (&_record_status, Disabled); + g_atomic_int_set (&_record_status, Disabled); auto_play = false; punch_in = false; punch_out = false; @@ -150,7 +151,7 @@ Session::first_stage_init (string fullpath, string snapshot_name) state_was_pending = false; set_next_event (); outbound_mtc_smpte_frame = 0; - next_quarter_frame_to_send = 0; + next_quarter_frame_to_send = -1; current_block_size = 0; _solo_latched = true; _solo_model = InverseMute; @@ -170,12 +171,12 @@ Session::first_stage_init (string fullpath, string snapshot_name) midi_control = true; mmc = 0; post_transport_work = PostTransportWork (0); - atomic_set (&butler_should_do_transport_work, 0); - atomic_set (&butler_active, 0); - atomic_set (&_playback_load, 100); - atomic_set (&_capture_load, 100); - atomic_set (&_playback_load_min, 100); - atomic_set (&_capture_load_min, 100); + g_atomic_int_set (&butler_should_do_transport_work, 0); + g_atomic_int_set (&butler_active, 0); + g_atomic_int_set (&_playback_load, 100); + g_atomic_int_set (&_capture_load, 100); + g_atomic_int_set (&_playback_load_min, 100); + g_atomic_int_set (&_capture_load_min, 100); pending_audition_region = 0; _edit_mode = Slide; pending_edit_mode = _edit_mode; @@ -297,11 +298,9 @@ Session::second_stage_init (bool new_session) return -1; } - /* FIXME - if (start_midi_thread ()) { + /*if (start_midi_thread ()) { return -1; - } - */ + }*/ if (state_tree) { if (set_state (*state_tree->root())) { @@ -338,11 +337,10 @@ Session::second_stage_init (bool new_session) first_time_running = _engine.Running.connect (mem_fun (*this, &Session::when_engine_running)); } - // FIXME //send_full_time_code (); _engine.transport_locate (0); - //deliver_mmc (MIDI::MachineControl::cmdMmcReset, 0); - //deliver_mmc (MIDI::MachineControl::cmdLocate, 0); + deliver_mmc (MIDI::MachineControl::cmdMmcReset, 0); + deliver_mmc (MIDI::MachineControl::cmdLocate, 0); ControlProtocolManager::instance().set_session (*this); @@ -1337,7 +1335,7 @@ Session::state(bool full_state) child = node->add_child ("Sources"); if (full_state) { - LockMonitor sl (source_lock, __LINE__, __FILE__); + Glib::Mutex::Lock sl (source_lock); for (SourceList::iterator siter = sources.begin(); siter != sources.end(); ++siter) { @@ -1366,7 +1364,7 @@ Session::state(bool full_state) child = node->add_child ("Regions"); if (full_state) { - LockMonitor rl (region_lock, __LINE__, __FILE__); + Glib::Mutex::Lock rl (region_lock); for (AudioRegionList::const_iterator i = audio_regions.begin(); i != audio_regions.end(); ++i) { @@ -1381,7 +1379,7 @@ Session::state(bool full_state) child = node->add_child ("DiskStreams"); { - RWLockMonitor dl (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock dl (diskstream_lock); for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if (!(*i)->hidden()) { child->add_child_nocopy ((*i)->get_state()); @@ -1393,7 +1391,7 @@ Session::state(bool full_state) child = node->add_child ("Connections"); { - LockMonitor lm (connection_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (connection_lock); for (ConnectionList::iterator i = _connections.begin(); i != _connections.end(); ++i) { if (!(*i)->system_dependent()) { child->add_child_nocopy ((*i)->get_state()); @@ -1403,7 +1401,7 @@ Session::state(bool full_state) child = node->add_child ("Routes"); { - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (route_lock); RoutePublicOrderSorter cmp; RouteList public_order(routes); @@ -1806,7 +1804,7 @@ Session::get_sources_as_xml () { XMLNode* node = new XMLNode (X_("Sources")); - LockMonitor lm (source_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (source_lock); for (SourceList::iterator i = sources.begin(); i != sources.end(); ++i) { node->add_child_nocopy ((*i).second->get_state()); @@ -1961,7 +1959,7 @@ Session::refresh_disk_space () #if HAVE_SYS_VFS_H struct statfs statfsbuf; vector<space_and_path>::iterator i; - LockMonitor lm (space_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (space_lock); double scale; /* get freespace on every FS that is part of the session path */ @@ -2402,7 +2400,7 @@ Session::load_route_groups (const XMLNode& node, bool edit) void Session::swap_configuration(Configuration** new_config) { - RWLockMonitor lm (route_lock, true, __LINE__, __FILE__); // jlc - WHY? + Glib::RWLock::WriterLock lm (route_lock); // jlc - WHY? Configuration* tmp = *new_config; *new_config = Config; Config = tmp; @@ -2412,7 +2410,7 @@ Session::swap_configuration(Configuration** new_config) void Session::copy_configuration(Configuration* new_config) { - RWLockMonitor lm (route_lock, true, __LINE__, __FILE__); + Glib::RWLock::WriterLock lm (route_lock); new_config = new Configuration(*Config); } @@ -2591,7 +2589,7 @@ Session::GlobalRouteBooleanState Session::get_global_route_boolean (bool (Route::*method)(void) const) { GlobalRouteBooleanState s; - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (route_lock); for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) { if (!(*i)->hidden()) { @@ -2611,7 +2609,7 @@ Session::GlobalRouteMeterState Session::get_global_route_metering () { GlobalRouteMeterState s; - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (route_lock); for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) { if (!(*i)->hidden()) { @@ -3068,13 +3066,13 @@ Session::cleanup_sources (Session::cleanup_report& rep) on whichever filesystem it was already on. */ - newpath = PBD::dirname (*x); - newpath = PBD::dirname (newpath); + newpath = Glib::path_get_dirname (*x); + newpath = Glib::path_get_dirname (newpath); newpath += '/'; newpath += dead_sound_dir_name; newpath += '/'; - newpath += PBD::basename ((*x)); + newpath += Glib::path_get_basename ((*x)); if (access (newpath.c_str(), F_OK) == 0) { diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index 45ef3812d1..fafaf2a475 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -27,7 +27,7 @@ #include <pbd/undo.h> #include <pbd/error.h> -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> #include <pbd/pthread_utils.h> #include <midi++/mmc.h> @@ -190,9 +190,9 @@ Session::realtime_stop (bool abort) void Session::butler_transport_work () { - RWLockMonitor rm (route_lock, false, __LINE__, __FILE__); - RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__); - + Glib::RWLock::ReaderLock rm (route_lock); + Glib::RWLock::ReaderLock dsm (diskstream_lock); + if (post_transport_work & PostTransportCurveRealloc) { for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) { (*i)->curve_reallocate(); @@ -240,13 +240,13 @@ Session::butler_transport_work () non_realtime_set_audition (); } - atomic_dec (&butler_should_do_transport_work); + g_atomic_int_dec_and_test (&butler_should_do_transport_work); } void Session::non_realtime_set_speed () { - RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (diskstream_lock); for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { (*i)->non_realtime_set_speed (); @@ -256,7 +256,7 @@ Session::non_realtime_set_speed () void Session::non_realtime_overwrite () { - RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (diskstream_lock); for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->pending_overwrite) { @@ -398,9 +398,9 @@ Session::non_realtime_stop (bool abort) */ if (!Config->get_latched_record_enable()) { - atomic_set (&_record_status, Disabled); + g_atomic_int_set (&_record_status, Disabled); } else { - atomic_set (&_record_status, Enabled); + g_atomic_int_set (&_record_status, Enabled); } RecordStateChanged (); /* emit signal */ } @@ -633,7 +633,7 @@ Session::locate (jack_nframes_t target_frame, bool with_roll, bool with_flush, b /* this is functionally what clear_clicks() does but with a tentative lock */ - TentativeRWLockMonitor clickm (click_lock, true, __LINE__, __FILE__); + Glib::RWLock::WriterLock clickm (click_lock, Glib::TRY_LOCK); if (clickm.locked()) { @@ -652,7 +652,7 @@ Session::locate (jack_nframes_t target_frame, bool with_roll, bool with_flush, b a non-tentative rwlock here, because the action must occur. The rarity and short potential lock duration makes this "OK" */ - RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock dsm (diskstream_lock); for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->record_enabled ()) { //cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl; @@ -667,7 +667,7 @@ Session::locate (jack_nframes_t target_frame, bool with_roll, bool with_flush, b a non-tentative rwlock here, because the action must occur. The rarity and short potential lock duration makes this "OK" */ - RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock dsm (diskstream_lock); for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->record_enabled ()) { //cerr << "switching to input" << __FILE__ << __LINE__ << endl << endl; @@ -713,7 +713,7 @@ Session::set_transport_speed (float speed, bool abort) a non-tentative rwlock here, because the action must occur. The rarity and short potential lock duration makes this "OK" */ - RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock dsm (diskstream_lock); for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if ((*i)->record_enabled ()) { //cerr << "switching to input" << __FILE__ << __LINE__ << endl << endl; @@ -739,7 +739,7 @@ Session::set_transport_speed (float speed, bool abort) a non-tentative rwlock here, because the action must occur. The rarity and short potential lock duration makes this "OK" */ - RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock dsm (diskstream_lock); for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) { if (auto_input && (*i)->record_enabled ()) { //cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl; @@ -1171,7 +1171,7 @@ Session::engine_halted () the picture. */ - atomic_set (&butler_should_do_transport_work, 0); + g_atomic_int_set (&butler_should_do_transport_work, 0); post_transport_work = PostTransportWork (0); stop_butler (); @@ -1207,8 +1207,8 @@ Session::update_latency_compensation (bool with_stop, bool abort) return; } - RWLockMonitor lm (route_lock, false, __LINE__, __FILE__); - RWLockMonitor lm2 (diskstream_lock, false, __LINE__, __FILE__); + Glib::RWLock::ReaderLock lm (route_lock); + Glib::RWLock::ReaderLock lm2 (diskstream_lock); _worst_track_latency = 0; for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) { diff --git a/libs/ardour/sndfilesource.cc b/libs/ardour/sndfilesource.cc index e547b212a0..87f7faf423 100644 --- a/libs/ardour/sndfilesource.cc +++ b/libs/ardour/sndfilesource.cc @@ -138,7 +138,7 @@ SndFileSource::read (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char real_cnt = cnt * _info.channels; { - LockMonitor lm (_tmpbuf_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (_tmpbuf_lock); if (tmpbufsize < real_cnt) { diff --git a/libs/ardour/source.cc b/libs/ardour/source.cc index ffb067733d..7d790a036d 100644 --- a/libs/ardour/source.cc +++ b/libs/ardour/source.cc @@ -29,7 +29,7 @@ #include <iomanip> #include <algorithm> -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> #include <pbd/xml++.h> #include <pbd/pthread_utils.h> @@ -41,13 +41,12 @@ using std::min; using std::max; using namespace ARDOUR; -using namespace PBD; -sigc::signal<void,Source *> Source::SourceCreated; +sigc::signal<void,Source *> Source::SourceCreated; pthread_t Source::peak_thread; bool Source::have_peak_thread = false; vector<Source*> Source::pending_peak_sources; -PBD::Lock Source::pending_peak_sources_lock; +Glib::StaticMutex Source::pending_peak_sources_lock = GLIBMM_STATIC_MUTEX_INIT; int Source::peak_request_pipe[2]; bool Source::_build_missing_peakfiles = false; @@ -142,19 +141,19 @@ Source::peak_thread_work (void* arg) PBD::ThreadCreated (pthread_self(), X_("Peak")); struct pollfd pfd[1]; - LockMonitor lm (pending_peak_sources_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (pending_peak_sources_lock); while (true) { pfd[0].fd = peak_request_pipe[0]; pfd[0].events = POLLIN|POLLERR|POLLHUP; - pthread_mutex_unlock (pending_peak_sources_lock.mutex()); + pending_peak_sources_lock.unlock(); if (poll (pfd, 1, -1) < 0) { if (errno == EINTR) { - pthread_mutex_lock (pending_peak_sources_lock.mutex()); + pending_peak_sources_lock.lock(); continue; } @@ -204,16 +203,16 @@ Source::peak_thread_work (void* arg) } } - pthread_mutex_lock (pending_peak_sources_lock.mutex()); + pending_peak_sources_lock.lock(); while (!pending_peak_sources.empty()) { Source* s = pending_peak_sources.front(); pending_peak_sources.erase (pending_peak_sources.begin()); - pthread_mutex_unlock (pending_peak_sources_lock.mutex()); + pending_peak_sources_lock.unlock(); s->build_peaks(); - pthread_mutex_lock (pending_peak_sources_lock.mutex()); + pending_peak_sources_lock.lock(); } } @@ -272,7 +271,7 @@ Source::queue_for_peaks (Source& source) { if (have_peak_thread) { - LockMonitor lm (pending_peak_sources_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (pending_peak_sources_lock); source.next_peak_clear_should_notify = true; @@ -291,7 +290,7 @@ void Source::clear_queue_for_peaks () { /* this is done to cancel a group of running peak builds */ if (have_peak_thread) { - LockMonitor lm (pending_peak_sources_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (pending_peak_sources_lock); pending_peak_sources.clear (); } } @@ -301,7 +300,7 @@ bool Source::peaks_ready (sigc::slot<void> the_slot, sigc::connection& conn) const { bool ret; - LockMonitor lm (_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (_lock); /* check to see if the peak data is ready. if not connect the slot while still holding the lock. @@ -388,7 +387,7 @@ Source::initialize_peakfile (bool newfile, string audio_path) int Source::read_peaks (PeakData *peaks, jack_nframes_t npeaks, jack_nframes_t start, jack_nframes_t cnt, double samples_per_visual_peak) const { - LockMonitor lm (_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (_lock); double scale; double expected_peaks; PeakData::PeakDatum xmax; @@ -699,7 +698,7 @@ Source::build_peaks () list<PeakBuildRecord*> copy; { - LockMonitor lm (_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (_lock); copy = pending_peak_builds; pending_peak_builds.clear (); } @@ -719,7 +718,7 @@ Source::build_peaks () } { - LockMonitor lm (_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (_lock); if (status == 0) { _peaks_built = true; @@ -830,7 +829,7 @@ Source::do_build_peak (jack_nframes_t first_frame, jack_nframes_t cnt) void Source::build_peaks_from_scratch () { - LockMonitor lp (_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lp (_lock); next_peak_clear_should_notify = true; pending_peak_builds.push_back (new PeakBuildRecord (0, _length)); @@ -883,7 +882,7 @@ Source::available_peaks (double zoom_factor) const } { - LockMonitor lm (_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (_lock); end = lseek (peakfile, 0, SEEK_END); } diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc index 5d6365cff3..64964b29dd 100644 --- a/libs/ardour/tempo.cc +++ b/libs/ardour/tempo.cc @@ -25,7 +25,7 @@ #include <sigc++/bind.h> -#include <pbd/lockmonitor.h> +#include <glibmm/thread.h> #include <pbd/xml++.h> #include <ardour/tempo.h> #include <ardour/utils.h> @@ -240,7 +240,7 @@ TempoMap::move_metric_section (MetricSection& section, const BBT_Time& when) return 1; } - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); MetricSectionSorter cmp; BBT_Time corrected (when); @@ -283,7 +283,7 @@ TempoMap::remove_tempo (const TempoSection& tempo) bool removed = false; { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); Metrics::iterator i; for (i = metrics->begin(); i != metrics->end(); ++i) { @@ -310,7 +310,7 @@ TempoMap::remove_meter (const MeterSection& tempo) bool removed = false; { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); Metrics::iterator i; for (i = metrics->begin(); i != metrics->end(); ++i) { @@ -361,7 +361,7 @@ void TempoMap::add_tempo (const Tempo& tempo, BBT_Time where) { { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); /* new tempos always start on a beat */ @@ -381,7 +381,7 @@ TempoMap::replace_tempo (TempoSection& existing, const Tempo& replacement) bool replaced = false; { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); Metrics::iterator i; for (i = metrics->begin(); i != metrics->end(); ++i) { @@ -411,7 +411,7 @@ void TempoMap::add_meter (const Meter& meter, BBT_Time where) { { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); /* a new meter always starts a new bar on the first beat. so round the start time appropriately. remember that @@ -443,7 +443,7 @@ TempoMap::replace_meter (MeterSection& existing, const Meter& replacement) bool replaced = false; { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); Metrics::iterator i; for (i = metrics->begin(); i != metrics->end(); ++i) { @@ -611,7 +611,7 @@ TempoMap::metric_at (BBT_Time bbt) const void TempoMap::bbt_time (jack_nframes_t frame, BBT_Time& bbt) const { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); bbt_time_unlocked (frame, bbt); } @@ -759,7 +759,7 @@ TempoMap::bbt_duration_at (jack_nframes_t pos, const BBT_Time& bbt, int dir) con bbt_time(pos,when); { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); frames = bbt_duration_at_unlocked (when, bbt,dir); } @@ -896,7 +896,7 @@ TempoMap::bbt_duration_at_unlocked (const BBT_Time& when, const BBT_Time& bbt, i jack_nframes_t TempoMap::round_to_bar (jack_nframes_t fr, int dir) { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); return round_to_type (fr, dir, Bar); } @@ -904,7 +904,7 @@ TempoMap::round_to_bar (jack_nframes_t fr, int dir) jack_nframes_t TempoMap::round_to_beat (jack_nframes_t fr, int dir) { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); return round_to_type (fr, dir, Beat); } @@ -912,7 +912,7 @@ jack_nframes_t TempoMap::round_to_beat_subdivision (jack_nframes_t fr, int sub_num) { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); TempoMap::BBTPointList::iterator i; TempoMap::BBTPointList *more_zoomed_bbt_points; jack_nframes_t frame_one_beats_worth; @@ -1185,7 +1185,7 @@ TempoMap::meter_at (jack_nframes_t frame) XMLNode& TempoMap::get_state () { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); Metrics::const_iterator i; XMLNode *root = new XMLNode ("TempoMap"); @@ -1200,7 +1200,7 @@ int TempoMap::set_state (const XMLNode& node) { { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); XMLNodeList nlist; XMLNodeConstIterator niter; @@ -1292,7 +1292,7 @@ TempoMap::get_memento () const Change TempoMap::restore_state (StateManager::State& state) { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); TempoMapState* tmstate = dynamic_cast<TempoMapState*> (&state); diff --git a/libs/ardour/utils.cc b/libs/ardour/utils.cc index 8e9a36de59..15d0c6be81 100644 --- a/libs/ardour/utils.cc +++ b/libs/ardour/utils.cc @@ -175,10 +175,13 @@ tokenize_fullpath (string fullpath, string& path, string& name) } int -touch_file(string path) +touch_file (string path) { - FILE* file = fopen(path.c_str(), "a"); - fclose(file); + int fd = open (path.c_str(), O_RDONLY|O_CREAT); + if (fd >= 0) { + close (fd); + return 0; + } return 1; } |