Commit e511458e authored by David Reid's avatar David Reid

Inline some functions and clean up.

parent a2954dc1
...@@ -54,10 +54,10 @@ typedef struct ...@@ -54,10 +54,10 @@ typedef struct
mal_uint32 subbufferSizeInBytes; mal_uint32 subbufferSizeInBytes;
mal_uint32 subbufferCount; mal_uint32 subbufferCount;
mal_uint32 subbufferStrideInBytes; mal_uint32 subbufferStrideInBytes;
volatile mal_uint32 readOffset; /* Most significant bit is the loop flag. Lower 31 bits contains the actual offset in bytes. */ volatile mal_uint32 encodedReadOffset; /* Most significant bit is the loop flag. Lower 31 bits contains the actual offset in bytes. */
volatile mal_uint32 writeOffset; /* Most significant bit is the loop flag. Lower 31 bits contains the actual offset in bytes. */ volatile mal_uint32 encodedWriteOffset; /* Most significant bit is the loop flag. Lower 31 bits contains the actual offset in bytes. */
mal_bool32 ownsBuffer : 1; /* Used to know whether or not mini_al is responsible for free()-ing the buffer. */ mal_bool32 ownsBuffer : 1; /* Used to know whether or not mini_al is responsible for free()-ing the buffer. */
mal_bool32 clearOnWriteAcquire : 1; /* When set, clears the acquired write buffer before returning from mal_rb_acquire_write(). */ mal_bool32 clearOnWriteAcquire : 1; /* When set, clears the acquired write buffer before returning from mal_rb_acquire_write(). */
} mal_rb; } mal_rb;
mal_result mal_rb_init_ex(size_t subbufferSizeInBytes, size_t subbufferCount, size_t subbufferStrideInBytes, void* pOptionalPreallocatedBuffer, mal_rb* pRB); mal_result mal_rb_init_ex(size_t subbufferSizeInBytes, size_t subbufferCount, size_t subbufferStrideInBytes, void* pOptionalPreallocatedBuffer, mal_rb* pRB);
...@@ -77,30 +77,40 @@ void* mal_rb_get_subbuffer_ptr(mal_rb* pRB, size_t subbufferIndex, void* pBuffer ...@@ -77,30 +77,40 @@ void* mal_rb_get_subbuffer_ptr(mal_rb* pRB, size_t subbufferIndex, void* pBuffer
#endif // mal_ring_buffer_h #endif // mal_ring_buffer_h
#ifdef MINI_AL_IMPLEMENTATION #ifdef MINI_AL_IMPLEMENTATION
void* mal_rb__get_read_ptr(mal_rb* pRB) MAL_INLINE mal_uint32 mal_rb__extract_offset_in_bytes(mal_uint32 encodedOffset)
{
return encodedOffset & 0x7FFFFFFF;
}
MAL_INLINE mal_uint32 mal_rb__extract_offset_loop_flag(mal_uint32 encodedOffset)
{
return encodedOffset & 0x80000000;
}
MAL_INLINE void* mal_rb__get_read_ptr(mal_rb* pRB)
{ {
mal_assert(pRB != NULL); mal_assert(pRB != NULL);
return mal_offset_ptr(pRB->pBuffer, (pRB->readOffset & 0x7FFFFFFF)); return mal_offset_ptr(pRB->pBuffer, mal_rb__extract_offset_in_bytes(pRB->encodedReadOffset));
} }
void* mal_rb__get_write_ptr(mal_rb* pRB) MAL_INLINE void* mal_rb__get_write_ptr(mal_rb* pRB)
{ {
mal_assert(pRB != NULL); mal_assert(pRB != NULL);
return mal_offset_ptr(pRB->pBuffer, (pRB->writeOffset & 0x7FFFFFFF)); return mal_offset_ptr(pRB->pBuffer, mal_rb__extract_offset_in_bytes(pRB->encodedWriteOffset));
} }
mal_uint32 mal_rb__construct_offset(mal_uint32 offsetInBytes, mal_uint32 offsetLoopFlag) MAL_INLINE mal_uint32 mal_rb__construct_offset(mal_uint32 offsetInBytes, mal_uint32 offsetLoopFlag)
{ {
return offsetLoopFlag | offsetInBytes; return offsetLoopFlag | offsetInBytes;
} }
void mal_rb__deconstruct_offset(mal_uint32 offset, mal_uint32* pOffsetInBytes, mal_uint32* pOffsetLoopFlag) MAL_INLINE void mal_rb__deconstruct_offset(mal_uint32 encodedOffset, mal_uint32* pOffsetInBytes, mal_uint32* pOffsetLoopFlag)
{ {
mal_assert(pOffsetInBytes != NULL); mal_assert(pOffsetInBytes != NULL);
mal_assert(pOffsetLoopFlag != NULL); mal_assert(pOffsetLoopFlag != NULL);
*pOffsetInBytes = offset & 0x7FFFFFFF; *pOffsetInBytes = mal_rb__extract_offset_in_bytes(encodedOffset);
*pOffsetLoopFlag = offset & 0x80000000; *pOffsetLoopFlag = mal_rb__extract_offset_loop_flag(encodedOffset);
} }
...@@ -168,12 +178,12 @@ mal_result mal_rb_acquire_read(mal_rb* pRB, size_t* pSizeInBytes, void** ppBuffe ...@@ -168,12 +178,12 @@ mal_result mal_rb_acquire_read(mal_rb* pRB, size_t* pSizeInBytes, void** ppBuffe
} }
// The returned buffer should never move ahead of the write pointer. // The returned buffer should never move ahead of the write pointer.
mal_uint32 writeOffset = pRB->writeOffset; mal_uint32 writeOffset = pRB->encodedWriteOffset;
mal_uint32 writeOffsetInBytes; mal_uint32 writeOffsetInBytes;
mal_uint32 writeOffsetLoopFlag; mal_uint32 writeOffsetLoopFlag;
mal_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag); mal_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag);
mal_uint32 readOffset = pRB->readOffset; mal_uint32 readOffset = pRB->encodedReadOffset;
mal_uint32 readOffsetInBytes; mal_uint32 readOffsetInBytes;
mal_uint32 readOffsetLoopFlag; mal_uint32 readOffsetLoopFlag;
mal_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag); mal_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag);
...@@ -209,7 +219,7 @@ mal_result mal_rb_commit_read(mal_rb* pRB, size_t sizeInBytes, void* pBufferOut) ...@@ -209,7 +219,7 @@ mal_result mal_rb_commit_read(mal_rb* pRB, size_t sizeInBytes, void* pBufferOut)
return MAL_INVALID_ARGS; return MAL_INVALID_ARGS;
} }
mal_uint32 readOffset = pRB->readOffset; mal_uint32 readOffset = pRB->encodedReadOffset;
mal_uint32 readOffsetInBytes; mal_uint32 readOffsetInBytes;
mal_uint32 readOffsetLoopFlag; mal_uint32 readOffsetLoopFlag;
mal_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag); mal_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag);
...@@ -227,7 +237,7 @@ mal_result mal_rb_commit_read(mal_rb* pRB, size_t sizeInBytes, void* pBufferOut) ...@@ -227,7 +237,7 @@ mal_result mal_rb_commit_read(mal_rb* pRB, size_t sizeInBytes, void* pBufferOut)
newReadOffsetLoopFlag ^= 0x80000000; newReadOffsetLoopFlag ^= 0x80000000;
} }
mal_atomic_exchange_32(&pRB->readOffset, mal_rb__construct_offset(newReadOffsetLoopFlag, newReadOffsetInBytes)); mal_atomic_exchange_32(&pRB->encodedReadOffset, mal_rb__construct_offset(newReadOffsetLoopFlag, newReadOffsetInBytes));
return MAL_SUCCESS; return MAL_SUCCESS;
} }
...@@ -238,12 +248,12 @@ mal_result mal_rb_acquire_write(mal_rb* pRB, size_t* pSizeInBytes, void** ppBuff ...@@ -238,12 +248,12 @@ mal_result mal_rb_acquire_write(mal_rb* pRB, size_t* pSizeInBytes, void** ppBuff
} }
// The returned buffer should never overtake the read buffer. // The returned buffer should never overtake the read buffer.
mal_uint32 readOffset = pRB->readOffset; mal_uint32 readOffset = pRB->encodedReadOffset;
mal_uint32 readOffsetInBytes; mal_uint32 readOffsetInBytes;
mal_uint32 readOffsetLoopFlag; mal_uint32 readOffsetLoopFlag;
mal_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag); mal_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag);
mal_uint32 writeOffset = pRB->writeOffset; mal_uint32 writeOffset = pRB->encodedWriteOffset;
mal_uint32 writeOffsetInBytes; mal_uint32 writeOffsetInBytes;
mal_uint32 writeOffsetLoopFlag; mal_uint32 writeOffsetLoopFlag;
mal_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag); mal_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag);
...@@ -285,7 +295,7 @@ mal_result mal_rb_commit_write(mal_rb* pRB, size_t sizeInBytes, void* pBufferOut ...@@ -285,7 +295,7 @@ mal_result mal_rb_commit_write(mal_rb* pRB, size_t sizeInBytes, void* pBufferOut
return MAL_INVALID_ARGS; return MAL_INVALID_ARGS;
} }
mal_uint32 writeOffset = pRB->writeOffset; mal_uint32 writeOffset = pRB->encodedWriteOffset;
mal_uint32 writeOffsetInBytes; mal_uint32 writeOffsetInBytes;
mal_uint32 writeOffsetLoopFlag; mal_uint32 writeOffsetLoopFlag;
mal_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag); mal_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag);
...@@ -303,7 +313,7 @@ mal_result mal_rb_commit_write(mal_rb* pRB, size_t sizeInBytes, void* pBufferOut ...@@ -303,7 +313,7 @@ mal_result mal_rb_commit_write(mal_rb* pRB, size_t sizeInBytes, void* pBufferOut
newWriteOffsetLoopFlag ^= 0x80000000; newWriteOffsetLoopFlag ^= 0x80000000;
} }
mal_atomic_exchange_32(&pRB->writeOffset, mal_rb__construct_offset(newWriteOffsetLoopFlag, newWriteOffsetInBytes)); mal_atomic_exchange_32(&pRB->encodedWriteOffset, mal_rb__construct_offset(newWriteOffsetLoopFlag, newWriteOffsetInBytes));
return MAL_SUCCESS; return MAL_SUCCESS;
} }
...@@ -313,12 +323,12 @@ mal_result mal_rb_seek_read(mal_rb* pRB, size_t offsetInBytes) ...@@ -313,12 +323,12 @@ mal_result mal_rb_seek_read(mal_rb* pRB, size_t offsetInBytes)
return MAL_INVALID_ARGS; return MAL_INVALID_ARGS;
} }
mal_uint32 readOffset = pRB->readOffset; mal_uint32 readOffset = pRB->encodedReadOffset;
mal_uint32 readOffsetInBytes; mal_uint32 readOffsetInBytes;
mal_uint32 readOffsetLoopFlag; mal_uint32 readOffsetLoopFlag;
mal_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag); mal_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag);
mal_uint32 writeOffset = pRB->writeOffset; mal_uint32 writeOffset = pRB->encodedWriteOffset;
mal_uint32 writeOffsetInBytes; mal_uint32 writeOffsetInBytes;
mal_uint32 writeOffsetLoopFlag; mal_uint32 writeOffsetLoopFlag;
mal_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag); mal_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag);
...@@ -343,7 +353,7 @@ mal_result mal_rb_seek_read(mal_rb* pRB, size_t offsetInBytes) ...@@ -343,7 +353,7 @@ mal_result mal_rb_seek_read(mal_rb* pRB, size_t offsetInBytes)
} }
} }
mal_atomic_exchange_32(&pRB->readOffset, mal_rb__construct_offset(newReadOffsetInBytes, newReadOffsetLoopFlag)); mal_atomic_exchange_32(&pRB->encodedReadOffset, mal_rb__construct_offset(newReadOffsetInBytes, newReadOffsetLoopFlag));
return MAL_SUCCESS; return MAL_SUCCESS;
} }
...@@ -353,12 +363,12 @@ mal_result mal_rb_seek_write(mal_rb* pRB, size_t offsetInBytes) ...@@ -353,12 +363,12 @@ mal_result mal_rb_seek_write(mal_rb* pRB, size_t offsetInBytes)
return MAL_INVALID_ARGS; return MAL_INVALID_ARGS;
} }
mal_uint32 readOffset = pRB->readOffset; mal_uint32 readOffset = pRB->encodedReadOffset;
mal_uint32 readOffsetInBytes; mal_uint32 readOffsetInBytes;
mal_uint32 readOffsetLoopFlag; mal_uint32 readOffsetLoopFlag;
mal_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag); mal_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag);
mal_uint32 writeOffset = pRB->writeOffset; mal_uint32 writeOffset = pRB->encodedWriteOffset;
mal_uint32 writeOffsetInBytes; mal_uint32 writeOffsetInBytes;
mal_uint32 writeOffsetLoopFlag; mal_uint32 writeOffsetLoopFlag;
mal_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag); mal_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag);
...@@ -383,7 +393,7 @@ mal_result mal_rb_seek_write(mal_rb* pRB, size_t offsetInBytes) ...@@ -383,7 +393,7 @@ mal_result mal_rb_seek_write(mal_rb* pRB, size_t offsetInBytes)
} }
} }
mal_atomic_exchange_32(&pRB->writeOffset, mal_rb__construct_offset(newWriteOffsetInBytes, newWriteOffsetLoopFlag)); mal_atomic_exchange_32(&pRB->encodedWriteOffset, mal_rb__construct_offset(newWriteOffsetInBytes, newWriteOffsetLoopFlag));
return MAL_SUCCESS; return MAL_SUCCESS;
} }
...@@ -393,12 +403,12 @@ mal_int32 mal_rb_pointer_distance(mal_rb* pRB) ...@@ -393,12 +403,12 @@ mal_int32 mal_rb_pointer_distance(mal_rb* pRB)
return 0; return 0;
} }
mal_uint32 readOffset = pRB->readOffset; mal_uint32 readOffset = pRB->encodedReadOffset;
mal_uint32 readOffsetInBytes; mal_uint32 readOffsetInBytes;
mal_uint32 readOffsetLoopFlag; mal_uint32 readOffsetLoopFlag;
mal_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag); mal_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag);
mal_uint32 writeOffset = pRB->writeOffset; mal_uint32 writeOffset = pRB->encodedWriteOffset;
mal_uint32 writeOffsetInBytes; mal_uint32 writeOffsetInBytes;
mal_uint32 writeOffsetLoopFlag; mal_uint32 writeOffsetLoopFlag;
mal_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag); mal_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment