Ardour  8.12
srcfilesource.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014-2015 Robin Gareus <robin@gareus.org>
3  * Copyright (C) 2014-2017 Paul Davis <paul@linuxaudiosystems.com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
20 #ifndef __ardour_srcfilesource_h__
21 #define __ardour_srcfilesource_h__
22 
23 #include <cstring>
24 #include <samplerate.h>
25 
27 #include "ardour/audiofilesource.h"
28 #include "ardour/session.h"
29 
30 namespace ARDOUR {
31 
33 public:
34  SrcFileSource (Session&, std::shared_ptr<AudioFileSource>, SrcQuality srcq = SrcQuality(SrcQuick));
36 
37  int update_header (samplepos_t /*when*/, struct tm&, time_t) { return 0; }
38  int flush_header () { return 0; }
39  void flush () { }
41  void set_length (samplecnt_t /*len*/) {};
42 
43  float sample_rate () const { return _session.nominal_sample_rate(); }
44 
45  timepos_t natural_position() const { return _source->natural_position().scale (_ratio); }
46  samplecnt_t readable_length_samples() const { assert (_source->length().time_domain() == Temporal::AudioTime); return _source->length().samples () * _ratio; }
47  timepos_t length () const { assert (_source->length().time_domain() == Temporal::AudioTime); return timepos_t ((samplepos_t) (_source->length().samples () * _ratio)); }
48 
49  bool can_be_analysed() const { return false; }
50  bool clamped_at_unity() const { return false; }
51 
52 protected:
53  void close ();
55  samplecnt_t write_unlocked (Sample */*dst*/, samplecnt_t /*cnt*/) { return 0; }
56 
58  double /*samples_per_unit*/, samplecnt_t /*fpp*/) const {
59  memset (peaks, 0, sizeof (PeakData) * npeaks);
60  return 0;
61  }
62 
63 private:
64  static const uint32_t max_blocksize;
65  std::shared_ptr<AudioFileSource> _source;
66 
67  mutable SRC_STATE* _src_state;
68  mutable SRC_DATA _src_data;
69 
70  mutable Sample* _src_buffer;
73  mutable double _fract_position;
74 
75  double _ratio;
77 };
78 
79 } // namespace ARDOUR
80 
81 #endif /* __ardour_audiofilesource_h__ */
82 
std::shared_ptr< AudioFileSource > _source
Definition: srcfilesource.h:65
SRC_STATE * _src_state
Definition: srcfilesource.h:67
static const uint32_t max_blocksize
Definition: srcfilesource.h:64
bool can_be_analysed() const
Definition: srcfilesource.h:49
samplecnt_t write_unlocked(Sample *, samplecnt_t)
Definition: srcfilesource.h:55
bool clamped_at_unity() const
Definition: srcfilesource.h:50
samplecnt_t readable_length_samples() const
Definition: srcfilesource.h:46
samplecnt_t read_unlocked(Sample *dst, samplepos_t start, samplecnt_t cnt) const
timepos_t length() const
Definition: srcfilesource.h:47
void set_length(samplecnt_t)
Definition: srcfilesource.h:41
SrcFileSource(Session &, std::shared_ptr< AudioFileSource >, SrcQuality srcq=SrcQuality(SrcQuick))
int update_header(samplepos_t, struct tm &, time_t)
Definition: srcfilesource.h:37
int read_peaks_with_fpp(PeakData *peaks, samplecnt_t npeaks, samplepos_t, samplecnt_t, double, samplecnt_t) const
Definition: srcfilesource.h:57
samplepos_t _target_position
Definition: srcfilesource.h:72
float sample_rate() const
Definition: srcfilesource.h:43
samplecnt_t src_buffer_size
Definition: srcfilesource.h:76
samplepos_t _source_position
Definition: srcfilesource.h:71
timepos_t natural_position() const
Definition: srcfilesource.h:45
void set_header_natural_position()
Definition: srcfilesource.h:40
timepos_t scale(ratio_t const &n) const
#define LIBARDOUR_API
void peaks(const float *data, float &min, float &max, uint32_t n_samples)
void memset(float *data, const float val, const uint32_t n_samples)
PBD::PropertyDescriptor< timepos_t > start
Temporal::samplecnt_t samplecnt_t
Temporal::timepos_t timepos_t
Temporal::samplepos_t samplepos_t