Put the loop start/end in BufferStorage

This commit is contained in:
Chris Robinson
2020-11-19 03:23:46 -08:00
parent ee9f0fe306
commit 537510afc8
4 changed files with 29 additions and 29 deletions
+8 -8
View File
@@ -554,8 +554,8 @@ void LoadData(ALCcontext *context, ALbuffer *ALBuf, ALsizei freq, ALuint size,
ALBuf->mBuffer.mUserData = nullptr;
ALBuf->mBuffer.mSampleLen = frames;
ALBuf->LoopStart = 0;
ALBuf->LoopEnd = ALBuf->mBuffer.mSampleLen;
ALBuf->mBuffer.mLoopStart = 0;
ALBuf->mBuffer.mLoopEnd = ALBuf->mBuffer.mSampleLen;
}
/** Prepares the buffer to use the specified callback, using the specified format. */
@@ -620,8 +620,8 @@ void PrepareCallback(ALCcontext *context, ALbuffer *ALBuf, ALsizei freq,
ALBuf->mBuffer.mAmbiOrder = ambiorder;
ALBuf->mBuffer.mSampleLen = 0;
ALBuf->LoopStart = 0;
ALBuf->LoopEnd = ALBuf->mBuffer.mSampleLen;
ALBuf->mBuffer.mLoopStart = 0;
ALBuf->mBuffer.mLoopEnd = ALBuf->mBuffer.mSampleLen;
}
@@ -1262,8 +1262,8 @@ START_API_FUNC
values[0], values[1], buffer);
else
{
albuf->LoopStart = static_cast<ALuint>(values[0]);
albuf->LoopEnd = static_cast<ALuint>(values[1]);
albuf->mBuffer.mLoopStart = static_cast<ALuint>(values[0]);
albuf->mBuffer.mLoopEnd = static_cast<ALuint>(values[1]);
}
break;
@@ -1457,8 +1457,8 @@ START_API_FUNC
else switch(param)
{
case AL_LOOP_POINTS_SOFT:
values[0] = static_cast<ALint>(albuf->LoopStart);
values[1] = static_cast<ALint>(albuf->LoopEnd);
values[0] = static_cast<ALint>(albuf->mBuffer.mLoopStart);
values[1] = static_cast<ALint>(albuf->mBuffer.mLoopEnd);
break;
default:
-3
View File
@@ -47,9 +47,6 @@ struct ALbuffer {
ALuint OriginalSize{0};
ALuint OriginalAlign{0};
ALuint LoopStart{0u};
ALuint LoopEnd{0u};
ALuint UnpackAlign{0};
ALuint PackAlign{0};
ALuint UnpackAmbiOrder{1};
+3
View File
@@ -61,6 +61,9 @@ struct BufferStorage {
AmbiScaling mAmbiScaling{AmbiScaling::FuMa};
ALuint mAmbiOrder{0u};
ALuint mLoopStart{0u};
ALuint mLoopEnd{0u};
inline ALuint bytesFromFmt() const noexcept { return BytesFromFmt(mType); }
inline ALuint channelsFromFmt() const noexcept
{ return ChannelsFromFmt(mChannels, mAmbiOrder); }
+18 -18
View File
@@ -245,9 +245,9 @@ float *LoadBufferStatic(ALbufferlistitem *BufferListItem, ALbufferlistitem *&Buf
const size_t NumChannels, const size_t SampleSize, const size_t chan, size_t DataPosInt,
al::span<float> SrcBuffer)
{
const ALbuffer *Buffer{BufferListItem->mBuffer};
const ALuint LoopStart{Buffer->LoopStart};
const ALuint LoopEnd{Buffer->LoopEnd};
const BufferStorage &Buffer = BufferListItem->mBuffer->mBuffer;
const ALuint LoopStart{Buffer.mLoopStart};
const ALuint LoopEnd{Buffer.mLoopEnd};
ASSUME(LoopEnd > LoopStart);
/* If current pos is beyond the loop range, do not loop */
@@ -256,12 +256,12 @@ float *LoadBufferStatic(ALbufferlistitem *BufferListItem, ALbufferlistitem *&Buf
BufferLoopItem = nullptr;
/* Load what's left to play from the buffer */
const size_t DataRem{minz(SrcBuffer.size(), Buffer->mBuffer.mSampleLen-DataPosInt)};
const size_t DataRem{minz(SrcBuffer.size(), Buffer.mSampleLen-DataPosInt)};
const al::byte *Data{Buffer->mBuffer.mData.data()};
const al::byte *Data{Buffer.mData.data()};
Data += (DataPosInt*NumChannels + chan)*SampleSize;
LoadSamples(SrcBuffer.data(), Data, NumChannels, Buffer->mBuffer.mType, DataRem);
LoadSamples(SrcBuffer.data(), Data, NumChannels, Buffer.mType, DataRem);
SrcBuffer = SrcBuffer.subspan(DataRem);
}
else
@@ -269,10 +269,10 @@ float *LoadBufferStatic(ALbufferlistitem *BufferListItem, ALbufferlistitem *&Buf
/* Load what's left of this loop iteration */
const size_t DataRem{minz(SrcBuffer.size(), LoopEnd-DataPosInt)};
const al::byte *Data{Buffer->mBuffer.mData.data()};
const al::byte *Data{Buffer.mData.data()};
Data += (DataPosInt*NumChannels + chan)*SampleSize;
LoadSamples(SrcBuffer.data(), Data, NumChannels, Buffer->mBuffer.mType, DataRem);
LoadSamples(SrcBuffer.data(), Data, NumChannels, Buffer.mType, DataRem);
SrcBuffer = SrcBuffer.subspan(DataRem);
/* Load any repeats of the loop we can to fill the buffer. */
@@ -281,9 +281,9 @@ float *LoadBufferStatic(ALbufferlistitem *BufferListItem, ALbufferlistitem *&Buf
{
const size_t DataSize{minz(SrcBuffer.size(), LoopSize)};
Data = Buffer->mBuffer.mData.data() + (LoopStart*NumChannels + chan)*SampleSize;
Data = Buffer.mData.data() + (LoopStart*NumChannels + chan)*SampleSize;
LoadSamples(SrcBuffer.data(), Data, NumChannels, Buffer->mBuffer.mType, DataSize);
LoadSamples(SrcBuffer.data(), Data, NumChannels, Buffer.mType, DataSize);
SrcBuffer = SrcBuffer.subspan(DataSize);
}
}
@@ -294,14 +294,14 @@ float *LoadBufferCallback(ALbufferlistitem *BufferListItem, const size_t NumChan
const size_t SampleSize, const size_t chan, size_t NumCallbackSamples,
al::span<float> SrcBuffer)
{
const ALbuffer *Buffer{BufferListItem->mBuffer};
const BufferStorage &Buffer = BufferListItem->mBuffer->mBuffer;
/* Load what's left to play from the buffer */
const size_t DataRem{minz(SrcBuffer.size(), NumCallbackSamples)};
const al::byte *Data{Buffer->mBuffer.mData.data() + chan*SampleSize};
const al::byte *Data{Buffer.mData.data() + chan*SampleSize};
LoadSamples(SrcBuffer.data(), Data, NumChannels, Buffer->mBuffer.mType, DataRem);
LoadSamples(SrcBuffer.data(), Data, NumChannels, Buffer.mType, DataRem);
SrcBuffer = SrcBuffer.subspan(DataRem);
return SrcBuffer.begin();
@@ -701,9 +701,9 @@ void Voice::mix(const State vstate, ALCcontext *Context, const ALuint SamplesToD
if(BufferLoopItem)
{
/* Handle looping static source */
const ALbuffer *Buffer{BufferListItem->mBuffer};
const ALuint LoopStart{Buffer->LoopStart};
const ALuint LoopEnd{Buffer->LoopEnd};
const BufferStorage &Buffer = BufferListItem->mBuffer->mBuffer;
const ALuint LoopStart{Buffer.mLoopStart};
const ALuint LoopEnd{Buffer.mLoopEnd};
if(DataPosInt >= LoopEnd)
{
assert(LoopEnd > LoopStart);
@@ -722,12 +722,12 @@ void Voice::mix(const State vstate, ALCcontext *Context, const ALuint SamplesToD
}
else if((mFlags&VoiceIsCallback))
{
ALbuffer *buffer{BufferListItem->mBuffer};
BufferStorage &buffer = BufferListItem->mBuffer->mBuffer;
if(SrcSamplesDone < mNumCallbackSamples)
{
const size_t byteOffset{SrcSamplesDone*FrameSize};
const size_t byteEnd{mNumCallbackSamples*FrameSize};
al::byte *data{buffer->mBuffer.mData.data()};
al::byte *data{buffer.mData.data()};
std::copy(data+byteOffset, data+byteEnd, data);
mNumCallbackSamples -= SrcSamplesDone;
}