2 Commits

Author SHA1 Message Date
1893226cb7 Fix crash on CloseAudioDevice: uninit device before mutex (#6039)
On Android (AAudio) the callback thread could still run when the mutex was
destroyed, causing a SIGABRT (pthread_mutex_lock on a destroyed mutex).
Uninit the device first so its callback thread stops before ma_mutex_uninit.
2026-08-07 22:44:06 +02:00
3580240743 [examples] Several fixes and improvements (#6042)
* models_loading_iqm - actually use animIndex

* models_decals - fix button placement

* core_highdpi_testbed - unrelated TODO

* audio_sound_positioning - fix SetSoundPosition and panning

* SetSoundPan is clamped already

* remove version check

* fix 'updated with' in the header
2026-08-07 21:30:27 +02:00
5 changed files with 8 additions and 10 deletions

View File

@ -4,7 +4,7 @@
*
* Example complexity rating: [★★☆☆] 2/4
*
* Example originally created with raylib 5.5, last time updated with raylib 5.5
* Example originally created with raylib 5.5, last time updated with raylib 6.0
*
* Example contributed by Le Juez Victor (@Bigfoot71) and reviewed by Ramon Santamaria (@raysan5)
*
@ -116,14 +116,14 @@ static void SetSoundPosition(Camera listener, Sound sound, Vector3 position, flo
// Calculate normalized vectors for spatial positioning
Vector3 normalizedDirection = Vector3Normalize(direction);
Vector3 forward = Vector3Normalize(Vector3Subtract(listener.target, listener.position));
Vector3 right = Vector3Normalize(Vector3CrossProduct(listener.up, forward));
Vector3 right = Vector3Normalize(Vector3CrossProduct(forward, listener.up));
// Reduce volume for sounds behind the listener
float dotProduct = Vector3DotProduct(forward, normalizedDirection);
if (dotProduct < 0.0f) attenuation *= (1.0f + dotProduct*0.5f);
// Set stereo panning based on sound position relative to listener
float pan = 0.5f + 0.5f*Vector3DotProduct(normalizedDirection, right);
float pan = Vector3DotProduct(normalizedDirection, right);
// Apply final sound properties
SetSoundVolume(sound, attenuation);

View File

@ -97,9 +97,6 @@ int main(void)
// De-Initialization
//--------------------------------------------------------------------------------------
// TODO: Unload all loaded resources at this point
CloseWindow(); // Close window and OpenGL context
//--------------------------------------------------------------------------------------

View File

@ -249,7 +249,7 @@ int main(void)
DrawText("(c) Character model and texture from kenney.nl", screenWidth - 260, screenHeight - 20, 10, GRAY);
// UI elements
if (GuiButton((Rectangle){ 10, screenHeight - 1000.f, 100, 60 }, showModel ? "Hide Model" : "Show Model")) showModel = !showModel;
if (GuiButton((Rectangle){ 10, screenHeight - 100.0f, 100, 60 }, showModel ? "Hide Model" : "Show Model")) showModel = !showModel;
if (GuiButton((Rectangle){ 10 + 110, screenHeight - 100.0f, 100, 60 }, "Clear Decals"))
{

View File

@ -66,8 +66,8 @@ int main(void)
// Play animation when spacebar is held down
animCurrentFrame += 1.0f;
UpdateModelAnimation(model, anims[0], animCurrentFrame);
if (animCurrentFrame >= anims[0].keyframeCount) animCurrentFrame = 0;
UpdateModelAnimation(model, anims[animIndex], animCurrentFrame);
if (animCurrentFrame >= anims[animIndex].keyframeCount) animCurrentFrame = 0;
//----------------------------------------------------------------------------------
// Draw

View File

@ -533,8 +533,9 @@ void CloseAudioDevice(void)
{
if (AUDIO.System.isReady)
{
ma_mutex_uninit(&AUDIO.System.lock);
// Stop the device first (joins the callback thread) before destroying the mutex it locks
ma_device_uninit(&AUDIO.System.device);
ma_mutex_uninit(&AUDIO.System.lock);
ma_context_uninit(&AUDIO.System.context);
AUDIO.System.isReady = false;