Merge branch 'dev' into dev-0.12

This commit is contained in:
David Reid
2026-01-17 12:19:20 +10:00
4 changed files with 47 additions and 10 deletions
+4
View File
@@ -0,0 +1,4 @@
I deal with all security related issues publicly and transparently, and it can sometimes take a while before I
get a chance to address it. If this is an issue for you, you need to use another library. The fastest way to get
a bug fixed is to submit a pull request, but if this is impractical for you please post a ticket to the public
GitHub issue tracker.
+12 -3
View File
@@ -1,7 +1,16 @@
v0.11.24 - TBD
v0.11.24 - 2026-01-17
=====================
* Fix a possible double-uninit error when a decoder fails to initialize.
* Fix a compilation error with the MSVC Aarch64 build.
* Fixed a possible glitch when processing the audio of a `ma_sound` when doing resampling.
* Fixed a possible crash in the node graph relating to scheduled starts and stops.
* Fixed a bug where MA_NO_DECODING would disable the WAV encoder.
* Fixed a pthread compatibility issue, particularly with Android.
* Fixed a possible crash in the resource manager.
* Fixed a possible double-uninit error when a decoder fails to initialize.
* Fixed a compilation error with the MSVC Aarch64 build.
* Addressed a few errors found through static analysis, particularly around possible null pointer dereferences.
* `ma_sound_is_playing()` will now correctly return false when called from inside the end callback of a sound.
* Miscellaneous compiler compatibility and warning fixes.
* PulseAudio: Fix a resource leak when a context fails to connect.
* Web: Fixed an error when uninitializing a context.
+1 -4
View File
@@ -205,10 +205,7 @@ Backends
Security
========
I deal with all security related issues publicly and transparently, and it can sometimes take a while before I
get a chance to address it. If this is an issue for you, you need to use another library. The fastest way to get
a bug fixed is to submit a pull request, but if this is impractical for you please post a ticket to the public
GitHub issue tracker.
See the miniaudio [security policy](.github/SECURITY.md).
License
+30 -3
View File
@@ -1,6 +1,6 @@
/*
Audio playback and capture library. Choice of public domain or MIT-0. See license statements at the end of this file.
miniaudio - v0.11.24 - TBD
miniaudio - v0.11.24 - 2026-01-17
David Reid - mackron@gmail.com
@@ -11287,8 +11287,12 @@ MA_API ma_engine* ma_sound_get_engine(const ma_sound* pSound);
MA_API ma_data_source* ma_sound_get_data_source(const ma_sound* pSound);
MA_API ma_result ma_sound_start(ma_sound* pSound);
MA_API ma_result ma_sound_stop(ma_sound* pSound);
MA_API ma_result ma_sound_stop_with_fade_in_pcm_frames(ma_sound* pSound, ma_uint64 fadeLengthInFrames); /* Will overwrite any scheduled stop and fade. */
MA_API ma_result ma_sound_stop_with_fade_in_milliseconds(ma_sound* pSound, ma_uint64 fadeLengthInFrames); /* Will overwrite any scheduled stop and fade. */
MA_API ma_result ma_sound_stop_with_fade_in_pcm_frames(ma_sound* pSound, ma_uint64 fadeLengthInFrames); /* Will overwrite any scheduled stop and fade. If you want to restart the sound, first reset it with `ma_sound_reset_stop_time_and_fade()`. There are plans to make this less awkward in the future. */
MA_API ma_result ma_sound_stop_with_fade_in_milliseconds(ma_sound* pSound, ma_uint64 fadeLengthInFrames); /* Will overwrite any scheduled stop and fade. If you want to restart the sound, first reset it with `ma_sound_reset_stop_time_and_fade()`. There are plans to make this less awkward in the future. */
MA_API void ma_sound_reset_start_time(ma_sound* pSound);
MA_API void ma_sound_reset_stop_time(ma_sound* pSound);
MA_API void ma_sound_reset_fade(ma_sound* pSound);
MA_API void ma_sound_reset_stop_time_and_fade(ma_sound* pSound); /* Resets fades and scheduled stop time. Does not seek back to the start. */
MA_API void ma_sound_set_volume(ma_sound* pSound, float volume);
MA_API float ma_sound_get_volume(const ma_sound* pSound);
MA_API void ma_sound_set_pan(ma_sound* pSound, float pan);
@@ -30978,6 +30982,7 @@ static ma_result ma_init_pa_mainloop_and_pa_context__pulseaudio(ma_context* pCon
result = ma_result_from_pulseaudio(pContextStatePulseAudio->pa_context_connect(pPulseContext, pServerName, (tryAutoSpawn) ? MA_PA_CONTEXT_NOFLAGS : MA_PA_CONTEXT_NOAUTOSPAWN, NULL));
if (result != MA_SUCCESS) {
ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[PulseAudio] Failed to connect PulseAudio context.");
pContextStatePulseAudio->pa_context_unref(pPulseContext);
pContextStatePulseAudio->pa_mainloop_free(pMainLoop);
return result;
}
@@ -30986,6 +30991,7 @@ static ma_result ma_init_pa_mainloop_and_pa_context__pulseaudio(ma_context* pCon
result = ma_wait_for_pa_context_to_connect__pulseaudio(pContext, pContextStatePulseAudio, pMainLoop, pPulseContext);
if (result != MA_SUCCESS) {
ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[PulseAudio] Waiting for connection failed.");
pContextStatePulseAudio->pa_context_unref(pPulseContext);
pContextStatePulseAudio->pa_mainloop_free(pMainLoop);
return result;
}
@@ -80431,6 +80437,27 @@ MA_API ma_result ma_sound_stop_with_fade_in_milliseconds(ma_sound* pSound, ma_ui
return ma_sound_stop_with_fade_in_pcm_frames(pSound, (fadeLengthInMilliseconds * sampleRate) / 1000);
}
MA_API void ma_sound_reset_start_time(ma_sound* pSound)
{
ma_sound_set_start_time_in_pcm_frames(pSound, 0);
}
MA_API void ma_sound_reset_stop_time(ma_sound* pSound)
{
ma_sound_set_stop_time_in_pcm_frames(pSound, ~(ma_uint64)0);
}
MA_API void ma_sound_reset_fade(ma_sound* pSound)
{
ma_sound_set_fade_in_pcm_frames(pSound, 0, 1, 0);
}
MA_API void ma_sound_reset_stop_time_and_fade(ma_sound* pSound)
{
ma_sound_reset_stop_time(pSound);
ma_sound_reset_fade(pSound);
}
MA_API void ma_sound_set_volume(ma_sound* pSound, float volume)
{
if (pSound == NULL) {