Put the loop start/end in BufferStorage
This commit is contained in:
+8
-8
@@ -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:
|
||||
|
||||
@@ -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};
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user