Audacity 3.2.0
Public Member Functions | Private Member Functions | Private Attributes | Static Private Attributes | List of all members
staffpad::audio::TimeAndPitchAudioReader Class Reference

#include <TimeAndPitchAudioReader.h>

Inheritance diagram for staffpad::audio::TimeAndPitchAudioReader:
[legend]
Collaboration diagram for staffpad::audio::TimeAndPitchAudioReader:
[legend]

Public Member Functions

 TimeAndPitchAudioReader (std::unique_ptr< BaseAudioReader > reader)
 
virtual ~TimeAndPitchAudioReader ()
 
AudioFormat getFormat () const override
 
bool canSeek () const override
 
bool setPosition (int64_t newSamplePosition) override
 set the position based on input samples More...
 
int64_t getPosition () const override
 
int64_t getNumOfSourceSamples () const override
 
int32_t read (Signal32 &outputSignal) override
 
int32_t readTimeAndPitch (Signal32 &outputSignal, double timeStretch=1.0, double pitchFactor=1.0)
 
void setQuality (const TimeAndPitch::QualitySettings &settings)
 
void setLooping (bool flag)
 

Private Member Functions

int32_t _read_from_base_reader_append_silence (Signal32 &sig)
 

Private Attributes

std::unique_ptr< BaseAudioReader > _base_reader
 
Signal32 _sig
 
std::unique_ptr< TimeAndPitch_time_and_pitch
 
int _initial_samples_to_discard = 0
 
int _silent_samples_to_append = 0
 
bool _looping = false
 

Static Private Attributes

static constexpr int _block_size = 512
 

Detailed Description

Definition at line 10 of file TimeAndPitchAudioReader.h.

Constructor & Destructor Documentation

◆ TimeAndPitchAudioReader()

staffpad::audio::TimeAndPitchAudioReader::TimeAndPitchAudioReader ( std::unique_ptr< BaseAudioReader >  reader)
inline

◆ ~TimeAndPitchAudioReader()

virtual staffpad::audio::TimeAndPitchAudioReader::~TimeAndPitchAudioReader ( )
inlinevirtual

Definition at line 24 of file TimeAndPitchAudioReader.h.

25 {
26 }

Member Function Documentation

◆ _read_from_base_reader_append_silence()

int32_t staffpad::audio::TimeAndPitchAudioReader::_read_from_base_reader_append_silence ( Signal32 &  sig)
inlineprivate

read from the base reader, but append some silence at the end. We need this to get the final samples out

Definition at line 154 of file TimeAndPitchAudioReader.h.

155 {
156 int n = _base_reader->read(_sig);
157 if (n < sig.getNumOfDataPoints())
158 {
159 int silent_n =
160 std::min(sig.getNumOfDataPoints() - n, _silent_samples_to_append);
161 sig.setToValue(0.f, n, n + silent_n, -1);
162 _silent_samples_to_append -= silent_n;
163 return n + silent_n;
164 }
165 return n;
166 }
int min(int a, int b)

References _base_reader, _sig, _silent_samples_to_append, and min().

Referenced by readTimeAndPitch().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ canSeek()

bool staffpad::audio::TimeAndPitchAudioReader::canSeek ( ) const
inlineoverride

Definition at line 33 of file TimeAndPitchAudioReader.h.

34 {
35 return _base_reader->canSeek();
36 }

References _base_reader.

Referenced by setPosition().

Here is the caller graph for this function:

◆ getFormat()

AudioFormat staffpad::audio::TimeAndPitchAudioReader::getFormat ( ) const
inlineoverride

Definition at line 28 of file TimeAndPitchAudioReader.h.

29 {
30 return _base_reader->getFormat();
31 }

References _base_reader.

◆ getNumOfSourceSamples()

int64_t staffpad::audio::TimeAndPitchAudioReader::getNumOfSourceSamples ( ) const
inlineoverride

Definition at line 59 of file TimeAndPitchAudioReader.h.

60 {
61 return _base_reader->getNumOfSourceSamples();
62 }

References _base_reader.

◆ getPosition()

int64_t staffpad::audio::TimeAndPitchAudioReader::getPosition ( ) const
inlineoverride

Definition at line 54 of file TimeAndPitchAudioReader.h.

55 {
56 return _base_reader->getPosition();
57 }

References _base_reader.

◆ read()

int32_t staffpad::audio::TimeAndPitchAudioReader::read ( Signal32 &  outputSignal)
inlineoverride

Definition at line 64 of file TimeAndPitchAudioReader.h.

65 {
66 return _base_reader->read(outputSignal);
67 }

References _base_reader.

◆ readTimeAndPitch()

int32_t staffpad::audio::TimeAndPitchAudioReader::readTimeAndPitch ( Signal32 &  outputSignal,
double  timeStretch = 1.0,
double  pitchFactor = 1.0 
)
inline

Read with time stretch and pitch shift. Do not mix this call with normal read() calls.

Definition at line 71 of file TimeAndPitchAudioReader.h.

