2 Copyright (C) 2000 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.
34 #include <glibmm/fileutils.h>
35 #include <glibmm/miscutils.h>
37 #include <pbd/xml++.h>
38 #include <pbd/pthread_utils.h>
40 #include <ardour/audiosource.h>
41 #include <ardour/cycle_timer.h>
42 #include <ardour/session.h>
43 #include <ardour/transient_detector.h>
44 #include <ardour/runtime_functions.h>
49 using namespace ARDOUR;
53 bool AudioSource::_build_missing_peakfiles = false;
54 bool AudioSource::_build_peakfiles = false;
58 AudioSource::AudioSource (Session& s, ustring name)
59 : Source (s, DataType::AUDIO, name)
65 _write_data_count = 0;
66 peak_leftover_cnt = 0;
67 peak_leftover_size = 0;
71 AudioSource::AudioSource (Session& s, const XMLNode& node)
79 _write_data_count = 0;
80 peak_leftover_cnt = 0;
81 peak_leftover_size = 0;
84 if (set_state (node)) {
85 throw failed_constructor();
89 AudioSource::~AudioSource ()
91 /* shouldn't happen but make sure we don't leak file descriptors anyway */
93 if (peak_leftover_cnt) {
94 cerr << "AudioSource destroyed with leftover peak data pending" << endl;
101 delete [] peak_leftovers;
105 AudioSource::get_state ()
107 XMLNode& node (Source::get_state());
109 if (_captured_for.length()) {
110 node.add_property ("captured-for", _captured_for);
117 AudioSource::set_state (const XMLNode& node)
119 const XMLProperty* prop;
121 if ((prop = node.property ("captured-for")) != 0) {
122 _captured_for = prop->value();
128 /***********************************************************************
130 ***********************************************************************/
133 AudioSource::peaks_ready (sigc::slot<void> the_slot, sigc::connection& conn) const
136 Glib::Mutex::Lock lm (_peaks_ready_lock);
138 /* check to see if the peak data is ready. if not
139 connect the slot while still holding the lock.
142 if (!(ret = _peaks_built)) {
143 conn = PeaksReady.connect (the_slot);
150 AudioSource::touch_peakfile ()
154 if (stat (peakpath.c_str(), &statbuf) != 0 || statbuf.st_size == 0) {
160 tbuf.actime = statbuf.st_atime;
161 tbuf.modtime = time ((time_t) 0);
163 utime (peakpath.c_str(), &tbuf);
167 AudioSource::rename_peakfile (ustring newpath)
169 /* caller must hold _lock */
171 ustring oldpath = peakpath;
173 if (access (oldpath.c_str(), F_OK) == 0) {
174 if (rename (oldpath.c_str(), newpath.c_str()) != 0) {
175 error << string_compose (_("cannot rename peakfile for %1 from %2 to %3 (%4)"), _name, oldpath, newpath, strerror (errno)) << endmsg;
186 AudioSource::initialize_peakfile (bool newfile, ustring audio_path)
190 peakpath = peak_path (audio_path);
192 /* if the peak file should be there, but isn't .... */
194 if (!newfile && !Glib::file_test (peakpath.c_str(), Glib::FILE_TEST_EXISTS)) {
195 peakpath = find_broken_peakfile (peakpath, audio_path);
198 if (stat (peakpath.c_str(), &statbuf)) {
199 if (errno != ENOENT) {
200 /* it exists in the peaks dir, but there is some kind of error */
202 error << string_compose(_("AudioSource: cannot stat peakfile \"%1\""), peakpath) << endmsg;
206 /* peakfile does not exist */
208 _peaks_built = false;
212 /* we found it in the peaks dir, so check it out */
214 if (statbuf.st_size == 0 || ((nframes_t) statbuf.st_size < ((length() / _FPP) * sizeof (PeakData)))) {
216 _peaks_built = false;
218 // Check if the audio file has changed since the peakfile was built.
219 struct stat stat_file;
220 int err = stat (audio_path.c_str(), &stat_file);
223 _peaks_built = false;
227 /* allow 6 seconds slop on checking peak vs. file times because of various
231 if (stat_file.st_mtime > statbuf.st_mtime && (stat_file.st_mtime - statbuf.st_mtime > 6)) {
232 _peaks_built = false;
236 _peak_byte_max = statbuf.st_size;
242 if (!newfile && !_peaks_built && _build_missing_peakfiles && _build_peakfiles) {
243 build_peaks_from_scratch ();
250 AudioSource::read (Sample *dst, sframes_t start, nframes_t cnt, int channel) const
252 Glib::Mutex::Lock lm (_lock);
253 return read_unlocked (dst, start, cnt);
257 AudioSource::write (Sample *dst, nframes_t cnt)
259 Glib::Mutex::Lock lm (_lock);
260 return write_unlocked (dst, cnt);
264 AudioSource::read_peaks (PeakData *peaks, nframes_t npeaks, sframes_t start, nframes_t cnt, double samples_per_visual_peak) const
266 return read_peaks_with_fpp (peaks, npeaks, start, cnt, samples_per_visual_peak, _FPP);
270 AudioSource::read_peaks_with_fpp (PeakData *peaks, nframes_t npeaks, sframes_t start, nframes_t cnt,
271 double samples_per_visual_peak, nframes_t samples_per_file_peak) const
273 Glib::Mutex::Lock lm (_lock);
275 double expected_peaks;
276 PeakData::PeakDatum xmax;
277 PeakData::PeakDatum xmin;
280 nframes_t zero_fill = 0;
282 PeakData* staging = 0;
283 Sample* raw_staging = 0;
286 expected_peaks = (cnt / (double) samples_per_file_peak);
287 scale = npeaks/expected_peaks;
289 #undef DEBUG_READ_PEAKS
290 #ifdef DEBUG_READ_PEAKS
291 cerr << "======>RP: npeaks = " << npeaks
292 << " start = " << start
294 << " len = " << _length
295 << " samples_per_visual_peak =" << samples_per_visual_peak
296 << " expected was " << expected_peaks << " ... scale = " << scale
297 << " PD ptr = " << peaks
302 /* fix for near-end-of-file conditions */
304 if (cnt > _length - start) {
305 // cerr << "too close to end @ " << _length << " given " << start << " + " << cnt << endl;
306 cnt = _length - start;
307 nframes_t old = npeaks;
308 npeaks = min ((nframes_t) floor (cnt / samples_per_visual_peak), npeaks);
309 zero_fill = old - npeaks;
312 // cerr << "actual npeaks = " << npeaks << " zf = " << zero_fill << endl;
316 #ifdef DEBUG_READ_PEAKS
317 cerr << "RAW DATA\n";
319 /* no scaling at all, just get the sample data and duplicate it for
320 both max and min peak values.
323 Sample* raw_staging = new Sample[cnt];
325 if (read_unlocked (raw_staging, start, cnt) != cnt) {
326 error << _("cannot read sample data for unscaled peak computation") << endmsg;
330 for (nframes_t i = 0; i < npeaks; ++i) {
331 peaks[i].max = raw_staging[i];
332 peaks[i].min = raw_staging[i];
335 delete [] raw_staging;
341 off_t first_peak_byte = (start / samples_per_file_peak) * sizeof (PeakData);
343 /* open, read, close */
345 if ((_peakfile = ::open (peakpath.c_str(), O_RDONLY, 0664)) < 0) {
346 error << string_compose(_("AudioSource: cannot open peakpath (a) \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
350 #ifdef DEBUG_READ_PEAKS
351 cerr << "DIRECT PEAKS\n";
354 nread = ::pread (_peakfile, peaks, sizeof (PeakData)* npeaks, first_peak_byte);
357 if (nread != sizeof (PeakData) * npeaks) {
358 cerr << "AudioSource["
360 << "]: cannot read peaks from peakfile! (read only "
374 memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill);
385 #ifdef DEBUG_READ_PEAKS
386 cerr << "DOWNSAMPLE\n";
390 - more frames-per-peak (lower resolution) than the peakfile, or to put it another way,
391 - less peaks than the peakfile holds for the same range
393 So, read a block into a staging area, and then downsample from there.
395 to avoid confusion, I'll refer to the requested peaks as visual_peaks and the peakfile peaks as stored_peaks
398 const uint32_t chunksize = (uint32_t) min (expected_peaks, 65536.0);
400 staging = new PeakData[chunksize];
402 /* compute the rounded up frame position */
404 nframes_t current_frame = start;
405 nframes_t current_stored_peak = (nframes_t) ceil (current_frame / (double) samples_per_file_peak);
406 uint32_t next_visual_peak = (uint32_t) ceil (current_frame / samples_per_visual_peak);
407 double next_visual_peak_frame = next_visual_peak * samples_per_visual_peak;
408 uint32_t stored_peak_before_next_visual_peak = (nframes_t) next_visual_peak_frame / samples_per_file_peak;
409 uint32_t nvisual_peaks = 0;
410 uint32_t stored_peaks_read = 0;
413 /* handle the case where the initial visual peak is on a pixel boundary */
415 current_stored_peak = min (current_stored_peak, stored_peak_before_next_visual_peak);
417 /* open ... close during out: handling */
419 if ((_peakfile = ::open (peakpath.c_str(), O_RDONLY, 0664)) < 0) {
420 error << string_compose(_("AudioSource: cannot open peakpath (b) \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
424 while (nvisual_peaks < npeaks) {
426 if (i == stored_peaks_read) {
428 uint32_t start_byte = current_stored_peak * sizeof(PeakData);
429 tnp = min ((nframes_t)(_length/samples_per_file_peak - current_stored_peak), (nframes_t) expected_peaks);
430 to_read = min (chunksize, tnp);
432 #ifdef DEBUG_READ_PEAKS
433 cerr << "read " << sizeof (PeakData) * to_read << " from peakfile @ " << start_byte << endl;
436 if ((nread = ::pread (_peakfile, staging, sizeof (PeakData) * to_read, start_byte))
437 != sizeof (PeakData) * to_read) {
439 off_t fend = lseek (_peakfile, 0, SEEK_END);
441 cerr << "AudioSource["
443 << "]: cannot read peak data from peakfile ("
444 << (nread / sizeof(PeakData))
445 << " peaks instead of "
450 << " at start_byte = " << start_byte
451 << " _length = " << _length << " versus len = " << fend
452 << " expected maxpeaks = " << (_length - current_frame)/samples_per_file_peak
453 << " npeaks was " << npeaks
459 stored_peaks_read = nread / sizeof(PeakData);
465 while ((i < stored_peaks_read) && (current_stored_peak <= stored_peak_before_next_visual_peak)) {
467 xmax = max (xmax, staging[i].max);
468 xmin = min (xmin, staging[i].min);
470 ++current_stored_peak;
474 peaks[nvisual_peaks].max = xmax;
475 peaks[nvisual_peaks].min = xmin;
479 //next_visual_peak_frame = min ((next_visual_peak * samples_per_visual_peak), (next_visual_peak_frame+samples_per_visual_peak) );
480 next_visual_peak_frame = min ((double) start+cnt, (next_visual_peak_frame+samples_per_visual_peak) );
481 stored_peak_before_next_visual_peak = (uint32_t) next_visual_peak_frame / samples_per_file_peak;
485 memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill);
492 #ifdef DEBUG_READ_PEAKS
493 cerr << "UPSAMPLE\n";
497 - less frames-per-peak (more resolution)
498 - more peaks than stored in the Peakfile
500 So, fetch data from the raw source, and generate peak
504 nframes_t frames_read = 0;
505 nframes_t current_frame = start;
507 nframes_t nvisual_peaks = 0;
508 nframes_t chunksize = (nframes_t) min (cnt, (nframes_t) 4096);
509 raw_staging = new Sample[chunksize];
511 nframes_t frame_pos = start;
512 double pixel_pos = floor (frame_pos / samples_per_visual_peak);
513 double next_pixel_pos = ceil (frame_pos / samples_per_visual_peak);
514 double pixels_per_frame = 1.0 / samples_per_visual_peak;
519 while (nvisual_peaks < npeaks) {
521 if (i == frames_read) {
523 to_read = min (chunksize, nframes_t(_length - current_frame));
526 /* XXX ARGH .. out by one error ... need to figure out why this happens
527 and fix it rather than do this band-aid move.
529 zero_fill = npeaks - nvisual_peaks;
533 if ((frames_read = read_unlocked (raw_staging, current_frame, to_read)) == 0) {
534 error << string_compose(_("AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"),
535 _name, to_read, current_frame, _length, strerror (errno))
543 xmax = max (xmax, raw_staging[i]);
544 xmin = min (xmin, raw_staging[i]);
547 pixel_pos += pixels_per_frame;
549 if (pixel_pos >= next_pixel_pos) {
551 peaks[nvisual_peaks].max = xmax;
552 peaks[nvisual_peaks].min = xmin;
557 next_pixel_pos = ceil (pixel_pos + 0.5);
562 memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill);
569 if (_peakfile >= 0) {
574 delete [] raw_staging;
576 #ifdef DEBUG_READ_PEAKS
583 #undef DEBUG_PEAK_BUILD
586 AudioSource::build_peaks_from_scratch ()
588 nframes_t current_frame;
591 nframes_t frames_read;
592 nframes_t frames_to_read;
593 const nframes_t bufsize = 65536; // 256kB per disk read for mono data is about ideal
598 /* hold lock while building peaks */
600 Glib::Mutex::Lock lp (_lock);
602 if (prepare_for_peakfile_writes ()) {
608 _peaks_built = false;
609 buf = new Sample[bufsize];
613 frames_to_read = min (bufsize, cnt);
615 if ((frames_read = read_unlocked (buf, current_frame, frames_to_read)) != frames_to_read) {
616 error << string_compose(_("%1: could not write read raw data for peak computation (%2)"), _name, strerror (errno)) << endmsg;
617 done_with_peakfile_writes (false);
621 if (compute_and_write_peaks (buf, current_frame, frames_read, true, false, _FPP)) {
625 current_frame += frames_read;
634 done_with_peakfile_writes ((cnt == 0));
638 Glib::Mutex::Lock lm (_peaks_ready_lock);
641 PeaksReady (); /* EMIT SIGNAL */
648 unlink (peakpath.c_str());
657 AudioSource::prepare_for_peakfile_writes ()
659 if ((peakfile = ::open (peakpath.c_str(), O_RDWR|O_CREAT, 0664)) < 0) {
660 error << string_compose(_("AudioSource: cannot open peakpath (c) \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
667 AudioSource::done_with_peakfile_writes (bool done)
669 if (peak_leftover_cnt) {
670 compute_and_write_peaks (0, 0, 0, true, false, _FPP);
684 AudioSource::compute_and_write_peaks (Sample* buf, sframes_t first_frame, nframes_t cnt,
685 bool force, bool intermediate_peaks_ready)
687 return compute_and_write_peaks (buf, first_frame, cnt, force, intermediate_peaks_ready, _FPP);
691 AudioSource::compute_and_write_peaks (Sample* buf, sframes_t first_frame, nframes_t cnt,
692 bool force, bool intermediate_peaks_ready, nframes_t fpp)
696 uint32_t peaks_computed;
697 PeakData* peakbuf = 0;
699 nframes_t current_frame;
700 nframes_t frames_done;
701 const size_t blocksize = (128 * 1024);
702 off_t first_peak_byte;
705 prepare_for_peakfile_writes ();
709 if (peak_leftover_cnt) {
711 if (first_frame != peak_leftover_frame + peak_leftover_cnt) {
713 /* uh-oh, ::seek() since the last ::compute_and_write_peaks(),
714 and we have leftovers. flush a single peak (since the leftovers
715 never represent more than that, and restart.
720 x.min = peak_leftovers[0];
721 x.max = peak_leftovers[0];
723 off_t byte = (peak_leftover_frame / fpp) * sizeof (PeakData);
725 if (::pwrite (peakfile, &x, sizeof (PeakData), byte) != sizeof (PeakData)) {
726 error << string_compose(_("%1: could not write peak file data (%2)"), _name, strerror (errno)) << endmsg;
730 _peak_byte_max = max (_peak_byte_max, (off_t) (byte + sizeof(PeakData)));
733 Glib::Mutex::Lock lm (_peaks_ready_lock);
734 PeakRangeReady (peak_leftover_frame, peak_leftover_cnt); /* EMIT SIGNAL */
735 if (intermediate_peaks_ready) {
736 PeaksReady (); /* EMIT SIGNAL */
740 /* left overs are done */
742 peak_leftover_cnt = 0;
746 /* else ... had leftovers, but they immediately preceed the new data, so just
747 merge them and compute.
750 /* make a new contiguous buffer containing leftovers and the new stuff */
752 to_do = cnt + peak_leftover_cnt;
753 buf2 = new Sample[to_do];
756 memcpy (buf2, peak_leftovers, peak_leftover_cnt * sizeof (Sample));
759 memcpy (buf2+peak_leftover_cnt, buf, cnt * sizeof (Sample));
761 /* no more leftovers */
762 peak_leftover_cnt = 0;
764 /* use the temporary buffer */
767 /* make sure that when we write into the peakfile, we startup where we left off */
769 first_frame = peak_leftover_frame;
775 peakbuf = new PeakData[(to_do/fpp)+1];
777 current_frame = first_frame;
782 /* if some frames were passed in (i.e. we're not flushing leftovers)
783 and there are less than fpp to do, save them till
787 if (force && (to_do < fpp)) {
788 /* keep the left overs around for next time */
790 if (peak_leftover_size < to_do) {
791 delete [] peak_leftovers;
792 peak_leftovers = new Sample[to_do];
793 peak_leftover_size = to_do;
795 memcpy (peak_leftovers, buf, to_do * sizeof (Sample));
796 peak_leftover_cnt = to_do;
797 peak_leftover_frame = current_frame;
804 nframes_t this_time = min (fpp, to_do);
806 peakbuf[peaks_computed].max = buf[0];
807 peakbuf[peaks_computed].min = buf[0];
809 ARDOUR::find_peaks (buf+1, this_time-1, &peakbuf[peaks_computed].min, &peakbuf[peaks_computed].max);
814 frames_done += this_time;
815 current_frame += this_time;
818 first_peak_byte = (first_frame / fpp) * sizeof (PeakData);
820 if (can_truncate_peaks()) {
822 /* on some filesystems (ext3, at least) this helps to reduce fragmentation of
823 the peakfiles. its not guaranteed to do so, and even on ext3 (as of december 2006)
824 it does not cause single-extent allocation even for peakfiles of
825 less than BLOCKSIZE bytes. only call ftruncate if we'll make the file larger.
828 off_t endpos = lseek (peakfile, 0, SEEK_END);
829 off_t target_length = blocksize * ((first_peak_byte + blocksize + 1) / blocksize);
831 if (endpos < target_length) {
832 ftruncate (peakfile, target_length);
833 /* error doesn't actually matter though, so continue on without testing */
837 if (::pwrite (peakfile, peakbuf, sizeof (PeakData) * peaks_computed, first_peak_byte) != (ssize_t) (sizeof (PeakData) * peaks_computed)) {
838 error << string_compose(_("%1: could not write peak file data (%2)"), _name, strerror (errno)) << endmsg;
842 _peak_byte_max = max (_peak_byte_max, (off_t) (first_peak_byte + sizeof(PeakData)*peaks_computed));
845 Glib::Mutex::Lock lm (_peaks_ready_lock);
846 PeakRangeReady (first_frame, frames_done); /* EMIT SIGNAL */
847 if (intermediate_peaks_ready) {
848 PeaksReady (); /* EMIT SIGNAL */
862 AudioSource::truncate_peakfile ()
865 error << string_compose (_("programming error: %1"), "AudioSource::truncate_peakfile() called without open peakfile descriptor")
870 /* truncate the peakfile down to its natural length if necessary */
872 off_t end = lseek (peakfile, 0, SEEK_END);
874 if (end > _peak_byte_max) {
875 ftruncate (peakfile, _peak_byte_max);
880 AudioSource::file_changed (ustring path)
882 struct stat stat_file;
883 struct stat stat_peak;
885 int e1 = stat (path.c_str(), &stat_file);
886 int e2 = stat (peak_path(path).c_str(), &stat_peak);
888 if (!e1 && !e2 && stat_file.st_mtime > stat_peak.st_mtime){
896 AudioSource::available_peaks (double zoom_factor) const
900 if (zoom_factor < _FPP) {
901 return length(); // peak data will come from the audio file
904 /* peak data comes from peakfile, but the filesize might not represent
905 the valid data due to ftruncate optimizations, so use _peak_byte_max state.
906 XXX - there might be some atomicity issues here, we should probably add a lock,
907 but _peak_byte_max only monotonically increases after initialization.
910 end = _peak_byte_max;
912 return (end/sizeof(PeakData)) * _FPP;