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)
66 _write_data_count = 0;
67 peak_leftover_cnt = 0;
68 peak_leftover_size = 0;
72 AudioSource::AudioSource (Session& s, const XMLNode& node)
81 _write_data_count = 0;
82 peak_leftover_cnt = 0;
83 peak_leftover_size = 0;
86 if (set_state (node)) {
87 throw failed_constructor();
91 AudioSource::~AudioSource ()
93 /* shouldn't happen but make sure we don't leak file descriptors anyway */
95 if (peak_leftover_cnt) {
96 cerr << "AudioSource destroyed with leftover peak data pending" << endl;
103 delete [] peak_leftovers;
107 AudioSource::get_state ()
109 XMLNode& node (Source::get_state());
111 if (_captured_for.length()) {
112 node.add_property ("captured-for", _captured_for);
119 AudioSource::set_state (const XMLNode& node)
121 const XMLProperty* prop;
123 if ((prop = node.property ("captured-for")) != 0) {
124 _captured_for = prop->value();
131 AudioSource::length (sframes_t pos) const
137 AudioSource::update_length (sframes_t pos, sframes_t cnt)
139 if (pos + cnt > _length) {
145 /***********************************************************************
147 ***********************************************************************/
150 AudioSource::peaks_ready (sigc::slot<void> the_slot, sigc::connection& conn) const
153 Glib::Mutex::Lock lm (_peaks_ready_lock);
155 /* check to see if the peak data is ready. if not
156 connect the slot while still holding the lock.
159 if (!(ret = _peaks_built)) {
160 conn = PeaksReady.connect (the_slot);
167 AudioSource::touch_peakfile ()
171 if (stat (peakpath.c_str(), &statbuf) != 0 || statbuf.st_size == 0) {
177 tbuf.actime = statbuf.st_atime;
178 tbuf.modtime = time ((time_t) 0);
180 utime (peakpath.c_str(), &tbuf);
184 AudioSource::rename_peakfile (ustring newpath)
186 /* caller must hold _lock */
188 ustring oldpath = peakpath;
190 if (access (oldpath.c_str(), F_OK) == 0) {
191 if (rename (oldpath.c_str(), newpath.c_str()) != 0) {
192 error << string_compose (_("cannot rename peakfile for %1 from %2 to %3 (%4)"), _name, oldpath, newpath, strerror (errno)) << endmsg;
203 AudioSource::initialize_peakfile (bool newfile, ustring audio_path)
207 peakpath = peak_path (audio_path);
209 /* if the peak file should be there, but isn't .... */
211 if (!newfile && !Glib::file_test (peakpath.c_str(), Glib::FILE_TEST_EXISTS)) {
212 peakpath = find_broken_peakfile (peakpath, audio_path);
215 if (stat (peakpath.c_str(), &statbuf)) {
216 if (errno != ENOENT) {
217 /* it exists in the peaks dir, but there is some kind of error */
219 error << string_compose(_("AudioSource: cannot stat peakfile \"%1\""), peakpath) << endmsg;
223 /* peakfile does not exist */
225 _peaks_built = false;
229 /* we found it in the peaks dir, so check it out */
231 if (statbuf.st_size == 0 || ((nframes_t) statbuf.st_size < ((length(_timeline_position) / _FPP) * sizeof (PeakData)))) {
233 _peaks_built = false;
235 // Check if the audio file has changed since the peakfile was built.
236 struct stat stat_file;
237 int err = stat (audio_path.c_str(), &stat_file);
240 _peaks_built = false;
244 /* allow 6 seconds slop on checking peak vs. file times because of various
248 if (stat_file.st_mtime > statbuf.st_mtime && (stat_file.st_mtime - statbuf.st_mtime > 6)) {
249 _peaks_built = false;
253 _peak_byte_max = statbuf.st_size;
259 if (!newfile && !_peaks_built && _build_missing_peakfiles && _build_peakfiles) {
260 build_peaks_from_scratch ();
267 AudioSource::read (Sample *dst, sframes_t start, nframes_t cnt, int channel) const
269 Glib::Mutex::Lock lm (_lock);
270 return read_unlocked (dst, start, cnt);
274 AudioSource::write (Sample *dst, nframes_t cnt)
276 Glib::Mutex::Lock lm (_lock);
277 return write_unlocked (dst, cnt);
281 AudioSource::read_peaks (PeakData *peaks, nframes_t npeaks, sframes_t start, nframes_t cnt, double samples_per_visual_peak) const
283 return read_peaks_with_fpp (peaks, npeaks, start, cnt, samples_per_visual_peak, _FPP);
287 AudioSource::read_peaks_with_fpp (PeakData *peaks, nframes_t npeaks, sframes_t start, nframes_t cnt,
288 double samples_per_visual_peak, nframes_t samples_per_file_peak) const
290 Glib::Mutex::Lock lm (_lock);
292 double expected_peaks;
293 PeakData::PeakDatum xmax;
294 PeakData::PeakDatum xmin;
297 nframes_t zero_fill = 0;
299 PeakData* staging = 0;
300 Sample* raw_staging = 0;
303 expected_peaks = (cnt / (double) samples_per_file_peak);
304 scale = npeaks/expected_peaks;
306 #undef DEBUG_READ_PEAKS
307 #ifdef DEBUG_READ_PEAKS
308 cerr << "======>RP: npeaks = " << npeaks
309 << " start = " << start
311 << " len = " << _length
312 << " samples_per_visual_peak =" << samples_per_visual_peak
313 << " expected was " << expected_peaks << " ... scale = " << scale
314 << " PD ptr = " << peaks
319 /* fix for near-end-of-file conditions */
321 if (cnt > _length - start) {
322 // cerr << "too close to end @ " << _length << " given " << start << " + " << cnt << endl;
323 cnt = _length - start;
324 nframes_t old = npeaks;
325 npeaks = min ((nframes_t) floor (cnt / samples_per_visual_peak), npeaks);
326 zero_fill = old - npeaks;
329 // cerr << "actual npeaks = " << npeaks << " zf = " << zero_fill << endl;
333 #ifdef DEBUG_READ_PEAKS
334 cerr << "RAW DATA\n";
336 /* no scaling at all, just get the sample data and duplicate it for
337 both max and min peak values.
340 Sample* raw_staging = new Sample[cnt];
342 if (read_unlocked (raw_staging, start, cnt) != cnt) {
343 error << _("cannot read sample data for unscaled peak computation") << endmsg;
347 for (nframes_t i = 0; i < npeaks; ++i) {
348 peaks[i].max = raw_staging[i];
349 peaks[i].min = raw_staging[i];
352 delete [] raw_staging;
358 off_t first_peak_byte = (start / samples_per_file_peak) * sizeof (PeakData);
360 /* open, read, close */
362 if ((_peakfile = ::open (peakpath.c_str(), O_RDONLY, 0664)) < 0) {
363 error << string_compose(_("AudioSource: cannot open peakpath (a) \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
367 #ifdef DEBUG_READ_PEAKS
368 cerr << "DIRECT PEAKS\n";
371 nread = ::pread (_peakfile, peaks, sizeof (PeakData)* npeaks, first_peak_byte);
374 if (nread != sizeof (PeakData) * npeaks) {
375 cerr << "AudioSource["
377 << "]: cannot read peaks from peakfile! (read only "
391 memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill);
402 #ifdef DEBUG_READ_PEAKS
403 cerr << "DOWNSAMPLE\n";
407 - more frames-per-peak (lower resolution) than the peakfile, or to put it another way,
408 - less peaks than the peakfile holds for the same range
410 So, read a block into a staging area, and then downsample from there.
412 to avoid confusion, I'll refer to the requested peaks as visual_peaks and the peakfile peaks as stored_peaks
415 const uint32_t chunksize = (uint32_t) min (expected_peaks, 65536.0);
417 staging = new PeakData[chunksize];
419 /* compute the rounded up frame position */
421 nframes_t current_frame = start;
422 nframes_t current_stored_peak = (nframes_t) ceil (current_frame / (double) samples_per_file_peak);
423 uint32_t next_visual_peak = (uint32_t) ceil (current_frame / samples_per_visual_peak);
424 double next_visual_peak_frame = next_visual_peak * samples_per_visual_peak;
425 uint32_t stored_peak_before_next_visual_peak = (nframes_t) next_visual_peak_frame / samples_per_file_peak;
426 uint32_t nvisual_peaks = 0;
427 uint32_t stored_peaks_read = 0;
430 /* handle the case where the initial visual peak is on a pixel boundary */
432 current_stored_peak = min (current_stored_peak, stored_peak_before_next_visual_peak);
434 /* open ... close during out: handling */
436 if ((_peakfile = ::open (peakpath.c_str(), O_RDONLY, 0664)) < 0) {
437 error << string_compose(_("AudioSource: cannot open peakpath (b) \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
441 while (nvisual_peaks < npeaks) {
443 if (i == stored_peaks_read) {
445 uint32_t start_byte = current_stored_peak * sizeof(PeakData);
446 tnp = min ((nframes_t)(_length/samples_per_file_peak - current_stored_peak), (nframes_t) expected_peaks);
447 to_read = min (chunksize, tnp);
449 #ifdef DEBUG_READ_PEAKS
450 cerr << "read " << sizeof (PeakData) * to_read << " from peakfile @ " << start_byte << endl;
453 if ((nread = ::pread (_peakfile, staging, sizeof (PeakData) * to_read, start_byte))
454 != sizeof (PeakData) * to_read) {
456 off_t fend = lseek (_peakfile, 0, SEEK_END);
458 cerr << "AudioSource["
460 << "]: cannot read peak data from peakfile ("
461 << (nread / sizeof(PeakData))
462 << " peaks instead of "
467 << " at start_byte = " << start_byte
468 << " _length = " << _length << " versus len = " << fend
469 << " expected maxpeaks = " << (_length - current_frame)/samples_per_file_peak
470 << " npeaks was " << npeaks
476 stored_peaks_read = nread / sizeof(PeakData);
482 while ((i < stored_peaks_read) && (current_stored_peak <= stored_peak_before_next_visual_peak)) {
484 xmax = max (xmax, staging[i].max);
485 xmin = min (xmin, staging[i].min);
487 ++current_stored_peak;
491 peaks[nvisual_peaks].max = xmax;
492 peaks[nvisual_peaks].min = xmin;
496 //next_visual_peak_frame = min ((next_visual_peak * samples_per_visual_peak), (next_visual_peak_frame+samples_per_visual_peak) );
497 next_visual_peak_frame = min ((double) start+cnt, (next_visual_peak_frame+samples_per_visual_peak) );
498 stored_peak_before_next_visual_peak = (uint32_t) next_visual_peak_frame / samples_per_file_peak;
502 memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill);
509 #ifdef DEBUG_READ_PEAKS
510 cerr << "UPSAMPLE\n";
514 - less frames-per-peak (more resolution)
515 - more peaks than stored in the Peakfile
517 So, fetch data from the raw source, and generate peak
521 nframes_t frames_read = 0;
522 nframes_t current_frame = start;
524 nframes_t nvisual_peaks = 0;
525 nframes_t chunksize = (nframes_t) min (cnt, (nframes_t) 4096);
526 raw_staging = new Sample[chunksize];
528 nframes_t frame_pos = start;
529 double pixel_pos = floor (frame_pos / samples_per_visual_peak);
530 double next_pixel_pos = ceil (frame_pos / samples_per_visual_peak);
531 double pixels_per_frame = 1.0 / samples_per_visual_peak;
536 while (nvisual_peaks < npeaks) {
538 if (i == frames_read) {
540 to_read = min (chunksize, nframes_t(_length - current_frame));
543 /* XXX ARGH .. out by one error ... need to figure out why this happens
544 and fix it rather than do this band-aid move.
546 zero_fill = npeaks - nvisual_peaks;
550 if ((frames_read = read_unlocked (raw_staging, current_frame, to_read)) == 0) {
551 error << string_compose(_("AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"),
552 _name, to_read, current_frame, _length, strerror (errno))
560 xmax = max (xmax, raw_staging[i]);
561 xmin = min (xmin, raw_staging[i]);
564 pixel_pos += pixels_per_frame;
566 if (pixel_pos >= next_pixel_pos) {
568 peaks[nvisual_peaks].max = xmax;
569 peaks[nvisual_peaks].min = xmin;
574 next_pixel_pos = ceil (pixel_pos + 0.5);
579 memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill);
586 if (_peakfile >= 0) {
591 delete [] raw_staging;
593 #ifdef DEBUG_READ_PEAKS
600 #undef DEBUG_PEAK_BUILD
603 AudioSource::build_peaks_from_scratch ()
605 nframes_t current_frame;
608 nframes_t frames_read;
609 nframes_t frames_to_read;
610 const nframes_t bufsize = 65536; // 256kB per disk read for mono data is about ideal
615 /* hold lock while building peaks */
617 Glib::Mutex::Lock lp (_lock);
619 if (prepare_for_peakfile_writes ()) {
625 _peaks_built = false;
626 buf = new Sample[bufsize];
630 frames_to_read = min (bufsize, cnt);
632 if ((frames_read = read_unlocked (buf, current_frame, frames_to_read)) != frames_to_read) {
633 error << string_compose(_("%1: could not write read raw data for peak computation (%2)"), _name, strerror (errno)) << endmsg;
634 done_with_peakfile_writes (false);
638 if (compute_and_write_peaks (buf, current_frame, frames_read, true, false, _FPP)) {
642 current_frame += frames_read;
651 done_with_peakfile_writes ((cnt == 0));
655 Glib::Mutex::Lock lm (_peaks_ready_lock);
658 PeaksReady (); /* EMIT SIGNAL */
665 unlink (peakpath.c_str());
674 AudioSource::prepare_for_peakfile_writes ()
676 if ((peakfile = ::open (peakpath.c_str(), O_RDWR|O_CREAT, 0664)) < 0) {
677 error << string_compose(_("AudioSource: cannot open peakpath (c) \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
684 AudioSource::done_with_peakfile_writes (bool done)
686 if (peak_leftover_cnt) {
687 compute_and_write_peaks (0, 0, 0, true, false, _FPP);
701 AudioSource::compute_and_write_peaks (Sample* buf, sframes_t first_frame, nframes_t cnt,
702 bool force, bool intermediate_peaks_ready)
704 return compute_and_write_peaks (buf, first_frame, cnt, force, intermediate_peaks_ready, _FPP);
708 AudioSource::compute_and_write_peaks (Sample* buf, sframes_t first_frame, nframes_t cnt,
709 bool force, bool intermediate_peaks_ready, nframes_t fpp)
713 uint32_t peaks_computed;
714 PeakData* peakbuf = 0;
716 nframes_t current_frame;
717 nframes_t frames_done;
718 const size_t blocksize = (128 * 1024);
719 off_t first_peak_byte;
722 prepare_for_peakfile_writes ();
726 if (peak_leftover_cnt) {
728 if (first_frame != peak_leftover_frame + peak_leftover_cnt) {
730 /* uh-oh, ::seek() since the last ::compute_and_write_peaks(),
731 and we have leftovers. flush a single peak (since the leftovers
732 never represent more than that, and restart.
737 x.min = peak_leftovers[0];
738 x.max = peak_leftovers[0];
740 off_t byte = (peak_leftover_frame / fpp) * sizeof (PeakData);
742 if (::pwrite (peakfile, &x, sizeof (PeakData), byte) != sizeof (PeakData)) {
743 error << string_compose(_("%1: could not write peak file data (%2)"), _name, strerror (errno)) << endmsg;
747 _peak_byte_max = max (_peak_byte_max, (off_t) (byte + sizeof(PeakData)));
750 Glib::Mutex::Lock lm (_peaks_ready_lock);
751 PeakRangeReady (peak_leftover_frame, peak_leftover_cnt); /* EMIT SIGNAL */
752 if (intermediate_peaks_ready) {
753 PeaksReady (); /* EMIT SIGNAL */
757 /* left overs are done */
759 peak_leftover_cnt = 0;
763 /* else ... had leftovers, but they immediately preceed the new data, so just
764 merge them and compute.
767 /* make a new contiguous buffer containing leftovers and the new stuff */
769 to_do = cnt + peak_leftover_cnt;
770 buf2 = new Sample[to_do];
773 memcpy (buf2, peak_leftovers, peak_leftover_cnt * sizeof (Sample));
776 memcpy (buf2+peak_leftover_cnt, buf, cnt * sizeof (Sample));
778 /* no more leftovers */
779 peak_leftover_cnt = 0;
781 /* use the temporary buffer */
784 /* make sure that when we write into the peakfile, we startup where we left off */
786 first_frame = peak_leftover_frame;
792 peakbuf = new PeakData[(to_do/fpp)+1];
794 current_frame = first_frame;
799 /* if some frames were passed in (i.e. we're not flushing leftovers)
800 and there are less than fpp to do, save them till
804 if (force && (to_do < fpp)) {
805 /* keep the left overs around for next time */
807 if (peak_leftover_size < to_do) {
808 delete [] peak_leftovers;
809 peak_leftovers = new Sample[to_do];
810 peak_leftover_size = to_do;
812 memcpy (peak_leftovers, buf, to_do * sizeof (Sample));
813 peak_leftover_cnt = to_do;
814 peak_leftover_frame = current_frame;
821 nframes_t this_time = min (fpp, to_do);
823 peakbuf[peaks_computed].max = buf[0];
824 peakbuf[peaks_computed].min = buf[0];
826 ARDOUR::find_peaks (buf+1, this_time-1, &peakbuf[peaks_computed].min, &peakbuf[peaks_computed].max);
831 frames_done += this_time;
832 current_frame += this_time;
835 first_peak_byte = (first_frame / fpp) * sizeof (PeakData);
837 if (can_truncate_peaks()) {
839 /* on some filesystems (ext3, at least) this helps to reduce fragmentation of
840 the peakfiles. its not guaranteed to do so, and even on ext3 (as of december 2006)
841 it does not cause single-extent allocation even for peakfiles of
842 less than BLOCKSIZE bytes. only call ftruncate if we'll make the file larger.
845 off_t endpos = lseek (peakfile, 0, SEEK_END);
846 off_t target_length = blocksize * ((first_peak_byte + blocksize + 1) / blocksize);
848 if (endpos < target_length) {
849 ftruncate (peakfile, target_length);
850 /* error doesn't actually matter though, so continue on without testing */
854 if (::pwrite (peakfile, peakbuf, sizeof (PeakData) * peaks_computed, first_peak_byte) != (ssize_t) (sizeof (PeakData) * peaks_computed)) {
855 error << string_compose(_("%1: could not write peak file data (%2)"), _name, strerror (errno)) << endmsg;
859 _peak_byte_max = max (_peak_byte_max, (off_t) (first_peak_byte + sizeof(PeakData)*peaks_computed));
862 Glib::Mutex::Lock lm (_peaks_ready_lock);
863 PeakRangeReady (first_frame, frames_done); /* EMIT SIGNAL */
864 if (intermediate_peaks_ready) {
865 PeaksReady (); /* EMIT SIGNAL */
879 AudioSource::truncate_peakfile ()
882 error << string_compose (_("programming error: %1"), "AudioSource::truncate_peakfile() called without open peakfile descriptor")
887 /* truncate the peakfile down to its natural length if necessary */
889 off_t end = lseek (peakfile, 0, SEEK_END);
891 if (end > _peak_byte_max) {
892 ftruncate (peakfile, _peak_byte_max);
897 AudioSource::file_changed (ustring path)
899 struct stat stat_file;
900 struct stat stat_peak;
902 int e1 = stat (path.c_str(), &stat_file);
903 int e2 = stat (peak_path(path).c_str(), &stat_peak);
905 if (!e1 && !e2 && stat_file.st_mtime > stat_peak.st_mtime){
913 AudioSource::available_peaks (double zoom_factor) const
915 if (zoom_factor < _FPP) {
916 return length(_timeline_position); // peak data will come from the audio file
919 /* peak data comes from peakfile, but the filesize might not represent
920 the valid data due to ftruncate optimizations, so use _peak_byte_max state.
921 XXX - there might be some atomicity issues here, we should probably add a lock,
922 but _peak_byte_max only monotonically increases after initialization.
925 off_t end = _peak_byte_max;
927 return (end/sizeof(PeakData)) * _FPP;