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;
55 /** true if we want peakfiles (e.g. if we are displaying a GUI) */
56 bool AudioSource::_build_peakfiles = false;
60 AudioSource::AudioSource (Session& s, ustring name)
61 : Source (s, DataType::AUDIO, name)
66 _peakfile_descriptor = 0;
68 _write_data_count = 0;
69 peak_leftover_cnt = 0;
70 peak_leftover_size = 0;
74 AudioSource::AudioSource (Session& s, const XMLNode& node)
81 _peakfile_descriptor = 0;
83 _write_data_count = 0;
84 peak_leftover_cnt = 0;
85 peak_leftover_size = 0;
88 if (set_state (node, Stateful::loading_state_version)) {
89 throw failed_constructor();
93 AudioSource::~AudioSource ()
95 /* shouldn't happen but make sure we don't leak file descriptors anyway */
97 if (peak_leftover_cnt) {
98 cerr << "AudioSource destroyed with leftover peak data pending" << endl;
101 delete _peakfile_descriptor;
102 delete [] peak_leftovers;
106 AudioSource::get_state ()
108 XMLNode& node (Source::get_state());
110 if (_captured_for.length()) {
111 node.add_property ("captured-for", _captured_for);
118 AudioSource::set_state (const XMLNode& node, int /*version*/)
120 const XMLProperty* prop;
122 if ((prop = node.property ("captured-for")) != 0) {
123 _captured_for = prop->value();
130 AudioSource::empty () const
136 AudioSource::length (framepos_t /*pos*/) const
142 AudioSource::update_length (framepos_t pos, framecnt_t cnt)
144 if (pos + cnt > _length) {
150 /***********************************************************************
152 ***********************************************************************/
154 /** Checks to see if peaks are ready. If so, we return true. If not, we return false, and
155 * things are set up so that doThisWhenReady is called when the peaks are ready.
156 * A new PBD::ScopedConnection is created for the associated connection and written to
157 * *connect_here_if_not.
159 * @param doThisWhenReady Function to call when peaks are ready (if they are not already).
160 * @param connect_here_if_not Address to write new ScopedConnection to.
161 * @param event_loop Event loop for doThisWhenReady to be called in.
164 AudioSource::peaks_ready (boost::function<void()> doThisWhenReady, ScopedConnection** connect_here_if_not, EventLoop* event_loop) const
167 Glib::Mutex::Lock lm (_peaks_ready_lock);
169 /* check to see if the peak data is ready. if not
170 connect the slot while still holding the lock.
173 if (!(ret = _peaks_built)) {
174 *connect_here_if_not = new ScopedConnection;
175 PeaksReady.connect (**connect_here_if_not, MISSING_INVALIDATOR, doThisWhenReady, event_loop);
182 AudioSource::touch_peakfile ()
186 if (stat (peakpath.c_str(), &statbuf) != 0 || statbuf.st_size == 0) {
192 tbuf.actime = statbuf.st_atime;
193 tbuf.modtime = time ((time_t) 0);
195 utime (peakpath.c_str(), &tbuf);
199 AudioSource::rename_peakfile (ustring newpath)
201 /* caller must hold _lock */
203 ustring oldpath = peakpath;
205 if (access (oldpath.c_str(), F_OK) == 0) {
206 if (rename (oldpath.c_str(), newpath.c_str()) != 0) {
207 error << string_compose (_("cannot rename peakfile for %1 from %2 to %3 (%4)"), _name, oldpath, newpath, strerror (errno)) << endmsg;
218 AudioSource::initialize_peakfile (bool newfile, ustring audio_path)
222 peakpath = peak_path (audio_path);
224 /* if the peak file should be there, but isn't .... */
226 if (!newfile && !Glib::file_test (peakpath.c_str(), Glib::FILE_TEST_EXISTS)) {
227 peakpath = find_broken_peakfile (peakpath, audio_path);
230 if (stat (peakpath.c_str(), &statbuf)) {
231 if (errno != ENOENT) {
232 /* it exists in the peaks dir, but there is some kind of error */
234 error << string_compose(_("AudioSource: cannot stat peakfile \"%1\""), peakpath) << endmsg;
238 /* peakfile does not exist */
240 _peaks_built = false;
244 /* we found it in the peaks dir, so check it out */
246 if (statbuf.st_size == 0 || ((nframes_t) statbuf.st_size < ((length(_timeline_position) / _FPP) * sizeof (PeakData)))) {
248 _peaks_built = false;
250 // Check if the audio file has changed since the peakfile was built.
251 struct stat stat_file;
252 int err = stat (audio_path.c_str(), &stat_file);
255 _peaks_built = false;
259 /* allow 6 seconds slop on checking peak vs. file times because of various
263 if (stat_file.st_mtime > statbuf.st_mtime && (stat_file.st_mtime - statbuf.st_mtime > 6)) {
264 _peaks_built = false;
268 _peak_byte_max = statbuf.st_size;
274 if (!newfile && !_peaks_built && _build_missing_peakfiles && _build_peakfiles) {
275 build_peaks_from_scratch ();
282 AudioSource::read (Sample *dst, framepos_t start, framecnt_t cnt, int /*channel*/) const
284 Glib::Mutex::Lock lm (_lock);
285 return read_unlocked (dst, start, cnt);
289 AudioSource::write (Sample *dst, framecnt_t cnt)
291 Glib::Mutex::Lock lm (_lock);
292 /* any write makes the fill not removable */
293 _flags = Flag (_flags & ~Removable);
294 return write_unlocked (dst, cnt);
298 AudioSource::read_peaks (PeakData *peaks, framecnt_t npeaks, framepos_t start, framecnt_t cnt, double samples_per_visual_peak) const
300 return read_peaks_with_fpp (peaks, npeaks, start, cnt, samples_per_visual_peak, _FPP);
303 /** @param peaks Buffer to write peak data.
304 * @param npeaks Number of peaks to write.
308 AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t start, framecnt_t cnt,
309 double samples_per_visual_peak, framecnt_t samples_per_file_peak) const
311 Glib::Mutex::Lock lm (_lock);
313 double expected_peaks;
314 PeakData::PeakDatum xmax;
315 PeakData::PeakDatum xmin;
318 framecnt_t zero_fill = 0;
320 PeakData* staging = 0;
321 Sample* raw_staging = 0;
323 FdFileDescriptor* peakfile_descriptor = new FdFileDescriptor (peakpath, false, 0664);
324 int peakfile_fd = -1;
326 expected_peaks = (cnt / (double) samples_per_file_peak);
327 scale = npeaks/expected_peaks;
329 #undef DEBUG_READ_PEAKS
330 #ifdef DEBUG_READ_PEAKS
331 cerr << "======>RP: npeaks = " << npeaks
332 << " start = " << start
334 << " len = " << _length
335 << " samples_per_visual_peak =" << samples_per_visual_peak
336 << " expected was " << expected_peaks << " ... scale = " << scale
337 << " PD ptr = " << peaks
342 /* fix for near-end-of-file conditions */
344 if (cnt > _length - start) {
345 // cerr << "too close to end @ " << _length << " given " << start << " + " << cnt << endl;
346 cnt = _length - start;
347 framecnt_t old = npeaks;
348 npeaks = min ((framecnt_t) floor (cnt / samples_per_visual_peak), npeaks);
349 zero_fill = old - npeaks;
352 // cerr << "actual npeaks = " << npeaks << " zf = " << zero_fill << endl;
356 #ifdef DEBUG_READ_PEAKS
357 cerr << "RAW DATA\n";
359 /* no scaling at all, just get the sample data and duplicate it for
360 both max and min peak values.
363 Sample* raw_staging = new Sample[cnt];
365 if (read_unlocked (raw_staging, start, cnt) != cnt) {
366 error << _("cannot read sample data for unscaled peak computation") << endmsg;
370 for (framecnt_t i = 0; i < npeaks; ++i) {
371 peaks[i].max = raw_staging[i];
372 peaks[i].min = raw_staging[i];
375 delete peakfile_descriptor;
376 delete [] raw_staging;
382 off_t first_peak_byte = (start / samples_per_file_peak) * sizeof (PeakData);
384 /* open, read, close */
386 if ((peakfile_fd = peakfile_descriptor->allocate ()) < 0) {
387 error << string_compose(_("AudioSource: cannot open peakpath (a) \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
388 delete peakfile_descriptor;
392 #ifdef DEBUG_READ_PEAKS
393 cerr << "DIRECT PEAKS\n";
396 nread = ::pread (peakfile_fd, peaks, sizeof (PeakData)* npeaks, first_peak_byte);
397 delete peakfile_descriptor;
399 if (nread != sizeof (PeakData) * npeaks) {
400 cerr << "AudioSource["
402 << "]: cannot read peaks from peakfile! (read only "
412 delete peakfile_descriptor;
417 memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill);
420 delete peakfile_descriptor;
429 #ifdef DEBUG_READ_PEAKS
430 cerr << "DOWNSAMPLE\n";
434 - more frames-per-peak (lower resolution) than the peakfile, or to put it another way,
435 - less peaks than the peakfile holds for the same range
437 So, read a block into a staging area, and then downsample from there.
439 to avoid confusion, I'll refer to the requested peaks as visual_peaks and the peakfile peaks as stored_peaks
442 const framecnt_t chunksize = (framecnt_t) min (expected_peaks, 65536.0);
444 staging = new PeakData[chunksize];
446 /* compute the rounded up frame position */
448 framepos_t current_frame = start;
449 framepos_t current_stored_peak = (framepos_t) ceil (current_frame / (double) samples_per_file_peak);
450 framepos_t next_visual_peak = (framepos_t) ceil (current_frame / samples_per_visual_peak);
451 double next_visual_peak_frame = next_visual_peak * samples_per_visual_peak;
452 framepos_t stored_peak_before_next_visual_peak = (framepos_t) next_visual_peak_frame / samples_per_file_peak;
453 framecnt_t nvisual_peaks = 0;
454 framecnt_t stored_peaks_read = 0;
457 /* handle the case where the initial visual peak is on a pixel boundary */
459 current_stored_peak = min (current_stored_peak, stored_peak_before_next_visual_peak);
461 /* open ... close during out: handling */
463 if ((peakfile_fd = peakfile_descriptor->allocate ()) < 0) {
464 error << string_compose(_("AudioSource: cannot open peakpath (b) \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
465 delete peakfile_descriptor;
470 while (nvisual_peaks < npeaks) {
472 if (i == stored_peaks_read) {
474 uint32_t start_byte = current_stored_peak * sizeof(PeakData);
475 tnp = min ((framecnt_t)(_length/samples_per_file_peak - current_stored_peak), (framecnt_t) expected_peaks);
476 to_read = min (chunksize, tnp);
478 #ifdef DEBUG_READ_PEAKS
479 cerr << "read " << sizeof (PeakData) * to_read << " from peakfile @ " << start_byte << endl;
482 if ((nread = ::pread (peakfile_fd, staging, sizeof (PeakData) * to_read, start_byte))
483 != sizeof (PeakData) * to_read) {
485 off_t fend = lseek (peakfile_fd, 0, SEEK_END);
487 cerr << "AudioSource["
489 << "]: cannot read peak data from peakfile ("
490 << (nread / sizeof(PeakData))
491 << " peaks instead of "
496 << " at start_byte = " << start_byte
497 << " _length = " << _length << " versus len = " << fend
498 << " expected maxpeaks = " << (_length - current_frame)/samples_per_file_peak
499 << " npeaks was " << npeaks
505 stored_peaks_read = nread / sizeof(PeakData);
511 while ((i < stored_peaks_read) && (current_stored_peak <= stored_peak_before_next_visual_peak)) {
513 xmax = max (xmax, staging[i].max);
514 xmin = min (xmin, staging[i].min);
516 ++current_stored_peak;
520 peaks[nvisual_peaks].max = xmax;
521 peaks[nvisual_peaks].min = xmin;
525 //next_visual_peak_frame = min ((next_visual_peak * samples_per_visual_peak), (next_visual_peak_frame+samples_per_visual_peak) );
526 next_visual_peak_frame = min ((double) start+cnt, (next_visual_peak_frame+samples_per_visual_peak) );
527 stored_peak_before_next_visual_peak = (uint32_t) next_visual_peak_frame / samples_per_file_peak;
531 memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill);
538 #ifdef DEBUG_READ_PEAKS
539 cerr << "UPSAMPLE\n";
543 - less frames-per-peak (more resolution)
544 - more peaks than stored in the Peakfile
546 So, fetch data from the raw source, and generate peak
550 framecnt_t frames_read = 0;
551 framepos_t current_frame = start;
553 framecnt_t nvisual_peaks = 0;
554 framecnt_t chunksize = (framecnt_t) min (cnt, (framecnt_t) 4096);
555 raw_staging = new Sample[chunksize];
557 framepos_t frame_pos = start;
558 double pixel_pos = floor (frame_pos / samples_per_visual_peak);
559 double next_pixel_pos = ceil (frame_pos / samples_per_visual_peak);
560 double pixels_per_frame = 1.0 / samples_per_visual_peak;
565 while (nvisual_peaks < npeaks) {
567 if (i == frames_read) {
569 to_read = min (chunksize, (framecnt_t)(_length - current_frame));
571 if (current_frame >= _length) {
573 /* hmm, error condition - we've reached the end of the file
574 without generating all the peak data. cook up a zero-filled
575 data buffer and then use it. this is simpler than
576 adjusting zero_fill and npeaks and then breaking out of
580 memset (raw_staging, 0, sizeof (Sample) * chunksize);
584 to_read = min (chunksize, (_length - current_frame));
587 if ((frames_read = read_unlocked (raw_staging, current_frame, to_read)) == 0) {
588 error << string_compose(_("AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"),
589 _name, to_read, current_frame, _length, strerror (errno))
598 xmax = max (xmax, raw_staging[i]);
599 xmin = min (xmin, raw_staging[i]);
602 pixel_pos += pixels_per_frame;
604 if (pixel_pos >= next_pixel_pos) {
606 peaks[nvisual_peaks].max = xmax;
607 peaks[nvisual_peaks].min = xmin;
612 next_pixel_pos = ceil (pixel_pos + 0.5);
617 memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill);
624 delete peakfile_descriptor;
627 delete [] raw_staging;
629 #ifdef DEBUG_READ_PEAKS
636 #undef DEBUG_PEAK_BUILD
639 AudioSource::build_peaks_from_scratch ()
643 const framecnt_t bufsize = 65536; // 256kB per disk read for mono data is about ideal
648 /* hold lock while building peaks */
650 Glib::Mutex::Lock lp (_lock);
652 if (prepare_for_peakfile_writes ()) {
656 framepos_t current_frame = 0;
657 framecnt_t cnt = _length;
659 _peaks_built = false;
660 buf = new Sample[bufsize];
664 framecnt_t frames_to_read = min (bufsize, cnt);
665 framecnt_t frames_read;
667 if ((frames_read = read_unlocked (buf, current_frame, frames_to_read)) != frames_to_read) {
668 error << string_compose(_("%1: could not write read raw data for peak computation (%2)"), _name, strerror (errno)) << endmsg;
669 done_with_peakfile_writes (false);
673 if (compute_and_write_peaks (buf, current_frame, frames_read, true, false, _FPP)) {
677 current_frame += frames_read;
686 done_with_peakfile_writes ((cnt == 0));
690 Glib::Mutex::Lock lm (_peaks_ready_lock);
693 PeaksReady (); /* EMIT SIGNAL */
700 unlink (peakpath.c_str());
709 AudioSource::prepare_for_peakfile_writes ()
711 _peakfile_descriptor = new FdFileDescriptor (peakpath, true, 0664);
712 if ((_peakfile_fd = _peakfile_descriptor->allocate()) < 0) {
713 error << string_compose(_("AudioSource: cannot open peakpath (c) \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
720 AudioSource::done_with_peakfile_writes (bool done)
722 if (peak_leftover_cnt) {
723 compute_and_write_peaks (0, 0, 0, true, false, _FPP);
730 delete _peakfile_descriptor;
731 _peakfile_descriptor = 0;
735 AudioSource::compute_and_write_peaks (Sample* buf, framepos_t first_frame, framecnt_t cnt,
736 bool force, bool intermediate_peaks_ready)
738 return compute_and_write_peaks (buf, first_frame, cnt, force, intermediate_peaks_ready, _FPP);
742 AudioSource::compute_and_write_peaks (Sample* buf, framepos_t first_frame, framecnt_t cnt,
743 bool force, bool intermediate_peaks_ready, framecnt_t fpp)
747 uint32_t peaks_computed;
748 PeakData* peakbuf = 0;
750 framepos_t current_frame;
751 framecnt_t frames_done;
752 const size_t blocksize = (128 * 1024);
753 off_t first_peak_byte;
755 if (_peakfile_descriptor == 0) {
756 prepare_for_peakfile_writes ();
760 if (peak_leftover_cnt) {
762 if (first_frame != peak_leftover_frame + peak_leftover_cnt) {
764 /* uh-oh, ::seek() since the last ::compute_and_write_peaks(),
765 and we have leftovers. flush a single peak (since the leftovers
766 never represent more than that, and restart.
771 x.min = peak_leftovers[0];
772 x.max = peak_leftovers[0];
774 off_t byte = (peak_leftover_frame / fpp) * sizeof (PeakData);
776 if (::pwrite (_peakfile_fd, &x, sizeof (PeakData), byte) != sizeof (PeakData)) {
777 error << string_compose(_("%1: could not write peak file data (%2)"), _name, strerror (errno)) << endmsg;
781 _peak_byte_max = max (_peak_byte_max, (off_t) (byte + sizeof(PeakData)));
784 Glib::Mutex::Lock lm (_peaks_ready_lock);
785 PeakRangeReady (peak_leftover_frame, peak_leftover_cnt); /* EMIT SIGNAL */
786 if (intermediate_peaks_ready) {
787 PeaksReady (); /* EMIT SIGNAL */
791 /* left overs are done */
793 peak_leftover_cnt = 0;
797 /* else ... had leftovers, but they immediately preceed the new data, so just
798 merge them and compute.
801 /* make a new contiguous buffer containing leftovers and the new stuff */
803 to_do = cnt + peak_leftover_cnt;
804 buf2 = new Sample[to_do];
807 memcpy (buf2, peak_leftovers, peak_leftover_cnt * sizeof (Sample));
810 memcpy (buf2+peak_leftover_cnt, buf, cnt * sizeof (Sample));
812 /* no more leftovers */
813 peak_leftover_cnt = 0;
815 /* use the temporary buffer */
818 /* make sure that when we write into the peakfile, we startup where we left off */
820 first_frame = peak_leftover_frame;
826 peakbuf = new PeakData[(to_do/fpp)+1];
828 current_frame = first_frame;
833 /* if some frames were passed in (i.e. we're not flushing leftovers)
834 and there are less than fpp to do, save them till
838 if (force && (to_do < fpp)) {
839 /* keep the left overs around for next time */
841 if (peak_leftover_size < to_do) {
842 delete [] peak_leftovers;
843 peak_leftovers = new Sample[to_do];
844 peak_leftover_size = to_do;
846 memcpy (peak_leftovers, buf, to_do * sizeof (Sample));
847 peak_leftover_cnt = to_do;
848 peak_leftover_frame = current_frame;
855 framecnt_t this_time = min (fpp, to_do);
857 peakbuf[peaks_computed].max = buf[0];
858 peakbuf[peaks_computed].min = buf[0];
860 ARDOUR::find_peaks (buf+1, this_time-1, &peakbuf[peaks_computed].min, &peakbuf[peaks_computed].max);
865 frames_done += this_time;
866 current_frame += this_time;
869 first_peak_byte = (first_frame / fpp) * sizeof (PeakData);
871 if (can_truncate_peaks()) {
873 /* on some filesystems (ext3, at least) this helps to reduce fragmentation of
874 the peakfiles. its not guaranteed to do so, and even on ext3 (as of december 2006)
875 it does not cause single-extent allocation even for peakfiles of
876 less than BLOCKSIZE bytes. only call ftruncate if we'll make the file larger.
879 off_t endpos = lseek (_peakfile_fd, 0, SEEK_END);
880 off_t target_length = blocksize * ((first_peak_byte + blocksize + 1) / blocksize);
882 if (endpos < target_length) {
883 (void) ftruncate (_peakfile_fd, target_length);
884 /* error doesn't actually matter though, so continue on without testing */
888 if (::pwrite (_peakfile_fd, peakbuf, sizeof (PeakData) * peaks_computed, first_peak_byte) != (ssize_t) (sizeof (PeakData) * peaks_computed)) {
889 error << string_compose(_("%1: could not write peak file data (%2)"), _name, strerror (errno)) << endmsg;
893 _peak_byte_max = max (_peak_byte_max, (off_t) (first_peak_byte + sizeof(PeakData)*peaks_computed));
896 Glib::Mutex::Lock lm (_peaks_ready_lock);
897 PeakRangeReady (first_frame, frames_done); /* EMIT SIGNAL */
898 if (intermediate_peaks_ready) {
899 PeaksReady (); /* EMIT SIGNAL */
913 AudioSource::truncate_peakfile ()
915 if (_peakfile_descriptor == 0) {
916 error << string_compose (_("programming error: %1"), "AudioSource::truncate_peakfile() called without open peakfile descriptor")
921 /* truncate the peakfile down to its natural length if necessary */
923 off_t end = lseek (_peakfile_fd, 0, SEEK_END);
925 if (end > _peak_byte_max) {
926 (void) ftruncate (_peakfile_fd, _peak_byte_max);
931 AudioSource::available_peaks (double zoom_factor) const
933 if (zoom_factor < _FPP) {
934 return length(_timeline_position); // peak data will come from the audio file
937 /* peak data comes from peakfile, but the filesize might not represent
938 the valid data due to ftruncate optimizations, so use _peak_byte_max state.
939 XXX - there might be some atomicity issues here, we should probably add a lock,
940 but _peak_byte_max only monotonically increases after initialization.
943 off_t end = _peak_byte_max;
945 return (end/sizeof(PeakData)) * _FPP;