2 Copyright (C) 2008 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #include "ardour/analyser.h"
21 #include "ardour/audiofilesource.h"
22 #include "ardour/session_event.h"
23 #include "ardour/transient_detector.h"
25 #include "pbd/pthread_utils.h"
26 #include "pbd/convert.h"
29 using namespace ARDOUR
;
32 Analyser
* Analyser::the_analyser
= 0;
33 Glib::StaticMutex
Analyser::analysis_queue_lock
= GLIBMM_STATIC_MUTEX_INIT
;
34 Glib::Cond
* Analyser::SourcesToAnalyse
= 0;
35 list
<boost::weak_ptr
<Source
> > Analyser::analysis_queue
;
42 Analyser::~Analyser ()
55 SourcesToAnalyse
= new Glib::Cond();
56 Glib::Thread::create (sigc::ptr_fun (analyser_work
), false);
60 Analyser::queue_source_for_analysis (boost::shared_ptr
<Source
> src
, bool force
)
62 if (!src
->can_be_analysed()) {
66 if (!force
&& src
->has_been_analysed()) {
70 Glib::Mutex::Lock
lm (analysis_queue_lock
);
71 analysis_queue
.push_back (boost::weak_ptr
<Source
>(src
));
72 SourcesToAnalyse
->broadcast ();
78 SessionEvent::create_per_thread_pool ("Analyser", 64);
81 analysis_queue_lock
.lock ();
84 if (analysis_queue
.empty()) {
85 SourcesToAnalyse
->wait (analysis_queue_lock
);
88 if (analysis_queue
.empty()) {
92 boost::shared_ptr
<Source
> src (analysis_queue
.front().lock());
93 analysis_queue
.pop_front();
94 analysis_queue_lock
.unlock ();
96 boost::shared_ptr
<AudioFileSource
> afs
= boost::dynamic_pointer_cast
<AudioFileSource
> (src
);
98 if (afs
&& afs
->length(afs
->timeline_position())) {
99 analyse_audio_file_source (afs
);
105 Analyser::analyse_audio_file_source (boost::shared_ptr
<AudioFileSource
> src
)
107 AnalysisFeatureList results
;
109 TransientDetector
td (src
->sample_rate());
111 if (td
.run (src
->get_transients_path(), src
.get(), 0, results
) == 0) {
112 src
->set_been_analysed (true);
114 src
->set_been_analysed (false);