Use struct methods to get a buffer's format info
This commit is contained in:
+7
-8
@@ -911,8 +911,8 @@ START_API_FUNC
|
||||
context->setError(AL_INVALID_OPERATION, "Unpacking data into mapped buffer %u", buffer);
|
||||
else
|
||||
{
|
||||
ALuint num_chans{ChannelsFromFmt(albuf->mFmtChannels)};
|
||||
ALuint frame_size{num_chans * BytesFromFmt(albuf->mFmtType)};
|
||||
ALuint num_chans{albuf->channelsFromFmt()};
|
||||
ALuint frame_size{num_chans * albuf->bytesFromFmt()};
|
||||
ALuint byte_align{
|
||||
(albuf->OriginalType == UserFmtIMA4) ? ((align-1)/2 + 4) * num_chans :
|
||||
(albuf->OriginalType == UserFmtMSADPCM) ? ((align-2)/2 + 7) * num_chans :
|
||||
@@ -1279,16 +1279,15 @@ START_API_FUNC
|
||||
break;
|
||||
|
||||
case AL_BITS:
|
||||
*value = static_cast<ALint>(BytesFromFmt(albuf->mFmtType) * 8);
|
||||
*value = static_cast<ALint>(albuf->bytesFromFmt() * 8);
|
||||
break;
|
||||
|
||||
case AL_CHANNELS:
|
||||
*value = static_cast<ALint>(ChannelsFromFmt(albuf->mFmtChannels));
|
||||
*value = static_cast<ALint>(albuf->channelsFromFmt());
|
||||
break;
|
||||
|
||||
case AL_SIZE:
|
||||
*value = static_cast<ALint>(albuf->SampleLen *
|
||||
FrameSizeFromFmt(albuf->mFmtChannels, albuf->mFmtType));
|
||||
*value = static_cast<ALint>(albuf->SampleLen * albuf->frameSizeFromFmt());
|
||||
break;
|
||||
|
||||
case AL_UNPACK_BLOCK_ALIGNMENT_SOFT:
|
||||
@@ -1377,7 +1376,7 @@ START_API_FUNC
|
||||
END_API_FUNC
|
||||
|
||||
|
||||
ALuint BytesFromFmt(FmtType type)
|
||||
ALuint BytesFromFmt(FmtType type) noexcept
|
||||
{
|
||||
switch(type)
|
||||
{
|
||||
@@ -1390,7 +1389,7 @@ ALuint BytesFromFmt(FmtType type)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
ALuint ChannelsFromFmt(FmtChannels chans)
|
||||
ALuint ChannelsFromFmt(FmtChannels chans) noexcept
|
||||
{
|
||||
switch(chans)
|
||||
{
|
||||
|
||||
+6
-4
@@ -59,10 +59,8 @@ enum FmtChannels : unsigned char {
|
||||
#define MAX_INPUT_CHANNELS (8)
|
||||
|
||||
|
||||
ALuint BytesFromFmt(FmtType type);
|
||||
ALuint ChannelsFromFmt(FmtChannels chans);
|
||||
inline ALuint FrameSizeFromFmt(FmtChannels chans, FmtType type)
|
||||
{ return ChannelsFromFmt(chans) * BytesFromFmt(type); }
|
||||
ALuint BytesFromFmt(FmtType type) noexcept;
|
||||
ALuint ChannelsFromFmt(FmtChannels chans) noexcept;
|
||||
|
||||
|
||||
struct ALbuffer {
|
||||
@@ -97,6 +95,10 @@ struct ALbuffer {
|
||||
|
||||
/* Self ID */
|
||||
ALuint id{0};
|
||||
|
||||
inline ALuint bytesFromFmt() const noexcept { return BytesFromFmt(mFmtType); }
|
||||
inline ALuint channelsFromFmt() const noexcept { return ChannelsFromFmt(mFmtChannels); }
|
||||
inline ALuint frameSizeFromFmt() const noexcept { return channelsFromFmt() * bytesFromFmt(); }
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
+8
-8
@@ -348,7 +348,7 @@ ALdouble GetSourceOffset(ALsource *Source, ALenum name, ALCcontext *context)
|
||||
{
|
||||
ALuint FrameBlockSize{BufferFmt->OriginalAlign};
|
||||
ALuint align{(BufferFmt->OriginalAlign-1)/2 + 4};
|
||||
ALuint BlockSize{align * ChannelsFromFmt(BufferFmt->mFmtChannels)};
|
||||
ALuint BlockSize{align * BufferFmt->channelsFromFmt()};
|
||||
|
||||
/* Round down to nearest ADPCM block */
|
||||
offset = static_cast<ALdouble>(readPos / FrameBlockSize * BlockSize);
|
||||
@@ -357,14 +357,14 @@ ALdouble GetSourceOffset(ALsource *Source, ALenum name, ALCcontext *context)
|
||||
{
|
||||
ALuint FrameBlockSize{BufferFmt->OriginalAlign};
|
||||
ALuint align{(FrameBlockSize-2)/2 + 7};
|
||||
ALuint BlockSize{align * ChannelsFromFmt(BufferFmt->mFmtChannels)};
|
||||
ALuint BlockSize{align * BufferFmt->channelsFromFmt()};
|
||||
|
||||
/* Round down to nearest ADPCM block */
|
||||
offset = static_cast<ALdouble>(readPos / FrameBlockSize * BlockSize);
|
||||
}
|
||||
else
|
||||
{
|
||||
const ALuint FrameSize{FrameSizeFromFmt(BufferFmt->mFmtChannels, BufferFmt->mFmtType)};
|
||||
const ALuint FrameSize{BufferFmt->frameSizeFromFmt()};
|
||||
offset = static_cast<ALdouble>(readPos * FrameSize);
|
||||
}
|
||||
break;
|
||||
@@ -416,17 +416,17 @@ al::optional<VoicePos> GetSampleOffset(ALsource *Source)
|
||||
if(BufferFmt->OriginalType == UserFmtIMA4)
|
||||
{
|
||||
const ALuint align{(BufferFmt->OriginalAlign-1)/2 + 4};
|
||||
offset /= align * ChannelsFromFmt(BufferFmt->mFmtChannels);
|
||||
offset /= align * BufferFmt->channelsFromFmt();
|
||||
offset *= BufferFmt->OriginalAlign;
|
||||
}
|
||||
else if(BufferFmt->OriginalType == UserFmtMSADPCM)
|
||||
{
|
||||
const ALuint align{(BufferFmt->OriginalAlign-2)/2 + 7};
|
||||
offset /= align * ChannelsFromFmt(BufferFmt->mFmtChannels);
|
||||
offset /= align * BufferFmt->channelsFromFmt();
|
||||
offset *= BufferFmt->OriginalAlign;
|
||||
}
|
||||
else
|
||||
offset /= FrameSizeFromFmt(BufferFmt->mFmtChannels, BufferFmt->mFmtType);
|
||||
offset /= BufferFmt->frameSizeFromFmt();
|
||||
frac = 0;
|
||||
break;
|
||||
|
||||
@@ -2789,8 +2789,8 @@ START_API_FUNC
|
||||
ALbuffer *buffer{BufferList->mBuffer};
|
||||
voice->mFrequency = buffer->Frequency;
|
||||
voice->mFmtChannels = buffer->mFmtChannels;
|
||||
voice->mNumChannels = ChannelsFromFmt(buffer->mFmtChannels);
|
||||
voice->mSampleSize = BytesFromFmt(buffer->mFmtType);
|
||||
voice->mNumChannels = buffer->channelsFromFmt();
|
||||
voice->mSampleSize = buffer->bytesFromFmt();
|
||||
voice->mAmbiLayout = static_cast<AmbiLayout>(buffer->AmbiLayout);
|
||||
voice->mAmbiScaling = static_cast<AmbiNorm>(buffer->AmbiScaling);
|
||||
voice->mAmbiOrder = 1;
|
||||
|
||||
Reference in New Issue
Block a user