mirror of
https://github.com/libretro/RetroArch
synced 2025-02-28 03:39:59 +00:00
Fix audio mixer memory leak + remove redundant 'single threaded' rthreads implementation (#13890)
This commit is contained in:
parent
1493533345
commit
c1d1e57ec9
@ -1153,8 +1153,6 @@ ifeq ($(HAVE_THREADS), 1)
|
||||
ifeq ($(findstring Haiku,$(OS)),)
|
||||
LIBS += $(THREADS_LIBS)
|
||||
endif
|
||||
else
|
||||
OBJ += $(LIBRETRO_COMM_DIR)/rthreads/single_threaded.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_THREAD_STORAGE), 1)
|
||||
|
@ -1321,8 +1321,6 @@ THREAD
|
||||
#include "../libretro-common/rthreads/rthreads.c"
|
||||
#include "../gfx/video_thread_wrapper.c"
|
||||
#include "../audio/audio_thread_wrapper.c"
|
||||
#else
|
||||
#include "../libretro-common/rthreads/single_threaded.c"
|
||||
#endif
|
||||
|
||||
/* needed for playlists, netplay lobbies and achievements */
|
||||
|
@ -26,7 +26,6 @@
|
||||
|
||||
#include <audio/audio_mixer.h>
|
||||
#include <audio/audio_resampler.h>
|
||||
#include <rthreads/rthreads.h>
|
||||
|
||||
#ifdef HAVE_RWAV
|
||||
#include <formats/rwav.h>
|
||||
@ -62,6 +61,15 @@
|
||||
#include <ibxm/ibxm.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_THREADS
|
||||
#include <rthreads/rthreads.h>
|
||||
#define AUDIO_MIXER_LOCK(voice) slock_lock(voice->lock)
|
||||
#define AUDIO_MIXER_UNLOCK(voice) slock_unlock(voice->lock)
|
||||
#else
|
||||
#define AUDIO_MIXER_LOCK(voice) do {} while(0)
|
||||
#define AUDIO_MIXER_UNLOCK(voice) do {} while(0)
|
||||
#endif
|
||||
|
||||
#define AUDIO_MIXER_MAX_VOICES 8
|
||||
#define AUDIO_MIXER_TEMP_BUFFER 8192
|
||||
|
||||
@ -184,7 +192,9 @@ struct audio_mixer_voice
|
||||
unsigned type;
|
||||
float volume;
|
||||
bool repeat;
|
||||
#ifdef HAVE_THREADS
|
||||
slock_t *lock;
|
||||
#endif
|
||||
};
|
||||
|
||||
/* TODO/FIXME - static globals */
|
||||
@ -313,9 +323,15 @@ void audio_mixer_init(unsigned rate)
|
||||
|
||||
s_rate = rate;
|
||||
|
||||
for (i = 0; i < AUDIO_MIXER_MAX_VOICES; i++) {
|
||||
s_voices[i].type = AUDIO_MIXER_TYPE_NONE;
|
||||
s_voices[i].lock = slock_new();
|
||||
for (i = 0; i < AUDIO_MIXER_MAX_VOICES; i++)
|
||||
{
|
||||
audio_mixer_voice_t *voice = &s_voices[i];
|
||||
|
||||
voice->type = AUDIO_MIXER_TYPE_NONE;
|
||||
#ifdef HAVE_THREADS
|
||||
if (!voice->lock)
|
||||
voice->lock = slock_new();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@ -323,10 +339,17 @@ void audio_mixer_done(void)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < AUDIO_MIXER_MAX_VOICES; i++) {
|
||||
slock_lock(s_voices[i].lock);
|
||||
audio_mixer_release(&s_voices[i]);
|
||||
slock_unlock(s_voices[i].lock);
|
||||
for (i = 0; i < AUDIO_MIXER_MAX_VOICES; i++)
|
||||
{
|
||||
audio_mixer_voice_t *voice = &s_voices[i];
|
||||
|
||||
AUDIO_MIXER_LOCK(voice);
|
||||
audio_mixer_release(voice);
|
||||
AUDIO_MIXER_UNLOCK(voice);
|
||||
#ifdef HAVE_THREADS
|
||||
slock_free(voice->lock);
|
||||
voice->lock = NULL;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@ -844,11 +867,11 @@ audio_mixer_voice_t* audio_mixer_play(audio_mixer_sound_t* sound,
|
||||
if (voice->type != AUDIO_MIXER_TYPE_NONE)
|
||||
continue;
|
||||
|
||||
slock_lock(voice->lock);
|
||||
AUDIO_MIXER_LOCK(voice);
|
||||
|
||||
if (voice->type != AUDIO_MIXER_TYPE_NONE)
|
||||
{
|
||||
slock_unlock(voice->lock);
|
||||
AUDIO_MIXER_UNLOCK(voice);
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -896,14 +919,14 @@ audio_mixer_voice_t* audio_mixer_play(audio_mixer_sound_t* sound,
|
||||
voice->volume = volume;
|
||||
voice->sound = sound;
|
||||
voice->stop_cb = stop_cb;
|
||||
slock_unlock(voice->lock);
|
||||
AUDIO_MIXER_UNLOCK(voice);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(i < AUDIO_MIXER_MAX_VOICES)
|
||||
{
|
||||
audio_mixer_release(voice);
|
||||
slock_unlock(voice->lock);
|
||||
AUDIO_MIXER_UNLOCK(voice);
|
||||
}
|
||||
voice = NULL;
|
||||
}
|
||||
@ -954,13 +977,13 @@ void audio_mixer_stop(audio_mixer_voice_t* voice)
|
||||
|
||||
if (voice)
|
||||
{
|
||||
slock_lock(voice->lock);
|
||||
AUDIO_MIXER_LOCK(voice);
|
||||
stop_cb = voice->stop_cb;
|
||||
sound = voice->sound;
|
||||
|
||||
audio_mixer_release(voice);
|
||||
|
||||
slock_unlock(voice->lock);
|
||||
AUDIO_MIXER_UNLOCK(voice);
|
||||
|
||||
if (stop_cb)
|
||||
stop_cb(sound, AUDIO_MIXER_SOUND_STOPPED);
|
||||
@ -1313,7 +1336,7 @@ void audio_mixer_mix(float* buffer, size_t num_frames,
|
||||
{
|
||||
float volume;
|
||||
|
||||
slock_lock(voice->lock);
|
||||
AUDIO_MIXER_LOCK(voice);
|
||||
|
||||
volume = (override) ? volume_override : voice->volume;
|
||||
|
||||
@ -1346,7 +1369,7 @@ void audio_mixer_mix(float* buffer, size_t num_frames,
|
||||
break;
|
||||
}
|
||||
|
||||
slock_unlock(voice->lock);
|
||||
AUDIO_MIXER_UNLOCK(voice);
|
||||
}
|
||||
|
||||
for (j = 0, sample = buffer; j < num_frames * 2; j++, sample++)
|
||||
@ -1371,7 +1394,7 @@ void audio_mixer_voice_set_volume(audio_mixer_voice_t *voice, float val)
|
||||
if (!voice)
|
||||
return;
|
||||
|
||||
slock_lock(voice->lock);
|
||||
AUDIO_MIXER_LOCK(voice);
|
||||
voice->volume = val;
|
||||
slock_unlock(voice->lock);
|
||||
AUDIO_MIXER_UNLOCK(voice);
|
||||
}
|
||||
|
@ -1,24 +0,0 @@
|
||||
#include <rthreads/rthreads.h>
|
||||
|
||||
uintptr_t sthread_get_thread_id(sthread_t *thread)
|
||||
{
|
||||
return thread ? 1 : 0;
|
||||
}
|
||||
|
||||
void slock_unlock(slock_t *lock)
|
||||
{
|
||||
}
|
||||
|
||||
void slock_lock(slock_t *lock)
|
||||
{
|
||||
}
|
||||
|
||||
void slock_free(slock_t *lock)
|
||||
{
|
||||
}
|
||||
|
||||
slock_t *slock_new(void)
|
||||
{
|
||||
static uintptr_t ctr = 1;
|
||||
return (slock_t*)ctr++;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user