1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-16 08:09:32 +02:00

WaveTrackCache was only used with float; don't support other formats

This commit is contained in:
Paul Licameli 2021-05-23 17:25:55 -04:00
parent 4fcb8bffbf
commit 0aa8625cff
4 changed files with 35 additions and 29 deletions

View File

@ -460,7 +460,8 @@ size_t Mixer::MixVariableRates(int *channelFlags, WaveTrackCache &cache,
// Nothing to do if past end of play interval // Nothing to do if past end of play interval
if (getLen > 0) { if (getLen > 0) {
if (backwards) { if (backwards) {
auto results = cache.Get(floatSample, *pos - (getLen - 1), getLen, mMayThrow); auto results =
cache.GetFloats(*pos - (getLen - 1), getLen, mMayThrow);
if (results) if (results)
memcpy(&queue[*queueLen], results, sizeof(float) * getLen); memcpy(&queue[*queueLen], results, sizeof(float) * getLen);
else else
@ -472,7 +473,7 @@ size_t Mixer::MixVariableRates(int *channelFlags, WaveTrackCache &cache,
*pos -= getLen; *pos -= getLen;
} }
else { else {
auto results = cache.Get(floatSample, *pos, getLen, mMayThrow); auto results = cache.GetFloats(*pos, getLen, mMayThrow);
if (results) if (results)
memcpy(&queue[*queueLen], results, sizeof(float) * getLen); memcpy(&queue[*queueLen], results, sizeof(float) * getLen);
else else
@ -589,7 +590,7 @@ size_t Mixer::MixSameRate(int *channelFlags, WaveTrackCache &cache,
); );
if (backwards) { if (backwards) {
auto results = cache.Get(floatSample, *pos - (slen - 1), slen, mMayThrow); auto results = cache.GetFloats(*pos - (slen - 1), slen, mMayThrow);
if (results) if (results)
memcpy(mFloatBuffer.get(), results, sizeof(float) * slen); memcpy(mFloatBuffer.get(), results, sizeof(float) * slen);
else else
@ -602,7 +603,7 @@ size_t Mixer::MixSameRate(int *channelFlags, WaveTrackCache &cache,
*pos -= slen; *pos -= slen;
} }
else { else {
auto results = cache.Get(floatSample, *pos, slen, mMayThrow); auto results = cache.GetFloats(*pos, slen, mMayThrow);
if (results) if (results)
memcpy(mFloatBuffer.get(), results, sizeof(float) * slen); memcpy(mFloatBuffer.get(), results, sizeof(float) * slen);
else else

View File

@ -707,8 +707,8 @@ bool SpecCache::CalculateOneSpectrum
} }
if (myLen > 0) { if (myLen > 0) {
useBuffer = (float*)(waveTrackCache.Get( useBuffer = (float*)(waveTrackCache.GetFloats(
floatSample, sampleCount( sampleCount(
floor(0.5 + from.as_double() + offset * rate) floor(0.5 + from.as_double() + offset * rate)
), ),
myLen, myLen,

View File

@ -2542,9 +2542,10 @@ void WaveTrackCache::SetTrack(const std::shared_ptr<const WaveTrack> &pTrack)
} }
} }
constSamplePtr WaveTrackCache::Get(sampleFormat format, const float *WaveTrackCache::GetFloats(
sampleCount start, size_t len, bool mayThrow) sampleCount start, size_t len, bool mayThrow)
{ {
constexpr auto format = floatSample;
if (format == floatSample && len > 0) { if (format == floatSample && len > 0) {
const auto end = start + len; const auto end = start + len;
@ -2596,7 +2597,7 @@ constSamplePtr WaveTrackCache::Get(sampleFormat format,
if (!mPTrack->Get( if (!mPTrack->Get(
samplePtr(mBuffers[0].data.get()), floatSample, start0, len0, samplePtr(mBuffers[0].data.get()), floatSample, start0, len0,
fillZero, mayThrow)) fillZero, mayThrow))
return 0; return nullptr;
mBuffers[0].start = start0; mBuffers[0].start = start0;
mBuffers[0].len = len0; mBuffers[0].len = len0;
if (!fillSecond && if (!fillSecond &&
@ -2622,7 +2623,7 @@ constSamplePtr WaveTrackCache::Get(sampleFormat format,
const auto len1 = mPTrack->GetBestBlockSize(start1); const auto len1 = mPTrack->GetBestBlockSize(start1);
wxASSERT(len1 <= mBufferSize); wxASSERT(len1 <= mBufferSize);
if (!mPTrack->Get(samplePtr(mBuffers[1].data.get()), floatSample, start1, len1, fillZero, mayThrow)) if (!mPTrack->Get(samplePtr(mBuffers[1].data.get()), floatSample, start1, len1, fillZero, mayThrow))
return 0; return nullptr;
mBuffers[1].start = start1; mBuffers[1].start = start1;
mBuffers[1].len = len1; mBuffers[1].len = len1;
mNValidBuffers = 2; mNValidBuffers = 2;
@ -2648,7 +2649,7 @@ constSamplePtr WaveTrackCache::Get(sampleFormat format,
auto sinitLen = initLen.as_size_t(); auto sinitLen = initLen.as_size_t();
if (!mPTrack->Get(mOverlapBuffer.ptr(), format, start, sinitLen, if (!mPTrack->Get(mOverlapBuffer.ptr(), format, start, sinitLen,
fillZero, mayThrow)) fillZero, mayThrow))
return 0; return nullptr;
wxASSERT( sinitLen <= remaining ); wxASSERT( sinitLen <= remaining );
remaining -= sinitLen; remaining -= sinitLen;
start += initLen; start += initLen;
@ -2669,7 +2670,7 @@ constSamplePtr WaveTrackCache::Get(sampleFormat format,
// All is contiguous already. We can completely avoid copying // All is contiguous already. We can completely avoid copying
// leni is nonnegative, therefore start falls within mBuffers[ii], // leni is nonnegative, therefore start falls within mBuffers[ii],
// so starti is bounded between 0 and buffer length // so starti is bounded between 0 and buffer length
return samplePtr(mBuffers[ii].data.get() + starti.as_size_t() ); return mBuffers[ii].data.get() + starti.as_size_t() ;
} }
else if (leni > 0) { else if (leni > 0) {
// leni is nonnegative, therefore start falls within mBuffers[ii] // leni is nonnegative, therefore start falls within mBuffers[ii]
@ -2700,15 +2701,21 @@ constSamplePtr WaveTrackCache::Get(sampleFormat format,
return 0; return 0;
} }
return mOverlapBuffer.ptr(); // Overlap buffer was meant for the more general support of sample formats
// besides float, which explains the cast
return reinterpret_cast<const float*>(mOverlapBuffer.ptr());
}
else {
#if 0
// Cache works only for float format.
mOverlapBuffer.Resize(len, format);
if (mPTrack->Get(mOverlapBuffer.ptr(), format, start, len, fillZero, mayThrow))
return mOverlapBuffer.ptr();
#else
// No longer handling other than float format. Therefore len is 0.
#endif
return nullptr;
} }
// Cache works only for float format.
mOverlapBuffer.Resize(len, format);
if (mPTrack->Get(mOverlapBuffer.ptr(), format, start, len, fillZero, mayThrow))
return mOverlapBuffer.ptr();
else
return 0;
} }
void WaveTrackCache::Free() void WaveTrackCache::Free()

View File

@ -592,10 +592,9 @@ private:
std::unique_ptr<WaveformSettings> mpWaveformSettings; std::unique_ptr<WaveformSettings> mpWaveformSettings;
}; };
// This is meant to be a short-lived object, during whose lifetime, //! A short-lived object, during whose lifetime, the contents of the WaveTrack are assumed not to change.
// the contents of the WaveTrack are known not to change. It can replace /*! It can replace repeated calls to WaveTrack::Get() (each of which opens and closes at least one block).
// repeated calls to WaveTrack::Get() (each of which opens and closes at least */
// one block file).
class AUDACITY_DLL_API WaveTrackCache { class AUDACITY_DLL_API WaveTrackCache {
public: public:
WaveTrackCache() WaveTrackCache()
@ -617,12 +616,11 @@ public:
const std::shared_ptr<const WaveTrack>& GetTrack() const { return mPTrack; } const std::shared_ptr<const WaveTrack>& GetTrack() const { return mPTrack; }
void SetTrack(const std::shared_ptr<const WaveTrack> &pTrack); void SetTrack(const std::shared_ptr<const WaveTrack> &pTrack);
// Uses fillZero always //! Retrieve samples as floats from the track or from the memory cache
// Returns null on failure /*! Uses fillZero always
// Returned pointer may be invalidated if Get is called again @return null on failure; this object owns the memory; may be invalidated if GetFloats() is called again
// Do not DELETE[] the pointer */
constSamplePtr Get( const float *GetFloats(sampleCount start, size_t len, bool mayThrow);
sampleFormat format, sampleCount start, size_t len, bool mayThrow);
private: private:
void Free(); void Free();