prevent concurrent peak-file init.
authorRobin Gareus <robin@gareus.org>
Tue, 24 Nov 2015 17:58:11 +0000 (18:58 +0100)
committerRobin Gareus <robin@gareus.org>
Tue, 24 Nov 2015 17:58:11 +0000 (18:58 +0100)
When embedding external files. the same file is queued twice for peak-file
generation. Since there are two  peak_thread_work threas in SourceFactory,
this can lead to inconsistent/missing peaks.

TODO: fix the actual cause, duplicate call to  setup_peakfile():

#0  ARDOUR::SourceFactory::setup_peakfile (s=..., async=true) at ../libs/ardour/source_factory.cc:116
#1  0x00007ffff6c2552f in ARDOUR::SourceFactory::createExternal (type=..., s=..., path="/tmp/CB_bass_Track08.wav", chn=0, flags=(unknown: 0), announce=true, defer_peaks=true)
    at ../libs/ardour/source_factory.cc:254
#2  0x0000000000886f50 in Editor::embed_sndfiles (this=0x3810340, paths=std::vector of length 1, capacity 1 = {...}, multifile=false, check_sample_rate=@0x7fffffffc2df: true,
        disposition=Editing::ImportDistinctFiles, mode=Editing::ImportAsTrack, pos=@0x7fffffffc458: -1, target_regions=1, target_tracks=-1, track=..., instrument=...)
    at ../gtk2_ardour/editor_audio_import.cc:630
#3  0x0000000000885c7c in Editor::do_embed (this=0x3810340, paths=std::vector of length 1, capacity 1 = {...}, import_as=Editing::ImportDistinctFiles, mode=Editing::ImportAsTrack,
        pos=@0x7fffffffc458: -1, instrument=...) at ../gtk2_ardour/editor_audio_import.cc:414
#4  0x0000000000e93aeb in SoundFileOmega::do_something (this=0x490f530, action=-5) at ../gtk2_ardour/sfdb_ui.cc:1983

#0  ARDOUR::SourceFactory::setup_peakfile (s=..., async=true) at ../libs/ardour/source_factory.cc:116
#1  0x0000000000888954 in Editor::add_sources (this=0x3810340, paths=std::vector of length 1, capacity 1 = {...}, sources=std::vector of length 1, capacity 1 = {...},
        pos=@0x7fffffffc458: 0, disposition=Editing::ImportDistinctFiles, mode=Editing::ImportAsTrack, target_regions=1, target_tracks=-1, track=..., instrument=...)
    at ../gtk2_ardour/editor_audio_import.cc:883
#2  0x0000000000887131 in Editor::embed_sndfiles (this=0x3810340, paths=std::vector of length 1, capacity 1 = {...}, multifile=false, check_sample_rate=@0x7fffffffc2df: true,
        disposition=Editing::ImportDistinctFiles, mode=Editing::ImportAsTrack, pos=@0x7fffffffc458: 0, target_regions=1, target_tracks=-1, track=..., instrument=...)
    at ../gtk2_ardour/editor_audio_import.cc:653
#3  0x0000000000885c7c in Editor::do_embed (this=0x3810340, paths=std::vector of length 1, capacity 1 = {...}, import_as=Editing::ImportDistinctFiles, mode=Editing::ImportAsTrack,
        pos=@0x7fffffffc458: 0, instrument=...) at ../gtk2_ardour/editor_audio_import.cc:414
#4  0x0000000000e93aeb in SoundFileOmega::do_something (this=0x490f530, action=-5) at ../gtk2_ardour/sfdb_ui.cc:1983

libs/ardour/ardour/audiosource.h
libs/ardour/audiosource.cc

index 345d424cf3ffcf92a52ce78c10fe1cf4eac58837..59d5add12237bfa39892cbfe3b20749d83ca7e09 100644 (file)
@@ -156,6 +156,7 @@ class LIBARDOUR_API AudioSource : virtual public Source,
         *  during the handling of the signal.
         */
         mutable Glib::Threads::Mutex _peaks_ready_lock;
+        Glib::Threads::Mutex _initialize_peaks_lock;
 
        int        _peakfile_fd;
        framecnt_t peak_leftover_cnt;
index e7d81feaec284beb326339cc948f70adce573d69..9d90d05cb12ddc030fa16f67a85d353977b28347 100644 (file)
@@ -238,6 +238,7 @@ AudioSource::rename_peakfile (string newpath)
 int
 AudioSource::initialize_peakfile (const string& audio_path, const bool in_session)
 {
+       Glib::Threads::Mutex::Lock lm (_initialize_peaks_lock);
        GStatBuf statbuf;
 
        _peakpath = construct_peak_filepath (audio_path, in_session);