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
if (getLen > 0) {
if (backwards) {
auto results = cache.Get(floatSample, *pos - (getLen - 1), getLen, mMayThrow);
auto results =
cache.GetFloats(*pos - (getLen - 1), getLen, mMayThrow);
if (results)
memcpy(&queue[*queueLen], results, sizeof(float) * getLen);
else
@ -472,7 +473,7 @@ size_t Mixer::MixVariableRates(int *channelFlags, WaveTrackCache &cache,
*pos -= getLen;
}
else {
auto results = cache.Get(floatSample, *pos, getLen, mMayThrow);
auto results = cache.GetFloats(*pos, getLen, mMayThrow);
if (results)
memcpy(&queue[*queueLen], results, sizeof(float) * getLen);
else
@ -589,7 +590,7 @@ size_t Mixer::MixSameRate(int *channelFlags, WaveTrackCache &cache,
);
if (backwards) {
auto results = cache.Get(floatSample, *pos - (slen - 1), slen, mMayThrow);
auto results = cache.GetFloats(*pos - (slen - 1), slen, mMayThrow);
if (results)
memcpy(mFloatBuffer.get(), results, sizeof(float) * slen);
else
@ -602,7 +603,7 @@ size_t Mixer::MixSameRate(int *channelFlags, WaveTrackCache &cache,
*pos -= slen;
}
else {
auto results = cache.Get(floatSample, *pos, slen, mMayThrow);
auto results = cache.GetFloats(*pos, slen, mMayThrow);
if (results)
memcpy(mFloatBuffer.get(), results, sizeof(float) * slen);
else

View File

@ -707,8 +707,8 @@ bool SpecCache::CalculateOneSpectrum
}
if (myLen > 0) {
useBuffer = (float*)(waveTrackCache.Get(
floatSample, sampleCount(
useBuffer = (float*)(waveTrackCache.GetFloats(
sampleCount(
floor(0.5 + from.as_double() + offset * rate)
),
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)
{
constexpr auto format = floatSample;
if (format == floatSample && len > 0) {
const auto end = start + len;
@ -2596,7 +2597,7 @@ constSamplePtr WaveTrackCache::Get(sampleFormat format,
if (!mPTrack->Get(
samplePtr(mBuffers[0].data.get()), floatSample, start0, len0,
fillZero, mayThrow))
return 0;
return nullptr;
mBuffers[0].start = start0;
mBuffers[0].len = len0;
if (!fillSecond &&
@ -2622,7 +2623,7 @@ constSamplePtr WaveTrackCache::Get(sampleFormat format,
const auto len1 = mPTrack->GetBestBlockSize(start1);
wxASSERT(len1 <= mBufferSize);
if (!mPTrack->Get(samplePtr(mBuffers[1].data.get()), floatSample, start1, len1, fillZero, mayThrow))
return 0;
return nullptr;
mBuffers[1].start = start1;
mBuffers[1].len = len1;
mNValidBuffers = 2;
@ -2648,7 +2649,7 @@ constSamplePtr WaveTrackCache::Get(sampleFormat format,
auto sinitLen = initLen.as_size_t();
if (!mPTrack->Get(mOverlapBuffer.ptr(), format, start, sinitLen,
fillZero, mayThrow))
return 0;
return nullptr;
wxASSERT( sinitLen <= remaining );
remaining -= sinitLen;
start += initLen;
@ -2669,7 +2670,7 @@ constSamplePtr WaveTrackCache::Get(sampleFormat format,
// All is contiguous already. We can completely avoid copying
// leni is nonnegative, therefore start falls within mBuffers[ii],
// 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) {
// leni is nonnegative, therefore start falls within mBuffers[ii]
@ -2700,15 +2701,21 @@ constSamplePtr WaveTrackCache::Get(sampleFormat format,
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()

View File

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