X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Faudiosource.cc;h=123bc229180d9d70fa8e2fc7e4a95b54d3df76bd;hb=cf52d6e4b40111eb04b244ec054055a4ec15dbe0;hp=c79cbbbe26e1b13ef7ba44b29999352fdfc2bc0e;hpb=390ea007c5b6b647e33c924b3429bf49ae83b1ca;p=ardour.git diff --git a/libs/ardour/audiosource.cc b/libs/ardour/audiosource.cc index c79cbbbe26..123bc22918 100644 --- a/libs/ardour/audiosource.cc +++ b/libs/ardour/audiosource.cc @@ -30,7 +30,6 @@ #include #include #include -#include #include #include @@ -43,7 +42,7 @@ #endif #include -#include +#include "pbd/gstdio_compat.h" #include @@ -59,7 +58,7 @@ #include "ardour/runtime_functions.h" #include "ardour/session.h" -#include "i18n.h" +#include "pbd/i18n.h" #include "ardour/debug.h" @@ -143,7 +142,7 @@ AudioSource::get_state () int AudioSource::set_state (const XMLNode& node, int /*version*/) { - const XMLProperty* prop; + XMLProperty const * prop; if ((prop = node.property ("captured-for")) != 0) { _captured_for = prop->value(); @@ -237,14 +236,15 @@ AudioSource::rename_peakfile (string newpath) } int -AudioSource::initialize_peakfile (const string& audio_path) +AudioSource::initialize_peakfile (const string& audio_path, const bool in_session) { + Glib::Threads::Mutex::Lock lm (_initialize_peaks_lock); GStatBuf statbuf; - _peakpath = construct_peak_filepath (audio_path); + _peakpath = construct_peak_filepath (audio_path, in_session); if (!empty() && !Glib::file_test (_peakpath.c_str(), Glib::FILE_TEST_EXISTS)) { - string oldpeak = construct_peak_filepath (audio_path, true); + string oldpeak = construct_peak_filepath (audio_path, in_session, true); DEBUG_TRACE(DEBUG::Peaks, string_compose ("Looking for old peak file %1 for Audio file %2\n", oldpeak, audio_path)); if (Glib::file_test (oldpeak.c_str(), Glib::FILE_TEST_EXISTS)) { // TODO use hard-link if possible @@ -317,7 +317,7 @@ framecnt_t AudioSource::read (Sample *dst, framepos_t start, framecnt_t cnt, int /*channel*/) const { assert (cnt >= 0); - + Glib::Threads::Mutex::Lock lm (_lock); return read_unlocked (dst, start, cnt); } @@ -370,7 +370,7 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t } if (!_captured_for.empty()) { - + /* _captured_for is only set after a capture pass is * complete. so we know that capturing is finished for this * file, and now we can check actual size of the peakfile is at @@ -380,11 +380,11 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t * * XXX this may not work for destructive recording, but we * might decided to get rid of that anyway. - * + * */ - + const off_t expected_file_size = (_length / (double) samples_per_file_peak) * sizeof (PeakData); - + if (statbuf.st_size < expected_file_size) { warning << string_compose (_("peak file %1 is truncated from %2 to %3"), _peakpath, expected_file_size, statbuf.st_size) << endmsg; const_cast(this)->build_peaks_from_scratch (); @@ -404,7 +404,7 @@ AudioSource::read_peaks_with_fpp (PeakData *peaks, framecnt_t npeaks, framepos_t error << string_compose (_("Cannot open peakfile @ %1 for reading (%2)"), _peakpath, strerror (errno)) << endmsg; return -1; } - + scale = npeaks/expected_peaks; @@ -728,7 +728,7 @@ AudioSource::build_peaks_from_scratch () /* hold lock while building peaks */ Glib::Threads::Mutex::Lock lp (_lock); - + if (prepare_for_peakfile_writes ()) { goto out; } @@ -743,7 +743,7 @@ AudioSource::build_peaks_from_scratch () framecnt_t frames_to_read = min (bufsize, cnt); framecnt_t frames_read; - + if ((frames_read = read_unlocked (buf.get(), current_frame, frames_to_read)) != frames_to_read) { error << string_compose(_("%1: could not write read raw data for peak computation (%2)"), _name, strerror (errno)) << endmsg; done_with_peakfile_writes (false); @@ -752,8 +752,9 @@ AudioSource::build_peaks_from_scratch () lp.release(); // allow butler to refill buffers - if (_session.deletion_in_progress()) { + if (_session.deletion_in_progress() || _session.peaks_cleanup_in_progres()) { cerr << "peak file creation interrupted: " << _name << endmsg; + lp.acquire(); done_with_peakfile_writes (false); goto out; } @@ -788,9 +789,28 @@ AudioSource::build_peaks_from_scratch () return ret; } +int +AudioSource::close_peakfile () +{ + Glib::Threads::Mutex::Lock lp (_lock); + if (_peakfile_fd >= 0) { + close (_peakfile_fd); + _peakfile_fd = -1; + } + if (!_peakpath.empty()) { + ::g_unlink (_peakpath.c_str()); + } + _peaks_built = false; + return 0; +} + int AudioSource::prepare_for_peakfile_writes () { + if (_session.deletion_in_progress() || _session.peaks_cleanup_in_progres()) { + return -1; + } + if ((_peakfile_fd = g_open (_peakpath.c_str(), O_CREAT|O_RDWR, 0664)) < 0) { error << string_compose(_("AudioSource: cannot open _peakpath (c) \"%1\" (%2)"), _peakpath, strerror (errno)) << endmsg; return -1; @@ -801,6 +821,14 @@ AudioSource::prepare_for_peakfile_writes () void AudioSource::done_with_peakfile_writes (bool done) { + if (_session.deletion_in_progress() || _session.peaks_cleanup_in_progres()) { + if (_peakfile_fd) { + close (_peakfile_fd); + _peakfile_fd = -1; + } + return; + } + if (peak_leftover_cnt) { compute_and_write_peaks (0, 0, 0, true, false, _FPP); }