diff --git a/.github/SECURITY.md b/.github/SECURITY.md new file mode 100644 index 00000000..7ace9644 --- /dev/null +++ b/.github/SECURITY.md @@ -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. \ No newline at end of file diff --git a/CHANGES.md b/CHANGES.md index ca54ea91..9c41d8ae 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -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. diff --git a/README.md b/README.md index ee7f46e0..7d885375 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/miniaudio.h b/miniaudio.h index 088bfc9a..e8bdb0db 100644 --- a/miniaudio.h +++ b/miniaudio.h @@ -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) {