FAudio - Accuracy-focused XAudio reimplementation for open platforms

Overview
This is FAudio, an XAudio reimplementation that focuses solely on developing
fully accurate DirectX Audio runtime libraries for the FNA project, including
XAudio2, X3DAudio, XAPO, and XACT3.

Project Website: https://fna-xna.github.io/

License
-------
FAudio is released under the zlib license. See LICENSE for details.

About FAudio
------------
FAudio was written to be used for FNA's Audio/Media namespaces. We access this
library via FAudio#, which you can find in the 'csharp/' directory.

Dependencies
------------
FAudio depends solely on SDL 2.0.9 or newer.
FAudio never explicitly uses the C runtime.

Building FAudio
---------------
For *nix platforms, use cmake.

    $ mkdir build/
    $ cd build/
    $ cmake ../
    $ make

For Windows, see the 'visualc/' directory.

For Xbox One, see the 'visualc-winrt/' directory.

For iOS/tvOS, see the 'Xcode-iOS/' directory.

Unit tests
----------
FAudio includes a set of unit tests which document the behavior of XAudio2 and
are to be run against FAudio to verify it has the same behavior. The tests are
NOT built by default; set BUILD_TESTS=1 to build and then run the output with:

    $ ./faudio_tests

To build a Windows executable to run the tests against XAudio2, use the
provided Makefile. This requires mingw-w64 to build.

    $ cd tests/
    $ make faudio_tests.exe
    # run faudio_tests.exe on a Windows box

Found an issue?
---------------
Issues and patches can be reported via GitHub:

https://github.com/FNA-XNA/FAudio/issues
Comments
  • [WIP] Improved gstreamer support

    [WIP] Improved gstreamer support

    This isn't quite ready to merge, but it's close. With this branch, I get good audio from Skyrim with gst-libav's WMA decoder. Further testing with games you were trying before is appreciated.

    First commit is the WMA test I used to verify behavior with xaudio2. I don't think it's important to merge it, but I put it here if you want to run some tests. The important points I discovered are:

    -WMA does allow skipping some of the start of the buffer (i.e. PlayBegin is respected).

    -WMA does not allow looping arbitrarily. It always loops back to the start and plays to the end, no matter what you set the Loop variables to.

    -Having incorrect pDecodedPacketCumulativeBytes values does not break decoding. It does limit the total decoded length to the last value, which is how these types of codecs often work (encode whole blocks and truncate the final block to get the right length).

    The 2nd commit is your unchanged gstreamer commit. We can merge things down when it's ready to go.

    The 3rd commit fixes the build system so it builds correctly in Proton. I was having issues with it finding the gstreamer installation. I'm not very good with CMake, so I probably did this wrong. In particular, the PkgConfig:: I think requires a later version of CMake than the CMakeList currently requires. Help here is appreciated.

    The 4th commit implements the loop behavior I mentioned above.

    The final commit rewrites much of the gstreamer algorithm. I won't recap the whole algorithm, but here are some important points:

    -WMA is a stateful decoder, so we can't just hop around with random access. We must decode sequentially.

    -But, because FAudio requires some amount of random access (mostly that 2 sample "fuck it" quirk), I store both the current and previous decoded chunks. I think this is sufficient.

    -We now reset the decoder when looping. I'm not sure whether this is correct, but it makes sense to me.

    -We're now using decodebin to let gstreamer select the codec for us.

    -We limit the full amount of decoded samples to the last pDecodedPacketCumulativeBytes value, which I think matches native.

    -Instead of using the pDecodedPacketCumulativeBytes values we get from the application, we depend on the decoder to give us the actual block sizes, and seek based on that.

    There is one ugly hack that I wonder if you have a solution for. I store the actual decoded-samples values mentioned above in the blockSizes array, and use that for finding the current buffer requested by FAudio. But, we need to clear and re-size this array when we get a new buffer in. Currently I'm just using the value of the pointer to see if we get a new buffer incoming, but that feels super ugly. Is there some better way to tell this gstreamer code that we have a new buffer and should forget what we know about the old buffer?

    opened by aeikum 41
  • cmake: add cpp wrapper

    cmake: add cpp wrapper

    tested with x86_64-mingw-w64 on Arch linux

    but the Tools subdir won't build for me on mingw. And I don't know how to build the wine cpp wrappers under linux

    opened by NeroBurner 38
  • F3DAudio

    F3DAudio "beta"

    All the matrix computation cases are handled, including multi-channel emitters, REDIRECT_TO_LFE / ZERO_CENTER, cones and custom curves. Done some manual testing and everything was giving good values (with differences due to the fact that I lerp everywhere) and out of the right speakers, so it's a good candidate for a field test. Non-implemented features (LPF / Reverb) have a minimal implementation that sets values, so an uninitialized input structure wouldn't come out with garbage. As such it can be tested with the COM wrapper as well and nothing should blow up.

    opened by lamarqua 33
  • Fallout 4 (Proton/Steamplay 3.16) with built FAudio & FFMPEG support crashes after some specific occurences.

    Fallout 4 (Proton/Steamplay 3.16) with built FAudio & FFMPEG support crashes after some specific occurences.

    I don't know how to debug this, but I thought I'd make an issue report. Not used to github, so please excuse me for the lack of information.

    Using latest steam/steamplay on Arch (Fully updated). Used commit 879.

    Built FAudio with FFMPEG support and installed using install_fake_dlls to proper directories in the fallout directory (pfx).

    Sound works, music works, voices works. Everything works. There's a bit of audio clipping while entering terminal, but that's another issue. I'm not a proffessional, but I can't hear the difference using FAudio and XAudio, so good work!

    Anyway, when using fast travel or entering a sanctuary (in my case, the Castle) the game will freeze. It's not reproducible with XAudio. This happens every time, no matter how I try to enter. It seems there's a specific line I cross from one region over to another (In this case, the castle), and the text should show up "Now entering The Castle". On the same spot, the same pixel evel, the game will crash.

    Thunder, etc. works with FAudio though, did not with XAudio (sound would dissapear).

    Shooting a missile at a group of raiders/mutants/etc will sometimes freeze the game using FAudio (when there's too many sounds on screen it seems. Same as XAudio, except that XAudio would just dissapear. Using FAudio and the game freezes). This happens frequently.

    Fast traveling. Whenever I use fast travel, the loading screen comes up (I have just tested it on a few locations...sanctuaries. Might just be sanctuary related) and it completes the loading. Just when it's about to change from loading screen to game screen, the game freezes. This happens every time.

    No output in terminal. Just game executable removed.

    opened by mikedebian 27
  • F3DAUDIO_CALCULATE_REDIRECT_TO_LFE issue

    F3DAUDIO_CALCULATE_REDIRECT_TO_LFE issue

    https://github.com/FNA-XNA/FAudio/blob/f7a0ce7e84933ea4913ca130d74cd39e5c080259/src/F3DAudio.c#L1127

    The ComputeEmitterChannelCoefficients function does not take into acount LFEDistanceCurve. Maybe this line should look like: pMatrixCoefficients[ curConfig->LFSpeakerIdx * numSrcChannels + currentChannel ] += LFEattenuation;

    The comment in CalculateMatrix function seems to be true /* TODO: this could be skipped if the destination has no LFE */ :+1: It really skipped for none multi-channel emitters..

    opened by morffiy 25
  • libav does not decode correct sample block size

    libav does not decode correct sample block size

    I finally figured out what's causing all that racket with WMA/XMA streams. This one's for @aeikum (wrote the original FFmpeg work), @0x0ade (XMA), @GloriousEggroll (Warframe), and @JohanSmet (wrote the most recent FAudio FFmpeg work).

    A quick overview of how the decoding system works: When a buffer is submitted we receive not just the data itself, but the amount of data we can get (measured in samples). So when we decode, we ask for exactly the number of samples we need based on the quantum size until the end, where the number will be a little bit smaller. In either case, the decoder always provides the exact number of samples we request because we always know how many samples are available without the decoder's assistance.

    FFmpeg isn't playing by the rules. In particular, we're hitting this line which should never ever happen:

    https://github.com/FNA-XNA/FAudio/blob/master/src/FAudio_ffmpeg.c#L382

    Here's the quick version:

    • Mixer asks for, say, 512 samples
    • We read in from FFmpeg, filling the convert cache as needed
    • FFmpeg gives us less than the total sample block size, but also claims we're out of samples
    • available is 0, breaks
    • todo is less than samples, resulting in uninitialized memory at the end
    • R̫̘̜̕E̼͈̭̬̥A҉͔͙̪̞̘͈L̰ ̕G̜̳̱̯̱͈̰O̼̯͓̻͓͚O̢̼̥̮͍̝D̶ ͔̰̜͚͔S̭̗͚͈͞O͇̺̻̹̲͍U̝̦͕̺̳͍̺Ṋ̼̹̼̤D̫͈͉̹S̗̳̭͔̝̭̕

    Eggroll has it in Warframe, I have it in Skyrim SE. We need to figure out how to make FFmpeg cooperate and actually give us all the samples. We can't leave without the full size, because then you just get skipping, which is more pleasant-sounding but still very wrong.

    Anyone have any ideas? I'm not terribly familiar with FFmpeg so I don't know if there's a trick to making decoding consistent. Sadly it's not 100% consistent, but it's very easy to reproduce with those two games.

    Not our bug - WMA 
    opened by flibitijibibo 25
  • Replace Makefile with CMake

    Replace Makefile with CMake

    I think enough cases have come up to consider replacing the Makefile... Typically I just write a handwritten Makefile because there's not much you're meant to do with the library, but FAudio has run into WAY more use cases than anything I've ever built before, so CMake is starting to make a little more sense now. There are many reasons for this, including easy Debug/Release configuration, a clear options list (FFmpeg, XNA_Song, etc), improving the utils/ builds, and if we can, integrating the cpp/ folder's builds.

    Note that this is replacing ONLY the Makefiles. The VS/Xcode projects will stay as-is. (Maik, I'll still take the Android.mk if that's still useful)

    I wrote up a basic file that covers the core sources, with a bunch of TODOs to fill in:

    https://github.com/FNA-XNA/FAudio/tree/cmake

    A bunch of people are involved, so here's a list so everyone has an idea of what's going on:

    • Myself and @aeikum need this to work not just with Proton's build system, but with the needs of the various Linux distributions. If we're going to integrate FAudio into Wine, we need to make it easy for distros to package FAudio first. @GloriousEggroll has been working on the Proton build with FAudio's Makefile and has been hacking my build files to death, so we have a decent idea of what we need to fix to make that happen.
    • @JohanSmet wrote the build system for the COM wrapper and Wine DLL; thankfully the two aren't wildly different but they do have some specific needs that have to be introduced just for those files somehow. @GloriousEggroll was playing with this a lot for Warframe, before we started looking at the Proton build.
    • @cybik and @NeroBurner actually wrote their own CMake projects already, we just need to write a new CMakeLists.txt that covers the whole repo, not just the core FAudio sources.

    As far as mandatory requirements go, we're stuck supporting Debian's criminally old CMake version, 3.7. Yes, it really is that old. Aside from this limitation, there aren't really any hard rules I can think of.

    I'm currently stuck on the code side of things, but I know a lot of people were getting frustrated with my crappy old build system so I thought I'd open this up for anyone who's ready to throw it in the dumpster.

    Checklist:

    • [x] libFAudio
    • [x] utils
    • [x] tests
    • [x] cpp (MinGW only)
    • [x] FFmpeg
    opened by flibitijibibo 25
  • Bloodstained no longer starts with 19.09

    Bloodstained no longer starts with 19.09

    OS: Slackware64-current FAudio: https://github.com/FNA-XNA/FAudio/commit/705f2cd5b399f1ed5e8cba310c999381705f3640 wine: 4.15 alsa-lib: 1.1.9 SDL: 2.0.10 game: Bloodstained-1.05 (GOG version)

    After I upgraded FAudio to 19.09 from 19.08 I found that the game Bloodstained no longer starts. I next confirmed that its still broken in the current master (https://github.com/FNA-XNA/FAudio/commit/705f2cd5b399f1ed5e8cba310c999381705f3640) and then bisected the issue.

    464050b54b977bfbc5b4004257c4d547de50e4bd is the first bad commit
    commit 464050b54b977bfbc5b4004257c4d547de50e4bd
    Author: Ethan Lee <[email protected]>
    Date:   Fri Aug 2 01:24:28 2019 -0400
    
        Refactor PlatformInit/Quit to not use FAudio internals, add 1024_QUANTUM
    
     csharp/FAudio.cs           | 20 ++++++++++----------
     include/FAudio.h           | 18 +++++++++---------
     src/FAudio.c               | 24 ++++++++++++++++++++++--
     src/FAudio_internal.h      | 14 ++++++++++++--
     src/FAudio_platform_sdl2.c | 42 +++++++++++++++++++++++++++---------------
     5 files changed, 80 insertions(+), 38 deletions(-)
    

    464050b54b977bfbc5b4004257c4d547de50e4bd

    The game fails with this output, please let me know if there are any more info I can provide or patches I can try.

    001b:err:plugplay:load_function_driver AddDevice failed for driver L"winebus", status 0xc0000002.
    0038:fixme:ver:GetCurrentPackageId (0x5d5fda0 (nil)): stub
    003c:err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Make sure that ntlm_auth >= 3.0.25 is in your path. Usually, you can find it in the winbind package of your distribution.
    003c:fixme:sync:SetWaitableTimerEx (00000000000001B4, 000000000671F160, 0, 0000000000000000, 0000000000000000, 0000000000000000, 32) semi-stub
    002d:fixme:gameux:GameExplorerImpl_VerifyAccess (00000000000E3710, L"C:\\GOG Games\\Bloodstained Ritual of the Night\\BloodstainedRotN\\Binaries\\Win64\\BloodstainedRotN-Win64-Shipping.exe", 00000000005FEB58)
    002d:fixme:win:DisableProcessWindowsGhosting : stub
    002d:fixme:msctf:InputProcessorProfileMgr_GetActiveProfile (00000000000F9A70)->({34745c63-b2f0-4784-8b67-5e12c8701a31} 00000000005FF200)
    002d:fixme:system:SystemParametersInfoW Unimplemented action: 59 (SPI_SETSTICKYKEYS)
    002d:fixme:system:SystemParametersInfoW Unimplemented action: 53 (SPI_SETTOGGLEKEYS)
    002d:fixme:system:SystemParametersInfoW Unimplemented action: 51 (SPI_SETFILTERKEYS)
    002d:fixme:dxgi:DXGID3D10CreateDevice Ignoring flags 0x1.
    002d:fixme:d3d11:d3d11_device_CheckFeatureSupport Returning fake threading support data.
    002d:fixme:win:RegisterTouchWindow (0x4006c 00000000): stub
    002d:fixme:vcruntime:__telemetry_main_invoke_trigger (0000000011C40000)
    002d:fixme:vcruntime:__telemetry_main_invoke_trigger (000000001CB80000)
    002d:fixme:vcruntime:__telemetry_main_invoke_trigger (0000000012830000)
    INFO: OpenAudioDevice failed: ALSA: Couldn't open audio device: Device or resource busy
    0065:fixme:win:DisableProcessWindowsGhosting : stub
    0065:fixme:msctf:InputProcessorProfileMgr_GetActiveProfile (00000000000711D0)->({34745c63-b2f0-4784-8b67-5e12c8701a31} 00000000005FF2B0)
    0065:fixme:system:SystemParametersInfoW Unimplemented action: 59 (SPI_SETSTICKYKEYS)
    0065:fixme:system:SystemParametersInfoW Unimplemented action: 53 (SPI_SETTOGGLEKEYS)
    0065:fixme:system:SystemParametersInfoW Unimplemented action: 51 (SPI_SETFILTERKEYS)
    0065:fixme:dxgi:DXGID3D10CreateDevice Ignoring flags 0x1.
    0065:err:d3dcompiler:compile_shader HLSL shader parsing failed.
    0065:err:d3dcompiler:compile_shader HLSL shader parsing failed.
    0065:fixme:dwmapi:DwmIsCompositionEnabled 00000000005FF078
    0065:fixme:win:RegisterTouchWindow (0x2009e 00000000): stub
    0065:fixme:dwmapi:DwmSetWindowAttribute (000000000002009E, 2, 00000000005FF0DC, 4) stub
    0009:fixme:kernelbase:AppPolicyGetProcessTerminationMethod FFFFFFFFFFFFFFFA, 000000000060FCF0
    
    opened by orbea 22
  • Misaligned addresses for `pDSPSettings` in armhf/mono.

    Misaligned addresses for `pDSPSettings` in armhf/mono.

    This causes a SIGSEGV in Bleed 2 (armhf, mono git e1002857) trying to deref the aliased pointers to the ListenerVelocityComponent and EmitterVelocityComponent members of pDSPSettings in CalculateDoppler.

    at <unknown> <0xffffffff>
    at FAudio:FACT3DCalculate <0x00043>
    at Microsoft.Xna.Framework.Audio.Cue:Apply3D <0x000db>
    at LoopingCue:set_LeftToRightPan <0x0021f>
    at LoopingCue:.ctor <0x0015f>
    at Bleed_II.IJCAudioEngine:CreateLoopingCue <0x001cb>
    <...>
    

    I am unsure what mechanism causes this to happen, but a few things have successfuly worked around this crash:

    • Setting Pack = 4 on related classes. (ABI breakage :/)
    • Casting listenerVelocityComponent, emitterVelocityComponent and DopplerFactor to float __attribute__((aligned(1))). (Absolutely evil...)
    • Adding [StructLayout(LayoutKind.Sequential, Pack = 4)] to SoundBank.

    p.s.: The game still presents a ringing sound artifact during the first level - the same artifact is also reproduced on an unaltered build on AArch64 where the crash doesn't happen. Couldn't reproduce the artifact on amd64 tho, but also didn't investigate it yet.

    opened by JohnnyonFlame 21
  • Multiple 32-bit games have stuttering issue

    Multiple 32-bit games have stuttering issue

    @JohanSmet Duplicating report from Wine Bugzilla

    diff --git a/src/FAudioFX_reverb.c b/src/FAudioFX_reverb.c
    index bd58a06..b125b5f 100644
    --- a/src/FAudioFX_reverb.c
    +++ b/src/FAudioFX_reverb.c
    @@ -101,7 +101,7 @@ static inline void DspDelay_Change(DspDelay *filter, float delay_ms)
     
     	/* Length */
     	filter->delay = MsToSamples(delay_ms, filter->sampleRate);
    -	filter->read_idx = (filter->write_idx - filter->delay + filter->capacity) % filter->capacity;
    +	filter->read_idx = (filter->write_idx + filter->delay + filter->capacity) % filter->capacity;
     }
     
     static inline float DspDelay_Read(DspDelay *filter)
    

    Patch tested with Sniper Elite 3, Resident Evil 0 HD Remaster, Homesick. Behaviour with non-affected games needs to be checked but it shouldn't be worse.

    opened by grapeharvest 20
  • [F3DAudio] Bulletstorm: Full Clip Edition

    [F3DAudio] Bulletstorm: Full Clip Edition

    Hi,

    first of all thank you very much for bringing in a replacement for xact. I wanted to give it a try with Bulletstomr Full Clip Edition, as this game is having bad sound issue with the current wine builtin dll's and also using the native ones with wine does not work.

    Using the mingw compiled Faudio dlls, i can get into the menu of the game and the sound is fine, i can lower/raise the different sound levels (music, environement and voices) in the sound menu of the game.

    Trying to get into a mission i get the following error message:

    Assertion failure at F3DAudioCheckCalculateParams (src/F3DAudio.c:342), triggered 1 time: 'pDSPSettings->DstChannelCount == ChannelCount && "Invalid channel count, DSP settings and speaker configuration must agree"'

    After being able to klick on ignore, the following error message shows up:

    Assertion failure at F3DAudioCalculate (src/F3DAudio.c:1502), triggered 1 time: '0 && "REVERB not implemented!"'

    I can also press ignore here, but the game finally crashes after ignoring both issues 2 times

    Many thanks ! Christian

    opened by pingubot 17
  • FFXIV Endwalker Benchmark no audio and crashes in xaudio2_7 on exit

    FFXIV Endwalker Benchmark no audio and crashes in xaudio2_7 on exit

    (Identically reported to https://bugs.winehq.org/show_bug.cgi?id=53799 in case this is just a wine problem)

    The application in question can be downloaded from https://jp.finalfantasyxiv.com/benchmark/download/ (Direct link: https://download.finalfantasyxiv.com/ys8glaimvmykn88p/ffxiv-endwalker-bench.zip)

    It can be executed with the following command line (not enough arguments to fully configure the benchmark, but enough to demonstrate the problem):

    wine game/ffxiv_dx11.exe SYS.Language=1
    

    When the application is running, no audio is heard when there should be audio. And when it exits (such as closing the window, pressing ESC, or letting it finish), it will segfault in xaudio2_7 with the following backtrace (full output):

    =>0 0x00000242e0aeac FAudio_AudioClientThread+0xcc(user=00000000010301B0) [Z:\tmp\wine-src\libs\faudio\src\FAudio_platform_win32.c:190] in xaudio2_7 (0000000000000000)
      1 0x0000007b629109 BaseThreadInitThunk+0x9(unknown=<internal error>, entry=<internal error>, arg=<internal error>) [Z:\tmp\wine-src\dlls\kernel32\thread.c:61] in kernel32 (0000000000000000)
      2 0x0000017005eda3 __wine_pop_frame(entry=0000000242E0ADE0, arg=00000000010301B0) [Z:\tmp\wine-src\include\wine\exception.h:277] in ntdll (0000000000000000)
      3 0x0000017005eda3 RtlUserThreadStart+0x83(entry=[<register RSP not accessible in this frame>, arg=[<register RSP not accessible in this frame>) [Z:\tmp\wine-src\dlls\ntdll\thread.c:240] in ntdll (0000000000000000)
    0x00000242e0aeac FAudio_AudioClientThread+0xcc [Z:\tmp\wine-src\libs\faudio\src\FAudio_platform_win32.c:190] in xaudio2_7: movq (%rcx),%rax
    190             FAudio_assert(!FAILED(hr) && "Failed to stop IAudioClient!");
    

    This was run in a clean WINEPREFIX with wine-7.19 freshly built from source.

    If I use winetricks to install xact_x64 (i.e., bypassing FAudio), the crash goes away, but there is still no audio output

    Wine 
    opened by kotarou3 0
  • Add GitHub Actions

    Add GitHub Actions

    • [ ] Windows (MSVC)
    • [ ] Windows (MinGW)
    • [ ] Wine (MinGW with Win32 backend)
    • [ ] Linux (can just be ubuntu-latest)
    • [ ] macOS CMake (TODO: macOS Xcode)
    • [ ] iOS/tvOS
    • [ ] WinRT
    • [ ] GDK
    • [ ] FreeBSD (take from SDL)
    Bug 
    opened by flibitijibibo 0
  • Assertion failed, no output channels

    Assertion failed, no output channels

    Assertion failed: voice->outputChannels > 0 && voice->outputChannels < 9, file FAudio\src\FAudio.c, line 1227 Running on Windows (v10.0.19044.0) X64 NetCore 6.0.5

    FAudio built with the win32 (windows media feature pack) backend. User reports that disabling https://www.voicemod.net/ fixed the crashes. User experiences issue after random amount of playtime, not at startup.

    I'm assuming that outputChannels == 0, will attempt to confirm.

    FAudio should run silently if there are no output channels rather than crash, looking for some pointers where to start on this.

    On a related note, FAudio currently doesn't recover from AUDCLNT_E_DEVICE_INVALIDATED which can be returned from most IAudioClient methods. Unfortunately the audio device is baked into the audio thread, so I'm not sure on a good place to implement the recovery process mentioned in https://docs.microsoft.com/en-us/windows/win32/coreaudio/recovering-from-an-invalid-device-error

    Bug Wine 
    opened by Chicken-Bones 2
  • Update stb_vorbis

    Update stb_vorbis

    New version dropped yesterday:

    https://github.com/nothings/stb

    This update's kind of messy, we have a couple changes properly marked as FAudio-unique changes, but there were also a handful of bugfixes that still haven't made it upstream, so it may require a bit of care to update to the latest version while also retaining the bugfixes yet to be mainlined. It's still a pretty small update though, so it'll just take slightly longer than a typical manual merge.

    opened by flibitijibibo 0
  • Implement FAudioDebugConfiguration

    Implement FAudioDebugConfiguration

    From MSDN: https://docs.microsoft.com/en-us/windows/desktop/api/xaudio2/ns-xaudio2-xaudio2_debug_configuration

    In addition to filling in one more XAudio2 feature, this is a legitimately useful for general FAudio debugging without having to step through a whole lot. It can be extremely verbose, however, so this should only be enabled for non-release builds (i.e. !_DEBUG && !DEBUG && (GCC && !OPTIMIZED)). Additionally, I would like to add the ability to enable features with environment variables, not just SetDebugConfiguration. This is useful for projects like Wine that won't have access to these entry points without added hackery. Each flag/bool should get a variable in some way.

    As for the implementation, this can be mapped to something like SDL_Log, though I don't know how complicated we'll need to get. I'm hoping we can make all these log types macros that are blanked in release builds, but that's totally speculation without having actually tried to write this at all.

    It's a big ol checklist:

    • [ ] TraceMask XAUDIO2_LOG_*
      • [x] ERRORS
      • [x] WARNINGS
      • [x] INFO
      • [x] DETAIL
      • [x] API_CALLS
      • [x] FUNC_CALLS
      • [ ] TIMING
      • [x] LOCKS
      • [ ] MEMORY
      • [ ] STREAMING
    • [ ] BreakMask XAUDIO2_LOG_*
      • [ ] ERRORS
      • [ ] WARNINGS
    • [x] LogThreadID
    • [x] LogFileline
    • [x] LogFunctionName
    • [x] LogTiming
    XAudio2 Accuracy New Feature 
    opened by flibitijibibo 10
Releases(22.11)
  • 22.11(Nov 1, 2022)

  • 22.10(Oct 1, 2022)

  • 22.09.01(Sep 2, 2022)

  • 22.09(Sep 1, 2022)

    New Features:

    • Update to SDL 2.24. This has been made a hard requirement, as it fixes/adds way too much to ignore:
      • 2.1 and 4.1 audio is now supported
      • On Windows, we now prioritize DirectSound over WASAPI
      • The PulseAudio samples hack has been removed
      • The non-power-of-two samples hack for Emscripten/OSS has also been removed
      • GetDeviceDetails(0) now uses SDL_GetDefaultAudioInfo, obsoleting our hack

    Thanks to our GitHub Sponsors, including...

    Super Sponsors:

    Sponsors:

    • @bartwe
    • @BrandonSchaefer
    • @clementgallet
    • @Conan-Kudo
    • @Eldirans
    • @GloriousEggroll
    • @isaboll1
    • @kiates
    • @larsiusprime
    • @lithiumtoast
    • @NoelFB
    • @rfht
    • @xxxbxxx
    • Bit Kid Games
    • Lunar Ray Games
    Source code(tar.gz)
    Source code(zip)
  • 22.08(Aug 1, 2022)

    New Features:

    • FACT: Add support for WAVEBANKPREPARED notifications

    Fixes:

    • Included the matrix coefficient test program in matrix_defaults.inl, for developers that need to replicate it
    • FXReverb: Fix a spec violation in Process() that could corrupt reverb output when enabled/disabled with precise timing
    • FACT: Fill all fields for WAVESTOP notifications, avoiding uninitialized memory issues
    • Win32:
      • Set fallback dwChannelMask in device details for non-extensible formats
      • Fix a possible crash when exiting certain threads

    Thanks to our GitHub Sponsors, including...

    Super Sponsors:

    Sponsors:

    • @bartwe
    • @BrandonSchaefer
    • @clementgallet
    • @Conan-Kudo
    • @Eldirans
    • @GloriousEggroll
    • @isaboll1
    • @kiates
    • @larsiusprime
    • @lithiumtoast
    • @NoelFB
    • @rfht
    • @xxxbxxx
    • Bit Kid Games
    • Lunar Ray Games
    Source code(tar.gz)
    Source code(zip)
  • 22.07(Jul 1, 2022)

    Fixes:

    • Fix 8-bit PCM conversion for AArch64 systems
    • FAudioFX Reverb:
      • For stereo-to-stereo processing, fix wet/dry mix on the left channel
      • The effect is now properly initialized with default settings, SetParameters is no longer required
    • SDL2:
      • Work around certain device channel counts for an SDL bug
      • Prepare to remove the PulseAudio buffer size workaround for SDL 2.24

    Thanks to our GitHub Sponsors, including...

    Super Sponsors:

    Sponsors:

    • @bartwe
    • @BrandonSchaefer
    • @clementgallet
    • @Conan-Kudo
    • @Eldirans
    • @GloriousEggroll
    • @isaboll1
    • @kiates
    • @larsiusprime
    • @lithiumtoast
    • @NoelFB
    • @rfht
    • @xxxbxxx
    • Bit Kid Games
    • Lunar Ray Games
    Source code(tar.gz)
    Source code(zip)
  • 22.06(Jun 1, 2022)

    Fixes:

    • Fixed a crash caused by MSADPCM streams with really large block sizes
    • FACT: Stopping Cues now properly triggers CUESTOP notifications

    Thanks to our GitHub Sponsors, including...

    Super Sponsors:

    • @danielcrenna
    • @kg
    • @lthrhx
    • @mikesart
    • @TerryCavanagh

    Sponsors:

    • @bartwe
    • @BrandonSchaefer
    • @clementgallet
    • @Conan-Kudo
    • @desktopgoose
    • @Eldirans
    • @GloriousEggroll
    • @isaboll1
    • @kiates
    • @larsiusprime
    • @lithiumtoast
    • @NoelFB
    • @Pintea
    • @rfht
    • @sunwanxin213
    • @xxxbxxx
    • Bit Kid Games
    • Lunar Ray Games
    Source code(tar.gz)
    Source code(zip)
  • 22.05(May 1, 2022)

    Updated the copyright year. Better late than never! There is no functional change compared to 22.04.

    Thanks to our GitHub Sponsors, including...

    Super Sponsors:

    • @danielcrenna
    • @kg
    • @mikesart
    • @TerryCavanagh

    Sponsors:

    • @bartwe
    • @BrandonSchaefer
    • @clementgallet
    • @Conan-Kudo
    • @Eldirans
    • @GloriousEggroll
    • @isaboll1
    • @kiates
    • @larsiusprime
    • @lithiumtoast
    • @NoelFB
    • @Pintea
    • @rfht
    • @xxxbxxx
    • Bit Kid Games
    • Lunar Ray Games
    Source code(tar.gz)
    Source code(zip)
  • 22.04(Apr 1, 2022)

  • 22.03(Mar 1, 2022)

  • 22.02(Feb 1, 2022)

    New Features:

    • The Wine/Win32 backend is now considered stable.
      • All Wine users should upgrade to 7.0 or newer
      • All non-Wine users will (and should) continue to use the SDL backend

    Removed Features:

    • GStreamer support has been removed
      • Wine/Win32 will continue to use MediaFoundation
      • All other users should already be on patent/royalty-free codecs

    Fixes:

    • utils: Minor cleanup of uicommon
    • csharp: Expose an IntPtr overload for stb_vorbis_get_samples_float_interleaved

    Thanks to our GitHub Sponsors, including...

    Super Sponsors:

    Sponsors:

    • @bartwe
    • @BombJovi
    • @clementgallet
    • @Conan-Kudo
    • @Eldirans
    • @GloriousEggroll
    • @isaboll1
    • @kiates
    • @larsiusprime
    • @lithiumtoast
    • @MikeSart
    • @minirop
    • @NoelFB
    • @rfht
    • @Woflox
    • @xxxbxxx
    • MagicalTimeBean
    • Bit Kid Games
    • Lunar Ray Games
    Source code(tar.gz)
    Source code(zip)
  • 22.01(Jan 1, 2022)

  • 21.12(Dec 1, 2021)

  • 21.11(Nov 1, 2021)

    Deprecated Features:

    • GStreamer support is now deprecated.
      • Wine users should migrate to 6.20 and newer, and everyone else should move to codecs that are not patent-encumbered.
      • GStreamer support will be fully removed in the first release after Wine 7.0.

    Removed Features:

    • Removed the C++ wrapper. Use the headers/PE binaries found in Wine 6.20 and newer.

    Fixes:

    • Minor fixes and cleanups found by Coverity
    • Dont assert on WMA buffer and FAUDIO_FORMAT_EXTENSIBLE type
    • FACT: Send FACTNOTIFICATIONTYPE_CUESTOP Notification on Cue Stop
    • Continued work on the experimental Wine/Win32 platform backend

    Thanks to our GitHub Sponsors, including...

    Super Sponsors:

    Sponsors:

    Source code(tar.gz)
    Source code(zip)
  • 21.10(Oct 1, 2021)

    Fixes:

    • Minor WinRT project update for latest SDL Git revision
    • Continued work on the experimental Wine/Win32 platform backend

    Thanks to our GitHub Sponsors, including...

    Super Sponsors:

    Sponsors:

    • @bartwe
    • @bhewes
    • @clementgallet
    • @Conan-Kudo
    • @Eldirans
    • @FrozenChameleon
    • @GloriousEggroll
    • @isaboll1
    • @kiates
    • @larsiusprime
    • @lithiumtoast
    • @mikesart
    • @minirop
    • @NoelFB
    • @rfht
    • @xxxbxxx
    • MagicalTimeBean
    • Bit Kid Games
    • Lunar Ray Games
    Source code(tar.gz)
    Source code(zip)
  • 21.09(Sep 1, 2021)

    Fixes:

    • FACT: Fix a crash from an uninitialized pointer when a WaveBank does not have a name table
    • platform_sdl2: When querying the default device, ignore audio devices with way too many channels
    • platform_win32: Minor Win32 buildfixes

    Thanks to our GitHub Sponsors, including...

    Super Sponsors:

    Sponsors:

    Source code(tar.gz)
    Source code(zip)
  • 21.08(Aug 1, 2021)

    New Features:

    • FACT:
      • Add support for WaveBank entry names
      • When no XGS is provided, AudioEngine now assumes default settings when initialized
    • FAudioFX Reverb now supports 5.1->5.1 processing

    Fixes:

    • Fix CMake config name to match standard conventions
    • Minor code cleanup

    Thanks to our GitHub Sponsors, including...

    Super Sponsors:

    • @danielcrenna
    • @kg
    • @TerryCavanagh

    Sponsors:

    • @bartwe
    • @clementgallet
    • @FrozenChameleon
    • @girasquid
    • @GloriousEggroll
    • @kiates
    • @larsiusprime
    • @lithiumtoast
    • @mikesart
    • @minirop
    • @NoelFB
    • @rfht
    • @xxxbxxx
    • MagicalTimeBean
    • Bit Kid Games
    Source code(tar.gz)
    Source code(zip)
  • 21.07(Jul 1, 2021)

    Added an experimental Win32 configuration and platform backend. This backend uses the Windows API and C runtime directly instead of using SDL, and is meant to be used exclusively with Wine's upcoming PE binary support for XAudio2. The expectation is that this will be the successor to using FAudio's native binaries with Wine and GStreamer, and it will also be replacing our cpp folder as the new binary-compatible Windows XAudio2 libraries. As a result, our timeline for this feature is as follows:

    • Wine releases XAudio2 PE support
      • Remove cpp folder, compile Wine's (far superior) XAudio2 wrappers instead
      • Deprecate GStreamer support, only to be used with Wine 6.0.x
    • Wine 7.0 release
      • Remove GStreamer support, all users should upgrade to Wine 7

    Aside from this new feature, 21.07 is identical to 21.06.

    Thanks to our GitHub Sponsors, including...

    Super Sponsors:

    • @danielcrenna
    • @kg
    • @TerryCavanagh

    Sponsors:

    • @bartwe
    • @clementgallet
    • @FrozenChameleon
    • @girasquid
    • @GloriousEggroll
    • @kiates
    • @larsiusprime
    • @mikesart
    • @minirop
    • @NoelFB
    • @rfht
    • @xxxbxxx
    • MagicalTimeBean
    • Bit Kid Games
    Source code(tar.gz)
    Source code(zip)
  • 21.06(Jun 1, 2021)

    Fixes:

    • FACT: RPC filter frequency should be calculated using the track sample rate, not 20KHz (as implied by the XACT tool)

    Thanks to our GitHub Sponsors, including...

    Super Sponsors:

    • @danielcrenna
    • @kg
    • @TerryCavanagh

    Sponsors:

    • @bartwe
    • @clementgallet
    • @FrozenChameleon
    • @girasquid
    • @GloriousEggroll
    • @kiates
    • @larsiusprime
    • @mikesart
    • @minirop
    • @NoelFB
    • @rfht
    • @Thijxx
    • @xxxbxxx
    • MagicalTimeBean
    • Bit Kid Games
    Source code(tar.gz)
    Source code(zip)
  • 21.05(May 1, 2021)

  • 21.04(Apr 1, 2021)

    New Features:

    • Added support for SDL_GetAudioDeviceSpec, coming in a future SDL release
    • FACT: Implemented accurate Fast/Slow/SinCos RPC curve types
    • Added support for XMA2 audio, for Xbox 360 data

    Fixes:

    • Voice filters/effects should be processed even when SendCount is 0
    • FACT:
      • Fix parsing/calculation of filter Q factors
      • Enforce STOPPING flag for fade-outs or RPC releases
      • Various fixes for parsing big-endian SoundBanks

    Thanks to our GitHub Sponsors, including...

    Super Sponsors:

    • @danielcrenna
    • @kg
    • @TerryCavanagh

    Sponsors:

    • @acdimalev
    • @bartwe
    • @clementgallet
    • @FrozenChameleon
    • @girasquid
    • @kiates
    • @larsiusprime
    • @mikesart
    • @minirop
    • @NoelFB
    • @rfht
    • MagicalTimeBean
    • Bit Kid Games
    Source code(tar.gz)
    Source code(zip)
  • 21.03.05(Mar 6, 2021)

  • 21.03(Mar 1, 2021)

    New Features:

    • XACT:
      • Implemented FACT_FLAG_MANAGEDATA
      • Implemented the CUEPLAY and CUESTOP notification types
      • Added support for XACT 3.0 content
      • Added support for WaveBanks with endian-swapped PCM data

    Thanks to our GitHub Sponsors, including...

    Super Sponsors:

    • @danielcrenna
    • @kg
    • @TerryCavanagh

    Sponsors:

    • @acdimalev
    • @bartwe
    • @clementgallet
    • @FrozenChameleon
    • @girasquid
    • @kiates
    • @larsiusprime
    • @mikesart
    • @minirop
    • @NoelFB
    • @rfht
    • MagicalTimeBean
    • Bit Kid Games
    Source code(tar.gz)
    Source code(zip)
  • 21.02(Feb 1, 2021)

  • 21.01(Jan 1, 2021)

  • 20.12(Dec 1, 2020)

    New Features:

    • Added an x64 configuration to visualc
    • CMake project now generates a pkgconfig file

    Fixes:

    • CMake:
      • Fix compatibility with CMake 2.8.12
      • GStreamer builds now explicitly check for >=1.9.2
    • Initialize the subformat for GetDeviceFormat, fixes a ton of Ubisoft games
    • Don't assert when FAudio_Initialize Flags includes FAUDIO_DEBUG_ENGINE

    Thanks to our GitHub Sponsors, including...

    Super Sponsors:

    • @danielcrenna
    • @kg
    • @TerryCavanagh

    Sponsors:

    Source code(tar.gz)
    Source code(zip)
  • 20.11(Nov 1, 2020)

  • 20.10(Oct 1, 2020)

    New Features:

    • XACT:
      • Add support for WAVESTOP notifications
      • Add support for engines without settings files (or empty settings files)

    Fixes:

    • Add power-of-two quantum fallback paths for *BSD and Emscripten
    • Return a unique error code for audio engines with a bad platform ID
    • Fix a deadlock in Wolfenstein: The Old Blood related to callbacks
    • Fix a crash for streaming WaveBanks when calling Destroy
    • stb_vorbis: Handle malloc(0) calls

    Thanks to our GitHub Sponsors, including...

    Super Sponsors:

    • @danielcrenna
    • @kg
    • @TerryCavanagh

    Sponsors:

    Source code(tar.gz)
    Source code(zip)
  • 20.09(Sep 1, 2020)

    New Features:

    • Update to stb_vorbis 1.20
    • Add support for SoundBanks without Cue name tables
      • Fixes XACT parsing for Saints Row 2

    Fixes:

    • Minor performance improvements for mixing
      • Dramatic performance improvement for generic mixing on SSE2 CPUs
    • Keep processing the effect chain when mixing source voices until the chain generates a silent buffer.
    • Return error codes for invalid SetOutputMatrix parameters, fixes undefined behavior for Fable III
    • Protect internal decode/resample caches when allocating new source voices, fixes Banished crashes
    • When a new WMA buffer is read, reset decoded buffer indexes
    • General compiler cleanup, particularly for VS2010 and GCC -Werror

    Thanks to our GitHub Sponsors, including...

    Super Sponsors:

    • @danielcrenna
    • @kg
    • @TerryCavanagh

    Sponsors:

    Source code(tar.gz)
    Source code(zip)
  • 20.08(Aug 1, 2020)

    New Features:

    • Add support for XAudio2.9-compatible reverb
      • New structure: FAudioFXReverbParameters9
      • New constants:
        • FAUDIOFX_REVERB_MIN_7POINT1_SIDE_DELAY
        • FAUDIOFX_REVERB_MIN_7POINT1_REAR_DELAY
        • FAUDIOFX_REVERB_MAX_7POINT1_SIDE_DELAY
        • FAUDIOFX_REVERB_MAX_7POINT1_REAR_DELAY
        • FAUDIOFX_REVERB_DEFAULT_7POINT1_SIDE_DELAY
        • FAUDIOFX_REVERB_DEFAULT_7POINT1_REAR_DELAY
      • New functions:
        • FAudioCreateReverb9
        • FAudioCreateReverb9WithCustomAllocatorEXT
        • ReverbConvertI3DL2ToNative9

    Modified Features:

    • The FFmpeg backend for WMA decoding has been replaced with GStreamer. Distributors are encouraged to configure their FAudio builds with -DGSTREAMER=ON even if a WMA plugin is not available by default; end users can provide their own plugins if needed.

    Fixes:

    • Ensure that, for WMA, loops can only be for the whole buffer
    • Reverb: DecayTime is now always >= MIN_DECAY_TIME, fixes audio in Dragon Quest Builders 2
    • XACT: Use a temporary buffer for matrix coefficients when uSrcChannelCount != Wave channel count

    Thanks to our GitHub Sponsors, including...

    Super Sponsors:

    • @danielcrenna
    • @kg
    • @TerryCavanagh

    Sponsors:

    Source code(tar.gz)
    Source code(zip)
Owner
FNA Development Team
XNA Preservation, C# Game Development Libraries
FNA Development Team
Mumble is an Open Source, low-latency, high quality voice chat software

Mumble is an Open Source, low-latency and high-quality voice-chat program written on top of Qt and Opus.

Mumble 5.1k Nov 24, 2022
Free and open-source (GPL3+) VCVrack modules made by Allieway Audio

AlliewayAudio_Freebies Free and open source VCVrack modules made by Allieway Audio with love <3 Disclaimer: All direct clones or recreations were made

Allie 5 Jan 10, 2022
eSpeak NG is a compact open source software text-to-speech synthesizer for Linux, Windows, Android and other operating systems

eSpeak NG is an open source speech synthesizer that supports more than hundred languages and accents.

null 1.6k Nov 22, 2022
projectM - cross-platform music visualization. Open-source and Milkdrop-compatible

projectM - cross-platform music visualization. Open-source and Milkdrop-compatible

projectM Visualizer 2.5k Nov 20, 2022
Open source digital sound effects based on JACK audio connection kit.

Noiseworks Digital Audio Effects Repository Open source digital sound effects based on JACK audio connection kit. This repository is intended to provi

null 5 Jul 29, 2022
PendulumSynth is an on-going and open-source project, running on Arduino platform with the goal of mixing real-world physics into music composition and musical performance.

PendulumSynth PendulumSynth is an on-going and open-source project, running on Arduino platform with the goal of mixing real-world physics into music

Mohammadreza Anvari 3 Oct 7, 2022
AudMonkey - Free and open source audio editor

AudMonkey is an easy-to-use, multi-track audio editor and recorder for Windows, Mac OS X, GNU/Linux and other operating systems. AudMonkey is open source software licensed under GPL, version 2 or later.

AudMonkey 36 Mar 15, 2022
Open-source audio fingerprint by MusicIP

README for the Open Fingerprint Architecture library "LIBOFA" Copyright (C) 2006, MusicIP Corporation 605 E. Huntington Dr. Suite 201, Monrovia CA 910

Adriano Bonat 40 Sep 1, 2022
JUCE is an open-source cross-platform C++ application framework for desktop and mobile applications, including VST, VST3, AU, AUv3, RTAS and AAX audio plug-ins.

JUCE is an open-source cross-platform C++ application framework for creating high quality desktop and mobile applications, including VST, VST3, AU, AU

JUCE 4.6k Nov 21, 2022
The open source framework for sample based instruments

HISE Build Status macOS: Build Status Windows: The open source framework for sample based instruments. HISE is a cross-platform open source audio appl

null 652 Nov 25, 2022
Deploy SCRFD, an efficient high accuracy face detection approach, in your web browser with ncnn and webassembly

ncnn-webassembly-scrfd open https://nihui.github.io/ncnn-webassembly-scrfd and enjoy build and deploy Install emscripten

null 42 Nov 16, 2022
Parsec Soda is a custom open-source game streaming app that integrates with Parsec API and is focused in Host experience.

Parsec Soda is a custom open-source game streaming app that integrates with Parsec API and is focused in Host experience.

Flávio Freitas 135 Nov 11, 2022
An open source standard C library that includes useful functions && (Reimplementation of libc functions + own functions).

?? LIBFT-42 : Artistic view of LIBC: ?? HOW DOES IT FEEL HAVING YOUR OWN LIB: SUBJECT : ENGLISH PDF ℹ️ What is LIBFT : This project aims to code a C l

Abdessamad Laamimi 10 Nov 4, 2022
Open-source flog (Nintendo Switch's Golf NES easter egg) reimplementation

This repository is dedicated to flog, an easter egg present on Nintendo Switch consoles, containing various tools and information, which are the result of progressive reverse-engineering of the easter egg.

XorTroll 8 Sep 29, 2022
Benchmark framework of compute-in-memory based accelerators for deep neural network (inference engine focused)

DNN+NeuroSim V1.3 The DNN+NeuroSim framework was developed by Prof. Shimeng Yu's group (Georgia Institute of Technology). The model is made publicly a

NeuroSim 31 Nov 21, 2022
An SQLite binding for node.js with built-in encryption, focused on simplicity and (async) performance

Description An SQLite (more accurately SQLite3MultipleCiphers) binding for node.js focused on simplicity and (async) performance. When dealing with en

mscdex 14 May 15, 2022
U++ is a C++ cross-platform rapid application development framework focused on programmer's productivity. It includes a set of libraries (GUI, SQL, Network etc.), and integrated development environment (TheIDE).

Ultimate++ Ultimate++ is a C++ cross-platform rapid application development framework focused on programmers productivity. It includes a set of librar

Ultimate++ 524 Nov 24, 2022
bsnes is a Super Nintendo (SNES) emulator focused on performance, features, and ease of use.

bsnes is a Super Nintendo (SNES) emulator focused on performance, features, and ease of use.

bsnes 1.2k Nov 24, 2022
Growtopia internal cheat focused around enhancements and framework, that is loaded automatically. By: ama6nen

CREDITS TO AMA6NEN ORIGINAL REPO: https://github.com/ama6nen/INZERNAL INZERNAL INZERNAL has been discontinued for public usage and a private version t

TheC0mpany 12 Nov 4, 2022
An HTTPS beaconing Windows implant and multi-layered proxy C2 network designed for covert APT emulation focused offensive operations

WARFOX is a software-based HTTPS beaconing Windows implant that uses a multi-layered proxy network for C2 communications. This kit was designed to emulate covert APT offensive operations. This kit includes WARFOX (Windows implant), HIGHTOWER (Listening Post), and other tools to build configs and set up a proxy network.

null 86 Nov 15, 2022