74 {
75 PPK_ASSERT(outputSignal.getNumOfChannels() == 2);
76
77 int num_samples = outputSignal.getNumOfDataPoints();
78 int p = 0;
79 bool end_of_file = false;
80 _time_and_pitch->setTimeStretchAndPitchFactor(timeStretch, pitchFactor);
81 while (num_samples > 0)
82 {
83 int num_samples_to_retrieve = std::min(num_samples, _block_size);
84 while (_time_and_pitch->getNumAvailableOutputSamples() <
85 num_samples_to_retrieve)
86 {
87 int feed_now =
88 std::min(_time_and_pitch->getSamplesToNextHop(), _block_size);
89 _sig.ensureDimensions(2, feed_now);
91 _time_and_pitch->feedAudio(_sig.getReadPointer(), samples_read);
92 if (samples_read < feed_now)
93 {
94 if (_looping)
95 {
96 _base_reader->setPosition(0);
97 }
98 else
99 {
100 end_of_file = true;
101 break;
102 }
103 }
104 }
105
106 if (int n = int(_initial_samples_to_discard * timeStretch + 0.5f);
107 n > 0)
108 {
109 n = std::min({ n, _time_and_pitch->getNumAvailableOutputSamples(),
110 outputSignal.getNumOfDataPoints(), _block_size });
111 // dump to the beginning of the block to be overwritten be real data
112 // later
113 float* dmp[2] = { outputSignal.getWriteChannelPtr(0),
114 outputSignal.getWriteChannelPtr(1) };
115 _time_and_pitch->retrieveAudio(dmp, n);
116 _initial_samples_to_discard -= int(n / timeStretch + 0.5f);
117 }
118 else
119 {
121 0; // can still be 1 or 2 for extreme factors due to rounding
122 float* smp[2] = { outputSignal.getWriteChannelPtr(0) + p,
123 outputSignal.getWriteChannelPtr(1) + p };
124
125 int num_samples_retrieved = std::min(
126 num_samples_to_retrieve,
127 _time_and_pitch->getNumAvailableOutputSamples());
128 _time_and_pitch->retrieveAudio(smp, num_samples_retrieved);
129
130 p += num_samples_retrieved;
131 num_samples -= num_samples_retrieved;
132 }
133 if (end_of_file)
134 break;
135 }
136 return p;
137 }
int32_t _read_from_base_reader_append_silence(Signal32 &sig)

References _base_reader, _block_size, _initial_samples_to_discard, _looping, _read_from_base_reader_append_silence(), _sig, _time_and_pitch, and min().

Here is the call graph for this function:

◆ setLooping()

void staffpad::audio::TimeAndPitchAudioReader::setLooping ( bool  flag)
inline

Definition at line 144 of file TimeAndPitchAudioReader.h.

145 {
146 _looping = flag;
148 _looping ? 0 : _time_and_pitch->getLatencySamples();
149 }
static std::once_flag flag

References _looping, _silent_samples_to_append, _time_and_pitch, and flag.

◆ setPosition()

bool staffpad::audio::TimeAndPitchAudioReader::setPosition ( int64_t  newSamplePosition)
inlineoverride

set the position based on input samples

Definition at line 39 of file TimeAndPitchAudioReader.h.

40 {
41 if (newSamplePosition != _base_reader->getPosition())
42 {
43 _base_reader->setPosition(
44 newSamplePosition); // todo: needs to move further into the past to
45 // make up latency
46 _initial_samples_to_discard = _time_and_pitch->getLatencySamples();
48 _looping ? 0 : _time_and_pitch->getLatencySamples();
49 _time_and_pitch->reset();
50 }
51 return canSeek();
52 }

References _base_reader, _initial_samples_to_discard, _looping, _silent_samples_to_append, _time_and_pitch, and canSeek().

Here is the call graph for this function:

◆ setQuality()

void staffpad::audio::TimeAndPitchAudioReader::setQuality ( const TimeAndPitch::QualitySettings &  settings)
inline

Definition at line 139 of file TimeAndPitchAudioReader.h.

140 {
141 _time_and_pitch->setQuality(settings);
142 }
static Settings & settings()
Definition: TrackInfo.cpp:83

References _time_and_pitch, and settings().

Here is the call graph for this function:

Member Data Documentation

◆ _base_reader

std::unique_ptr<BaseAudioReader> staffpad::audio::TimeAndPitchAudioReader::_base_reader
private

◆ _block_size

constexpr int staffpad::audio::TimeAndPitchAudioReader::_block_size = 512
staticconstexprprivate

Definition at line 168 of file TimeAndPitchAudioReader.h.

Referenced by readTimeAndPitch(), and TimeAndPitchAudioReader().

◆ _initial_samples_to_discard

int staffpad::audio::TimeAndPitchAudioReader::_initial_samples_to_discard = 0
private

◆ _looping

bool staffpad::audio::TimeAndPitchAudioReader::_looping = false
private

◆ _sig

Signal32 staffpad::audio::TimeAndPitchAudioReader::_sig
private

◆ _silent_samples_to_append

int staffpad::audio::TimeAndPitchAudioReader::_silent_samples_to_append = 0
private

◆ _time_and_pitch

std::unique_ptr<TimeAndPitch> staffpad::audio::TimeAndPitchAudioReader::_time_and_pitch
private

The documentation for this class was generated from the following file: