Hi there,

I am back and I have another release for you all. This time it's a big one!

First of all, due to API changes/renamings there will be breaking changes - so please read the changelog for "Breaking Changes" first, before upgrading to this version! Thanks.

As usual, the release is tagged (0.9.6-beta) and the documentation is updated.

To get the release I recommend cloning the repo from (https://github.com/f1nalspace/final_game_tech) and build the demos, to see if everything works for you.

Here are the major changes:

Bugfixes:

I fixed a ton of bugs, which were mostly related to Linux/UNIX/POSIX or X11 - including fplGetWallDelta(), which was incorrect.

Support for disabling the OS includes
In the previous versions of FPL, all OS includes such windows.h, pthread.h, x11.h has included in the header block always.
Now you can disable the inclusion using FPL_NO_PLATFORM_INCLUDES, so you can have pure FPL API without any OS defines.
This is very useful for big projects, which use FPL in multiple files ;)

FFMPEG demo now runs under Linux
The demo which uses FFmpeg to play and sync audio/video now works in Linux ;)



Huge improvement in FPL_Audio demo
I worked a lot on my audio demo to test my audio system on multiple platforms.
The demo can now buffer audio samples and have a nice way of detecting how fast the buffering needs to be.
Also, I finally fixed the FFT code and I now can render the FFT of the audio samples now. It's not perfect I know, but it's better than before.

So if you are a audio master, feel free to improve the FPL_Audio demo ;)



Thread parameters and priority
To support realtime priority for POSIX i added a new thread creation function which can initialize a thread with a priority at startup.
This was important to get more smooth audio playback on rasbperry pi and linux.

New demo: FPL_NBodySimulation
We have a new demo now which is based on one of my SPH simulations (https://github.com/f1nalspace/nbodysimulation_experiment).
It took me one evening to port it over and it runs fine. But there may be some bugs here and there - especially in the threading code, which uses std::thread shit.



More changes
Of course thats not all, to see all changes, please read the changelog or the project page (https://github.com/f1nalspace/final_game_tech/projects/3).

Full changelog
## v0.9.6-beta
### Features
- New[#73]: Added fplAsm macro to handle different inline assembler keywords (Clang, GCC, MSVC)
- New[#75]: Added fplAlignAs macro for aligning structures to N-bytes (Clang, GCC, MSVC, C++/11)
- New[#79]: Added function fplGetAudioDriver()
- New[#81]: Added function fplGetAudioBufferSizeInMilliseconds() to compute milliseconds from frame-count + sample-rate
- New[#85]: Added fpl*_First and fpl*_Last to every enum
- New[#84]: Added support for controlling the inclusion of platform includes with define FPL_NO_PLATFORM_INCLUDES
- New[#84]: Added support for use opaque handles instead of OS handles with define FPL_OPAQUE_HANDLES
- New[#75]: Added fplMinAlignment macro to get the minimum required alignment
- New[#90]: Added struct fplThreadParameters
- New[#90]: Added function fplThreadCreateWithParameters() which allows to set the stack size and the priority in the creation directly

- New[#51]: [POSIX] Implemented fplGetThreadPriority() and fplSetThreadPriority()
- New[#60]: [POSIX] Implemented fplGetCurrentThreadId()
- New[#90]: [POSIX] Implemented fplThreadCreateWithParameters()
- New[#90]: [Win32] Implemented fplThreadCreateWithParameters()
- New[#86]: [X11] Implemented fplEnableWindowFullscreen() and fplDisableWindowFullscreen()

### Improvements
- Changed: New Changelog format with categories (Features, bugfixes, improvements, breaking changes, internal changes)
- Changed[#74]: fplGetAudioDevices() allows to pass null-pointer as devices argument to return the number of audio devices only
- Changed[#74]: fplWideStringToUTF8String() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplUTF8StringToWideString() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplGetExecutableFilePath() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplGetHomePath() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplExtractFilePath() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplChangeFileExtension() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplPathCombine() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplFormatStringArgs() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplFormatString() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplGetCurrentUsername() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplGetDisplayModes() allows to pass null-pointer as output argument to return the number of modes only
- Changed[#74]: fplGetInputLocale() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplGetUserLocale() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplGetSystemLocale() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplGetProcessorName() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#63]: Replaced usage of fplStackAllocate() with fpl__AllocateTemporaryMemory()
- Changed[#92]: Use _offsetof() and ARRAY_SIZE() for fplArrayCount() instead
- Updated: Better documentation for fplAssert*

- Changed[#72]: [Win32] Query QueryPerformanceFrequency for every High-Precision timer calls instead of once per app start
- Changed[#84]: [Win32] Moved windows.h include to the implementation and entry point block (all handles are void* or have correct size)

### Bugfixes
- Fixed[#76]: FPL__ERROR, FPL__WARNING, FPL__INFO was not passing the correct function name and line number in some cases
- Fixed[#83]: fplGetAudioBufferSizeInFrames() does not return correct values always
- Fixed[#83]: fplGetAudioBufferSizeInMilliseconds() does not return correct values always
- Fixed[#94]: Fixed MINGW compile error for typo FPL_SUBPLATFORM_WINDOWS vs FPL_PLATFORM_WINDOWS (_WIN32_WINNT 0x0600)
- Fixed: Corrected a few code documentation translation bugs

- Fixed[#69]: [Win32] Removed the manual handling of ALT + F4 shut down of event handling
- Fixed[#87]: [POSIX] fplGetWallDelta() was returning incorrect values

### Internal changes
- Renamed a lot of internal FPL_ defines to FPL__

### Breaking changes
- Removed[#85]: Removed obsolete FPL_FIRST_* and FPL_LAST_* defines

- Renamed[#78]: fplGetAudioResultTypeString to fplGetAudioResultName
- Renamed[#78]: fplGetArchTypeString to fplCPUGetArchName
- Renamed[#78]: fplGetVideoDriverString to fplGetVideoDriverName
- Renamed[#78]: fplGetAudioDriverString to fplGetAudioDriverName
- Renamed[#78]: fplGetAudioFormatTypeString to fplGetAudioFormatName
- Renamed[#78]: fplGetPlatformResultTypeString to fplGetPlatformResultName

- Renamed[#50]: struct fplOSInfos to fplOSVersionInfos
- Renamed[#50]: fplGetCurrentUsername() to fplSessionGetUsername()
- Renamed[#50]: fplGetOperatingSystemInfos() to fplOSGetVersionInfos()
- Renamed[#50]: fplIsAtomicCompareAndSwapPtr() to fplAtomicIsCompareAndSwapPtr()
- Renamed[#50]: fplIsAtomicCompareAndSwapSize() to fplAtomicIsCompareAndSwapSize()
- Renamed[#50]: fplIsAtomicCompareAndSwapS64() to fplAtomicIsCompareAndSwapS64()
- Renamed[#50]: fplIsAtomicCompareAndSwapS32() to fplAtomicIsCompareAndSwapS32()
- Renamed[#50]: fplIsAtomicCompareAndSwapU64() to fplAtomicIsCompareAndSwapU64()
- Renamed[#50]: fplIsAtomicCompareAndSwapU32() to fplAtomicIsCompareAndSwapU32()
- Renamed[#50]: fplXCR0() to fplCPUXCR0()
- Renamed[#50]: fplRDTSC() to fplCPURDTSC()
- Renamed[#50]: fplGetArchName() to fplCPUGetArchName()
- Renamed[#50]: fplGetProcessorCoreCount() to fplCPUGetCoreCount()
- Renamed[#50]: fplGetProcessorName() to fplCPUGetName()
- Renamed[#50]: fplGetProcessorCapabilities() to fplCPUGetCapabilities()
- Renamed[#50]: fplGetProcessorArchitecture() to fplCPUGetArchitecture()
- Renamed[#50]: fplGetRunningMemoryInfos() to fplMemoryGetInfos()
- Renamed[#50]: struct fplProcessorCapabilities to fplCPUCapabilities
- Renamed[#50]: enum fplArchType to fplCPUArchType
- Renamed[#50]: enum values fplArchType_* to fplCPUArchType_

- Changed[#74]: fplWideStringToUTF8String() returns the number of characters instead of a char-pointer
- Changed[#74]: fplUTF8StringToWideString() returns the number of characters instead of a char-pointer
- Changed[#74]: fplGetExecutableFilePath() returns the number of characters instead of a char-pointer
- Changed[#74]: fplGetHomePath() returns the number of characters instead of a char-pointer
- Changed[#74]: fplExtractFilePath() returns the number of characters instead of a char-pointer
- Changed[#74]: fplChangeFileExtension() returns the number of characters instead of a char-pointer
- Changed[#74]: fplCopyString() returns the number of characters instead of a char-pointer
- Changed[#74]: fplCopyStringLen() returns the number of characters instead of a char-pointer
- Changed[#74]: fplPathCombine() returns the number of characters instead of a char-pointer
- Changed[#74]: fplFormatStringArgs() returns the number of characters instead of a char-pointer
- Changed[#74]: fplFormatString() returns the number of characters instead of a char-pointer
- Changed[#74]: fplGetCurrentUsername() returns the number of characters instead of a char-pointer
- Changed[#74]: fplGetInputLocale() returns the number of characters instead of a char-pointer
- Changed[#74]: fplGetUserLocale() returns the number of characters instead of a char-pointer
- Changed[#74]: fplGetSystemLocale() returns the number of characters instead of a char-pointer
- Changed[#74]: fplGetProcessorName() returns the number of characters instead of a char-pointer
- Changed[#74]: fplGetDisplayModeCount() -> Use fplGetDisplayModes() with null-pointer instead