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:
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
|
// 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
|
||||||
|
@ -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,
|
||||||
|
@ -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()
|
||||||
|
@ -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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user