make resampled sources (during import) report their "natural position" (i.e. BWF timecode) using the samplerate of the session, not the original source, for correct positioning; minor frame{pos,cnt}_t cleanup
git-svn-id: svn://localhost/ardour2/branches/3.0@7785 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
084dda86a7
commit
8e00b86ebb
|
@ -827,20 +827,16 @@ Editor::add_sources (vector<string> paths, SourceList& sources, nframes64_t& pos
|
|||
|
||||
if (as->natural_position() != 0) {
|
||||
pos = as->natural_position();
|
||||
cerr << "\tgot " << pos << " from source TC info\n";
|
||||
} else if (target_tracks == 1) {
|
||||
/* hmm, no timestamp available, put it after the previous region
|
||||
*/
|
||||
if (n == 0) {
|
||||
pos = get_preferred_edit_position ();
|
||||
cerr << "\tno timestamp, first file, use edit pos = " << pos << endl;
|
||||
} else {
|
||||
pos += rlen;
|
||||
cerr << "\tpacked-sequence-shuffle to " << pos << endl;
|
||||
}
|
||||
} else {
|
||||
pos = get_preferred_edit_position ();
|
||||
cerr << "\tmultitracks, using edit position = " << pos << endl;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1997,7 +1997,7 @@ MidiRegionView::move_selection(double dx, double dy, double cumulative_dy)
|
|||
}
|
||||
|
||||
if (dy && !_selection.empty() && !no_sound_notes && trackview.editor().sound_notes()) {
|
||||
|
||||
|
||||
if (to_play.size() > 1) {
|
||||
|
||||
PossibleChord shifted;
|
||||
|
|
|
@ -30,13 +30,13 @@ public:
|
|||
ImportableSource () {}
|
||||
virtual ~ImportableSource() {}
|
||||
|
||||
virtual nframes_t read (Sample* buffer, nframes_t nframes) = 0;
|
||||
virtual float ratio() const { return 1.0f; }
|
||||
virtual uint32_t channels() const = 0;
|
||||
virtual nframes_t length() const = 0;
|
||||
virtual nframes_t samplerate() const = 0;
|
||||
virtual void seek (nframes_t pos) = 0;
|
||||
virtual nframes64_t natural_position() const = 0;
|
||||
virtual nframes_t read (Sample* buffer, nframes_t nframes) = 0;
|
||||
virtual float ratio() const { return 1.0f; }
|
||||
virtual uint32_t channels() const = 0;
|
||||
virtual framecnt_t length() const = 0;
|
||||
virtual nframes_t samplerate() const = 0;
|
||||
virtual void seek (nframes_t pos) = 0;
|
||||
virtual framepos_t natural_position() const = 0;
|
||||
|
||||
virtual bool clamped_at_unity () const = 0;
|
||||
};
|
||||
|
|
|
@ -34,13 +34,13 @@ class ResampledImportableSource : public ImportableSource
|
|||
|
||||
~ResampledImportableSource ();
|
||||
|
||||
nframes_t read (Sample* buffer, nframes_t nframes);
|
||||
float ratio() const { return src_data.src_ratio; }
|
||||
uint32_t channels() const { return source->channels(); }
|
||||
nframes_t length() const { return source->length(); }
|
||||
nframes_t samplerate() const { return source->samplerate(); }
|
||||
void seek (nframes_t);
|
||||
nframes64_t natural_position() const { return source->natural_position(); }
|
||||
nframes_t read (Sample* buffer, nframes_t nframes);
|
||||
float ratio() const { return src_data.src_ratio; }
|
||||
uint32_t channels() const { return source->channels(); }
|
||||
framecnt_t length() const { return source->length(); }
|
||||
nframes_t samplerate() const { return source->samplerate(); }
|
||||
void seek (nframes_t);
|
||||
framepos_t natural_position() const;
|
||||
|
||||
bool clamped_at_unity () const {
|
||||
/* resampling may generate inter-sample peaks with magnitude > 1 */
|
||||
|
|
|
@ -33,18 +33,23 @@ class SndFileImportableSource : public ImportableSource {
|
|||
SndFileImportableSource (const std::string& path);
|
||||
virtual ~SndFileImportableSource();
|
||||
|
||||
nframes_t read (Sample* buffer, nframes_t nframes);
|
||||
uint32_t channels() const;
|
||||
nframes_t length() const;
|
||||
nframes_t samplerate() const;
|
||||
void seek (nframes_t pos);
|
||||
nframes64_t natural_position() const;
|
||||
bool clamped_at_unity () const;
|
||||
nframes_t read (Sample* buffer, nframes_t nframes);
|
||||
uint32_t channels() const;
|
||||
framecnt_t length() const;
|
||||
nframes_t samplerate() const;
|
||||
void seek (nframes_t pos);
|
||||
framepos_t natural_position() const;
|
||||
bool clamped_at_unity () const;
|
||||
|
||||
protected:
|
||||
SF_INFO sf_info;
|
||||
boost::shared_ptr<SNDFILE> in;
|
||||
nframes_t timecode;
|
||||
|
||||
/* these are int64_t so as to be independent of whatever
|
||||
types Ardour may use for framepos_t, framecnt_t etc.
|
||||
*/
|
||||
|
||||
int64_t timecode;
|
||||
int64_t get_timecode_info (SNDFILE*, SF_BROADCAST_INFO*, bool&);
|
||||
};
|
||||
|
||||
|
|
|
@ -214,7 +214,6 @@ create_mono_sources_for_writing (const vector<string>& new_paths, Session& sess,
|
|||
{
|
||||
const DataType type = SMFSource::safe_midi_file_extension (*i) ? DataType::MIDI : DataType::AUDIO;
|
||||
|
||||
|
||||
source = SourceFactory::createWritable (type, sess,
|
||||
i->c_str(),
|
||||
false, // destructive
|
||||
|
|
|
@ -134,3 +134,8 @@ ResampledImportableSource::seek (nframes_t pos)
|
|||
src_data.end_of_input = 0;
|
||||
}
|
||||
|
||||
framepos_t
|
||||
ResampledImportableSource::natural_position () const
|
||||
{
|
||||
return source->natural_position() * ratio ();
|
||||
}
|
||||
|
|
|
@ -57,10 +57,10 @@ SndFileImportableSource::channels () const
|
|||
return sf_info.channels;
|
||||
}
|
||||
|
||||
nframes_t
|
||||
framecnt_t
|
||||
SndFileImportableSource::length () const
|
||||
{
|
||||
return sf_info.frames;
|
||||
return (framecnt_t) sf_info.frames;
|
||||
}
|
||||
|
||||
nframes_t
|
||||
|
@ -75,10 +75,10 @@ SndFileImportableSource::seek (nframes_t /*pos*/)
|
|||
sf_seek (in.get(), 0, SEEK_SET);
|
||||
}
|
||||
|
||||
nframes64_t
|
||||
framepos_t
|
||||
SndFileImportableSource::natural_position () const
|
||||
{
|
||||
return timecode;
|
||||
return (framepos_t) timecode;
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
Loading…
Reference in New Issue