With the first quarter of 2023 over it is time to look at what has changed, both big and small. As the user base of my projects has grown over time, I've realized that it is unfeasible to ask every user to keep themselves updated all the time. I've taken the liberty of adopting Dolphin's Progress Report format, which is a text version of what other projects use video announcements for. Just my kind of thing!
I will try to keep these Progress Reports happening regularly, probably once per quarter as I work alone on things. If I ever end up creating a company and hiring people, it is likely that these Progress Reports will happen more frequently - but they'll happen on the website for the company instead. Anyway, let's get into the details on what notable things have happened over the last three months.
As users with a lot of CPU cores kept reporting increased CPU usage, I've switched to a proper thread pool implementation, instead of always allocating a number of threads matching the number of CPU threads. This unfortunately brought with it a bug that only affected Linux: Some threaded features stopped working entirely, and OBS Studio would just freeze when attempting to close it. Everything was working correctly on my Windows, Ubuntu and MacOS machines, so why was it broken on their Ubuntu machine?
After a lot of searching, tt2468 found the issue: I didn't initialize the number of threads! This didn't matter on Windows, MacOS and my Ubuntu machine, as all of them had adopted the security practice of zeroing memory before handing it to a process. But on a machine that didn't do it, it meant that the thread pooling implementation thought it had an undefined number of threads - usually in the millions. It wouldn't create any threads, but still queue up work, and wait for an undefined number of threads to end.
Some users kept seeing a popup that told them that a newer of StreamFX was older than a previous version, but only if the release stage was different. Through careful observation of the logic, and then running it with a debugger attached, it was found that the Tweak part of the version would always be ignored when the Stage part was different. If Major, Minor and Patch version were identical, a higher stage would always be treated as newer. Fixing it was relatively easy, just move the stage comparison after the check for the Tweak version, and now users should no longer get a dialog that states that an older version is newer.
A strange bug started affecting StreamFX once going past a certain OBS Studio commit: Sources which should be destroyed stayed alive through scene collection switches, and nothing seemed to fix it. Even weirder is that it only happened sometimes, mostly in combination with other third party plugins, and never on OBS Studio 28.0. After lots of searching, I opted to simply rewrite the functionality to use weak references, which fixed the issue entirely - it even fixed an issue I didn't even consider part of the problem.
This is a stepping stone for future UI changes, and allows us to include web pages directly into the UI of StreamFX. Though we encountered several strange issues implementing it, such as the Browser window not being properly layouted unless accompanied by a dummy Qt Widget, in the end it started working correctly. Now we can properly embed web content directly in the Qt UI, which may allow us to improve the help provided to users further.
0.4-35ba7bf1 Allow VST 2.x hosts to load the plugin
Users reported being unable to load the VST 2.x plugin in some VST 2.x hosts, but also being able to load it in others. Initially this was though to be some strange dependency error, but thanks to a user staying around long enough to track it down, it was fixed. It turns out that in a refactor a variable was incorrectly renamed in only some places, resulting in the critical function
DllMain returning an error when it should have returned success. This is fixed in the full v0.4.2 release, and many VST 2.x hosts should now be compatible again.
0.4-dc5bcb27 Statically link the Microsoft Visual C/C++ Runtime
A user reported a strange issue where even after installing the proper runtime files, the VST 3.x plugin would not load. No matter what was done to the system, all available VST hosts refused to load the plugin entirely. After some trial and error, the solution was to simply link the runtime statically. This slightly increased the size of the releases and no longer requires updating the runtime redistributables on older Windows versions.
0.4-cf8fdcda Support loading on Windows Server "Vista"
One of the stranger things to occur was a Windows Server version that identified itself as Windows Vista to apps, yet had all the features of Windows 7. This was reported by a user wanting to run the plugin on their machine and it was unclear why it would not work. It appears that if a certain Windows version isn't explicitly listed in the Manifest, Windows Server will simply not load the dynamic library at all. In theory this makes Windows Vista a supported version of Windows now, but you really should have moved to Windows 7 or something newer at this point.
While this software is still in the very early phases of development, a small invite-only alpha test is always running. This is a small set of the changes that I can share.
v0.0-72bdbabc Output to multiple user-selected audio devices simultaneously
The original design for Tonbrett only ever imagined a single audio output, and this worked for most people. So when a tester requested the ability to output to multiple devices so they could annoy their friends and record/stream it properly, it changed quite a bit of the design. Instead of using one output buffer overall, there is now a buffer for rendering, and an output buffer per device. This increased the CPU usage slightly, but overall it still works the same.
Unnamed Unreal Engine Game
This is a project I've been working on in my free time, and it's goal is to be an Action Adventure RPG similar to Sacred Gold. I have a weird love for the older games which don't use procedural generation for everything and instead use designed maps. As Unreal Engine has changed massively from the last time I touched it, this is effectively just me learning Unreal Engine from scratch again, except with some previous knowledge following me into the project. So far I have got the basics done, like camera, movement and an infinite inventory. There is still a lot left, but I do not wish to end up with another burnout. One burnout per lifetime really is enough, I do not wish to repeat what happened when I worked for Streamlabs.