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, name, DataType::AUDIO)
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 Source::set_state (node);
123 if ((prop = node.property ("captured-for")) != 0) {
124 _captured_for = prop->value();
130 /***********************************************************************
132 ***********************************************************************/
135 AudioSource::peaks_ready (sigc::slot<void> the_slot, sigc::connection& conn) const
138 Glib::Mutex::Lock lm (_peaks_ready_lock);
140 /* check to see if the peak data is ready. if not
141 connect the slot while still holding the lock.
144 if (!(ret = _peaks_built)) {
145 conn = PeaksReady.connect (the_slot);
152 AudioSource::touch_peakfile ()
156 if (stat (peakpath.c_str(), &statbuf) != 0 || statbuf.st_size == 0) {
162 tbuf.actime = statbuf.st_atime;
163 tbuf.modtime = time ((time_t) 0);
165 utime (peakpath.c_str(), &tbuf);
169 AudioSource::rename_peakfile (ustring newpath)
171 /* caller must hold _lock */
173 ustring oldpath = peakpath;
175 if (access (oldpath.c_str(), F_OK) == 0) {
176 if (rename (oldpath.c_str(), newpath.c_str()) != 0) {
177 error << string_compose (_("cannot rename peakfile for %1 from %2 to %3 (%4)"), _name, oldpath, newpath, strerror (errno)) << endmsg;
188 AudioSource::initialize_peakfile (bool newfile, ustring audio_path)
192 peakpath = peak_path (audio_path);
194 /* if the peak file should be there, but isn't .... */
196 if (!newfile && !Glib::file_test (peakpath.c_str(), Glib::FILE_TEST_EXISTS)) {
197 peakpath = find_broken_peakfile (peakpath, audio_path);
200 if (stat (peakpath.c_str(), &statbuf)) {
201 if (errno != ENOENT) {
202 /* it exists in the peaks dir, but there is some kind of error */
204 error << string_compose(_("AudioSource: cannot stat peakfile \"%1\""), peakpath) << endmsg;
208 /* peakfile does not exist */
210 _peaks_built = false;
214 /* we found it in the peaks dir, so check it out */
216 if (statbuf.st_size == 0 || ((nframes_t) statbuf.st_size < ((length() / _FPP) * sizeof (PeakData)))) {
218 _peaks_built = false;
220 // Check if the audio file has changed since the peakfile was built.
221 struct stat stat_file;
222 int err = stat (audio_path.c_str(), &stat_file);
225 _peaks_built = false;
229 /* allow 6 seconds slop on checking peak vs. file times because of various
233 if (stat_file.st_mtime > statbuf.st_mtime && (stat_file.st_mtime - statbuf.st_mtime > 6)) {
234 _peaks_built = false;
238 _peak_byte_max = statbuf.st_size;
244 if (!newfile && !_peaks_built && _build_missing_peakfiles && _build_peakfiles) {
245 build_peaks_from_scratch ();
252 AudioSource::read (Sample *dst, nframes_t start, nframes_t cnt) const
254 Glib::Mutex::Lock lm (_lock);
255 return read_unlocked (dst, start, cnt);
259 AudioSource::write (Sample *dst, nframes_t cnt)
261 Glib::Mutex::Lock lm (_lock);
262 return write_unlocked (dst, cnt);
266 AudioSource::read_peaks (PeakData *peaks, nframes_t npeaks, nframes_t start, nframes_t cnt, double samples_per_visual_peak) const
268 return read_peaks_with_fpp (peaks, npeaks, start, cnt, samples_per_visual_peak, _FPP);
272 AudioSource::read_peaks_with_fpp (PeakData *peaks, nframes_t npeaks, nframes_t start, nframes_t cnt,
273 double samples_per_visual_peak, nframes_t samples_per_file_peak) const
275 Glib::Mutex::Lock lm (_lock);
277 double expected_peaks;
278 PeakData::PeakDatum xmax;
279 PeakData::PeakDatum xmin;
282 nframes_t zero_fill = 0;
284 PeakData* staging = 0;
285 Sample* raw_staging = 0;
288 expected_peaks = (cnt / (double) samples_per_file_peak);
289 scale = npeaks/expected_peaks;
291 #undef DEBUG_READ_PEAKS
292 #ifdef DEBUG_READ_PEAKS
293 cerr << "======>RP: npeaks = " << npeaks
294 << " start = " << start
296 << " len = " << _length
297 << " samples_per_visual_peak =" << samples_per_visual_peak
298 << " expected was " << expected_peaks << " ... scale = " << scale
299 << " PD ptr = " << peaks
304 /* fix for near-end-of-file conditions */
306 if (cnt > _length - start) {
307 // cerr << "too close to end @ " << _length << " given " << start << " + " << cnt << endl;
308 cnt = _length - start;
309 nframes_t old = npeaks;
310 npeaks = min ((nframes_t) floor (cnt / samples_per_visual_peak), npeaks);
311 zero_fill = old - npeaks;
314 // cerr << "actual npeaks = " << npeaks << " zf = " << zero_fill << endl;
318 #ifdef DEBUG_READ_PEAKS
319 cerr << "RAW DATA\n";
321 /* no scaling at all, just get the sample data and duplicate it for
322 both max and min peak values.
325 Sample* raw_staging = new Sample[cnt];
327 if (read_unlocked (raw_staging, start, cnt) != cnt) {
328 error << _("cannot read sample data for unscaled peak computation") << endmsg;
332 for (nframes_t i = 0; i < npeaks; ++i) {
333 peaks[i].max = raw_staging[i];
334 peaks[i].min = raw_staging[i];
337 delete [] raw_staging;
343 off_t first_peak_byte = (start / samples_per_file_peak) * sizeof (PeakData);
345 /* open, read, close */
347 if ((_peakfile = ::open (peakpath.c_str(), O_RDONLY, 0664)) < 0) {
348 error << string_compose(_("AudioSource: cannot open peakpath (a) \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
352 #ifdef DEBUG_READ_PEAKS
353 cerr << "DIRECT PEAKS\n";
356 nread = ::pread (_peakfile, peaks, sizeof (PeakData)* npeaks, first_peak_byte);
359 if (nread != sizeof (PeakData) * npeaks) {
360 cerr << "AudioSource["
362 << "]: cannot read peaks from peakfile! (read only "
376 memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill);
387 #ifdef DEBUG_READ_PEAKS
388 cerr << "DOWNSAMPLE\n";
392 - more frames-per-peak (lower resolution) than the peakfile, or to put it another way,
393 - less peaks than the peakfile holds for the same range
395 So, read a block into a staging area, and then downsample from there.
397 to avoid confusion, I'll refer to the requested peaks as visual_peaks and the peakfile peaks as stored_peaks
400 const uint32_t chunksize = (uint32_t) min (expected_peaks, 65536.0);
402 staging = new PeakData[chunksize];
404 /* compute the rounded up frame position */
406 nframes_t current_frame = start;
407 nframes_t current_stored_peak = (nframes_t) ceil (current_frame / (double) samples_per_file_peak);
408 uint32_t next_visual_peak = (uint32_t) ceil (current_frame / samples_per_visual_peak);
409 double next_visual_peak_frame = next_visual_peak * samples_per_visual_peak;
410 uint32_t stored_peak_before_next_visual_peak = (nframes_t) next_visual_peak_frame / samples_per_file_peak;
411 uint32_t nvisual_peaks = 0;
412 uint32_t stored_peaks_read = 0;
415 /* handle the case where the initial visual peak is on a pixel boundary */
417 current_stored_peak = min (current_stored_peak, stored_peak_before_next_visual_peak);
419 /* open ... close during out: handling */
421 if ((_peakfile = ::open (peakpath.c_str(), O_RDONLY, 0664)) < 0) {
422 error << string_compose(_("AudioSource: cannot open peakpath (b) \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
426 while (nvisual_peaks < npeaks) {
428 if (i == stored_peaks_read) {
430 uint32_t start_byte = current_stored_peak * sizeof(PeakData);
431 tnp = min ((_length/samples_per_file_peak - current_stored_peak), (nframes_t) expected_peaks);
432 to_read = min (chunksize, tnp);
434 #ifdef DEBUG_READ_PEAKS
435 cerr << "read " << sizeof (PeakData) * to_read << " from peakfile @ " << start_byte << endl;
438 if ((nread = ::pread (_peakfile, staging, sizeof (PeakData) * to_read, start_byte))
439 != sizeof (PeakData) * to_read) {
441 off_t fend = lseek (_peakfile, 0, SEEK_END);
443 cerr << "AudioSource["
445 << "]: cannot read peak data from peakfile ("
446 << (nread / sizeof(PeakData))
447 << " peaks instead of "
452 << " at start_byte = " << start_byte
453 << " _length = " << _length << " versus len = " << fend
454 << " expected maxpeaks = " << (_length - current_frame)/samples_per_file_peak
455 << " npeaks was " << npeaks
461 stored_peaks_read = nread / sizeof(PeakData);
467 while ((i < stored_peaks_read) && (current_stored_peak <= stored_peak_before_next_visual_peak)) {
469 xmax = max (xmax, staging[i].max);
470 xmin = min (xmin, staging[i].min);
472 ++current_stored_peak;
476 peaks[nvisual_peaks].max = xmax;
477 peaks[nvisual_peaks].min = xmin;
481 //next_visual_peak_frame = min ((next_visual_peak * samples_per_visual_peak), (next_visual_peak_frame+samples_per_visual_peak) );
482 next_visual_peak_frame = min ((double) start+cnt, (next_visual_peak_frame+samples_per_visual_peak) );
483 stored_peak_before_next_visual_peak = (uint32_t) next_visual_peak_frame / samples_per_file_peak;
487 memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill);
494 #ifdef DEBUG_READ_PEAKS
495 cerr << "UPSAMPLE\n";
499 - less frames-per-peak (more resolution)
500 - more peaks than stored in the Peakfile
502 So, fetch data from the raw source, and generate peak
506 nframes_t frames_read = 0;
507 nframes_t current_frame = start;
509 nframes_t nvisual_peaks = 0;
510 nframes_t chunksize = (nframes_t) min (cnt, (nframes_t) 4096);
511 raw_staging = new Sample[chunksize];
513 nframes_t frame_pos = start;
514 double pixel_pos = floor (frame_pos / samples_per_visual_peak);
515 double next_pixel_pos = ceil (frame_pos / samples_per_visual_peak);
516 double pixels_per_frame = 1.0 / samples_per_visual_peak;
521 while (nvisual_peaks < npeaks) {
523 if (i == frames_read) {
525 to_read = min (chunksize, (_length - current_frame));
528 /* XXX ARGH .. out by one error ... need to figure out why this happens
529 and fix it rather than do this band-aid move.
531 zero_fill = npeaks - nvisual_peaks;
535 if ((frames_read = read_unlocked (raw_staging, current_frame, to_read)) == 0) {
536 error << string_compose(_("AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"),
537 _name, to_read, current_frame, _length, strerror (errno))
545 xmax = max (xmax, raw_staging[i]);
546 xmin = min (xmin, raw_staging[i]);
549 pixel_pos += pixels_per_frame;
551 if (pixel_pos >= next_pixel_pos) {
553 peaks[nvisual_peaks].max = xmax;
554 peaks[nvisual_peaks].min = xmin;
559 next_pixel_pos = ceil (pixel_pos + 0.5);
564 memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill);
571 if (_peakfile >= 0) {
576 delete [] raw_staging;
578 #ifdef DEBUG_READ_PEAKS
585 #undef DEBUG_PEAK_BUILD
588 AudioSource::build_peaks_from_scratch ()
590 nframes_t current_frame;
593 nframes_t frames_read;
594 nframes_t frames_to_read;
595 const nframes_t bufsize = 65536; // 256kB per disk read for mono data is about ideal
600 /* hold lock while building peaks */
602 Glib::Mutex::Lock lp (_lock);
604 if (prepare_for_peakfile_writes ()) {
610 _peaks_built = false;
611 buf = new Sample[bufsize];
615 frames_to_read = min (bufsize, cnt);
617 if ((frames_read = read_unlocked (buf, current_frame, frames_to_read)) != frames_to_read) {
618 error << string_compose(_("%1: could not write read raw data for peak computation (%2)"), _name, strerror (errno)) << endmsg;
619 done_with_peakfile_writes (false);
623 if (compute_and_write_peaks (buf, current_frame, frames_read, true, false, _FPP)) {
627 current_frame += frames_read;
636 done_with_peakfile_writes ((cnt == 0));
640 Glib::Mutex::Lock lm (_peaks_ready_lock);
643 PeaksReady (); /* EMIT SIGNAL */
650 unlink (peakpath.c_str());
659 AudioSource::prepare_for_peakfile_writes ()
661 if ((peakfile = ::open (peakpath.c_str(), O_RDWR|O_CREAT, 0664)) < 0) {
662 error << string_compose(_("AudioSource: cannot open peakpath (c) \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
669 AudioSource::done_with_peakfile_writes (bool done)
671 if (peak_leftover_cnt) {
672 compute_and_write_peaks (0, 0, 0, true, false, _FPP);
686 AudioSource::compute_and_write_peaks (Sample* buf, nframes_t first_frame, nframes_t cnt, bool force, bool intermediate_peaks_ready)
688 return compute_and_write_peaks (buf, first_frame, cnt, force, intermediate_peaks_ready, _FPP);
692 AudioSource::compute_and_write_peaks (Sample* buf, nframes_t first_frame, nframes_t cnt, bool force,
693 bool intermediate_peaks_ready, nframes_t fpp)
697 uint32_t peaks_computed;
698 PeakData* peakbuf = 0;
700 nframes_t current_frame;
701 nframes_t frames_done;
702 const size_t blocksize = (128 * 1024);
703 off_t first_peak_byte;
706 prepare_for_peakfile_writes ();
710 if (peak_leftover_cnt) {
712 if (first_frame != peak_leftover_frame + peak_leftover_cnt) {
714 /* uh-oh, ::seek() since the last ::compute_and_write_peaks(),
715 and we have leftovers. flush a single peak (since the leftovers
716 never represent more than that, and restart.
721 x.min = peak_leftovers[0];
722 x.max = peak_leftovers[0];
724 off_t byte = (peak_leftover_frame / fpp) * sizeof (PeakData);
726 if (::pwrite (peakfile, &x, sizeof (PeakData), byte) != sizeof (PeakData)) {
727 error << string_compose(_("%1: could not write peak file data (%2)"), _name, strerror (errno)) << endmsg;
731 _peak_byte_max = max (_peak_byte_max, (off_t) (byte + sizeof(PeakData)));
734 Glib::Mutex::Lock lm (_peaks_ready_lock);
735 PeakRangeReady (peak_leftover_frame, peak_leftover_cnt); /* EMIT SIGNAL */
736 if (intermediate_peaks_ready) {
737 PeaksReady (); /* EMIT SIGNAL */
741 /* left overs are done */
743 peak_leftover_cnt = 0;
747 /* else ... had leftovers, but they immediately preceed the new data, so just
748 merge them and compute.
751 /* make a new contiguous buffer containing leftovers and the new stuff */
753 to_do = cnt + peak_leftover_cnt;
754 buf2 = new Sample[to_do];
757 memcpy (buf2, peak_leftovers, peak_leftover_cnt * sizeof (Sample));
760 memcpy (buf2+peak_leftover_cnt, buf, cnt * sizeof (Sample));
762 /* no more leftovers */
763 peak_leftover_cnt = 0;
765 /* use the temporary buffer */
768 /* make sure that when we write into the peakfile, we startup where we left off */
770 first_frame = peak_leftover_frame;
776 peakbuf = new PeakData[(to_do/fpp)+1];
778 current_frame = first_frame;
783 /* if some frames were passed in (i.e. we're not flushing leftovers)
784 and there are less than fpp to do, save them till
788 if (force && (to_do < fpp)) {
789 /* keep the left overs around for next time */
791 if (peak_leftover_size < to_do) {
792 delete [] peak_leftovers;
793 peak_leftovers = new Sample[to_do];
794 peak_leftover_size = to_do;
796 memcpy (peak_leftovers, buf, to_do * sizeof (Sample));
797 peak_leftover_cnt = to_do;
798 peak_leftover_frame = current_frame;
805 nframes_t this_time = min (fpp, to_do);
807 peakbuf[peaks_computed].max = buf[0];
808 peakbuf[peaks_computed].min = buf[0];
810 ARDOUR::find_peaks (buf+1, this_time-1, &peakbuf[peaks_computed].min, &peakbuf[peaks_computed].max);
815 frames_done += this_time;
816 current_frame += this_time;
819 first_peak_byte = (first_frame / fpp) * sizeof (PeakData);
821 if (can_truncate_peaks()) {
823 /* on some filesystems (ext3, at least) this helps to reduce fragmentation of
824 the peakfiles. its not guaranteed to do so, and even on ext3 (as of december 2006)
825 it does not cause single-extent allocation even for peakfiles of
826 less than BLOCKSIZE bytes. only call ftruncate if we'll make the file larger.
829 off_t endpos = lseek (peakfile, 0, SEEK_END);
830 off_t target_length = blocksize * ((first_peak_byte + blocksize + 1) / blocksize);
832 if (endpos < target_length) {
833 ftruncate (peakfile, target_length);
834 /* error doesn't actually matter though, so continue on without testing */
838 if (::pwrite (peakfile, peakbuf, sizeof (PeakData) * peaks_computed, first_peak_byte) != (ssize_t) (sizeof (PeakData) * peaks_computed)) {
839 error << string_compose(_("%1: could not write peak file data (%2)"), _name, strerror (errno)) << endmsg;
843 _peak_byte_max = max (_peak_byte_max, (off_t) (first_peak_byte + sizeof(PeakData)*peaks_computed));
846 Glib::Mutex::Lock lm (_peaks_ready_lock);
847 PeakRangeReady (first_frame, frames_done); /* EMIT SIGNAL */
848 if (intermediate_peaks_ready) {
849 PeaksReady (); /* EMIT SIGNAL */
863 AudioSource::truncate_peakfile ()
866 error << string_compose (_("programming error: %1"), "AudioSource::truncate_peakfile() called without open peakfile descriptor")
871 /* truncate the peakfile down to its natural length if necessary */
873 off_t end = lseek (peakfile, 0, SEEK_END);
875 if (end > _peak_byte_max) {
876 ftruncate (peakfile, _peak_byte_max);
881 AudioSource::file_changed (ustring path)
883 struct stat stat_file;
884 struct stat stat_peak;
886 int e1 = stat (path.c_str(), &stat_file);
887 int e2 = stat (peak_path(path).c_str(), &stat_peak);
889 if (!e1 && !e2 && stat_file.st_mtime > stat_peak.st_mtime){
897 AudioSource::available_peaks (double zoom_factor) const
901 if (zoom_factor < _FPP) {
902 return length(); // peak data will come from the audio file
905 /* peak data comes from peakfile, but the filesize might not represent
906 the valid data due to ftruncate optimizations, so use _peak_byte_max state.
907 XXX - there might be some atomicity issues here, we should probably add a lock,
908 but _peak_byte_max only monotonically increases after initialization.
911 end = _peak_byte_max;
913 return (end/sizeof(PeakData)) * _FPP;
917 AudioSource::update_length (nframes_t pos, nframes_t cnt)
919 if (pos + cnt > _length) {