WaveTrackCache was only used with float; don't support other formats
This commit is contained in:
parent
4fcb8bffbf
commit
0aa8625cff
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue