mirror of
https://github.com/qemu/qemu.git
synced 2025-08-09 01:50:43 +00:00
audio/sdlaudio: Remove the semaphore code
The semaphore code was only working with SDL1.2 - with SDL2, it causes a deadlock. Since we've removed support for SDL1.2 recently, we can now completely remove the semaphore code from sdlaudio.c. Signed-off-by: Thomas Huth <thuth@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Message-id: 1549336101-17623-2-git-send-email-thuth@redhat.com Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
7183834a29
commit
8a7816c4ac
145
audio/sdlaudio.c
145
audio/sdlaudio.c
@ -38,14 +38,9 @@
|
|||||||
#define AUDIO_CAP "sdl"
|
#define AUDIO_CAP "sdl"
|
||||||
#include "audio_int.h"
|
#include "audio_int.h"
|
||||||
|
|
||||||
#define USE_SEMAPHORE (SDL_MAJOR_VERSION < 2)
|
|
||||||
|
|
||||||
typedef struct SDLVoiceOut {
|
typedef struct SDLVoiceOut {
|
||||||
HWVoiceOut hw;
|
HWVoiceOut hw;
|
||||||
int live;
|
int live;
|
||||||
#if USE_SEMAPHORE
|
|
||||||
int rpos;
|
|
||||||
#endif
|
|
||||||
int decr;
|
int decr;
|
||||||
} SDLVoiceOut;
|
} SDLVoiceOut;
|
||||||
|
|
||||||
@ -57,10 +52,6 @@ static struct {
|
|||||||
|
|
||||||
static struct SDLAudioState {
|
static struct SDLAudioState {
|
||||||
int exit;
|
int exit;
|
||||||
#if USE_SEMAPHORE
|
|
||||||
SDL_mutex *mutex;
|
|
||||||
SDL_sem *sem;
|
|
||||||
#endif
|
|
||||||
int initialized;
|
int initialized;
|
||||||
bool driver_created;
|
bool driver_created;
|
||||||
} glob_sdl;
|
} glob_sdl;
|
||||||
@ -77,66 +68,6 @@ static void GCC_FMT_ATTR (1, 2) sdl_logerr (const char *fmt, ...)
|
|||||||
AUD_log (AUDIO_CAP, "Reason: %s\n", SDL_GetError ());
|
AUD_log (AUDIO_CAP, "Reason: %s\n", SDL_GetError ());
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sdl_lock (SDLAudioState *s, const char *forfn)
|
|
||||||
{
|
|
||||||
#if USE_SEMAPHORE
|
|
||||||
if (SDL_LockMutex (s->mutex)) {
|
|
||||||
sdl_logerr ("SDL_LockMutex for %s failed\n", forfn);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
SDL_LockAudio();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int sdl_unlock (SDLAudioState *s, const char *forfn)
|
|
||||||
{
|
|
||||||
#if USE_SEMAPHORE
|
|
||||||
if (SDL_UnlockMutex (s->mutex)) {
|
|
||||||
sdl_logerr ("SDL_UnlockMutex for %s failed\n", forfn);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
SDL_UnlockAudio();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int sdl_post (SDLAudioState *s, const char *forfn)
|
|
||||||
{
|
|
||||||
#if USE_SEMAPHORE
|
|
||||||
if (SDL_SemPost (s->sem)) {
|
|
||||||
sdl_logerr ("SDL_SemPost for %s failed\n", forfn);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if USE_SEMAPHORE
|
|
||||||
static int sdl_wait (SDLAudioState *s, const char *forfn)
|
|
||||||
{
|
|
||||||
if (SDL_SemWait (s->sem)) {
|
|
||||||
sdl_logerr ("SDL_SemWait for %s failed\n", forfn);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int sdl_unlock_and_post (SDLAudioState *s, const char *forfn)
|
|
||||||
{
|
|
||||||
if (sdl_unlock (s, forfn)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sdl_post (s, forfn);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int aud_to_sdlfmt (audfmt_e fmt)
|
static int aud_to_sdlfmt (audfmt_e fmt)
|
||||||
{
|
{
|
||||||
switch (fmt) {
|
switch (fmt) {
|
||||||
@ -243,9 +174,9 @@ static int sdl_open (SDL_AudioSpec *req, SDL_AudioSpec *obt)
|
|||||||
static void sdl_close (SDLAudioState *s)
|
static void sdl_close (SDLAudioState *s)
|
||||||
{
|
{
|
||||||
if (s->initialized) {
|
if (s->initialized) {
|
||||||
sdl_lock (s, "sdl_close");
|
SDL_LockAudio();
|
||||||
s->exit = 1;
|
s->exit = 1;
|
||||||
sdl_unlock_and_post (s, "sdl_close");
|
SDL_UnlockAudio();
|
||||||
SDL_PauseAudio (1);
|
SDL_PauseAudio (1);
|
||||||
SDL_CloseAudio ();
|
SDL_CloseAudio ();
|
||||||
s->initialized = 0;
|
s->initialized = 0;
|
||||||
@ -267,30 +198,10 @@ static void sdl_callback (void *opaque, Uint8 *buf, int len)
|
|||||||
int to_mix, decr;
|
int to_mix, decr;
|
||||||
|
|
||||||
/* dolog ("in callback samples=%d\n", samples); */
|
/* dolog ("in callback samples=%d\n", samples); */
|
||||||
#if USE_SEMAPHORE
|
|
||||||
sdl_wait (s, "sdl_callback");
|
|
||||||
if (s->exit) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sdl_lock (s, "sdl_callback")) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (audio_bug(__func__, sdl->live < 0 || sdl->live > hw->samples)) {
|
|
||||||
dolog ("sdl->live=%d hw->samples=%d\n",
|
|
||||||
sdl->live, hw->samples);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sdl->live) {
|
|
||||||
goto again;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (s->exit || !sdl->live) {
|
if (s->exit || !sdl->live) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* dolog ("in callback live=%d\n", live); */
|
/* dolog ("in callback live=%d\n", live); */
|
||||||
to_mix = audio_MIN (samples, sdl->live);
|
to_mix = audio_MIN (samples, sdl->live);
|
||||||
@ -301,33 +212,20 @@ static void sdl_callback (void *opaque, Uint8 *buf, int len)
|
|||||||
|
|
||||||
/* dolog ("in callback to_mix %d, chunk %d\n", to_mix, chunk); */
|
/* dolog ("in callback to_mix %d, chunk %d\n", to_mix, chunk); */
|
||||||
hw->clip (buf, src, chunk);
|
hw->clip (buf, src, chunk);
|
||||||
#if USE_SEMAPHORE
|
|
||||||
sdl->rpos = (sdl->rpos + chunk) % hw->samples;
|
|
||||||
#else
|
|
||||||
hw->rpos = (hw->rpos + chunk) % hw->samples;
|
hw->rpos = (hw->rpos + chunk) % hw->samples;
|
||||||
#endif
|
|
||||||
to_mix -= chunk;
|
to_mix -= chunk;
|
||||||
buf += chunk << hw->info.shift;
|
buf += chunk << hw->info.shift;
|
||||||
}
|
}
|
||||||
samples -= decr;
|
samples -= decr;
|
||||||
sdl->live -= decr;
|
sdl->live -= decr;
|
||||||
sdl->decr += decr;
|
sdl->decr += decr;
|
||||||
|
|
||||||
#if USE_SEMAPHORE
|
|
||||||
again:
|
|
||||||
if (sdl_unlock (s, "sdl_callback")) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
/* dolog ("done len=%d\n", len); */
|
/* dolog ("done len=%d\n", len); */
|
||||||
|
|
||||||
#if (SDL_MAJOR_VERSION >= 2)
|
|
||||||
/* SDL2 does not clear the remaining buffer for us, so do it on our own */
|
/* SDL2 does not clear the remaining buffer for us, so do it on our own */
|
||||||
if (samples) {
|
if (samples) {
|
||||||
memset(buf, 0, samples << hw->info.shift);
|
memset(buf, 0, samples << hw->info.shift);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sdl_write_out (SWVoiceOut *sw, void *buf, int len)
|
static int sdl_write_out (SWVoiceOut *sw, void *buf, int len)
|
||||||
@ -339,11 +237,8 @@ static int sdl_run_out (HWVoiceOut *hw, int live)
|
|||||||
{
|
{
|
||||||
int decr;
|
int decr;
|
||||||
SDLVoiceOut *sdl = (SDLVoiceOut *) hw;
|
SDLVoiceOut *sdl = (SDLVoiceOut *) hw;
|
||||||
SDLAudioState *s = &glob_sdl;
|
|
||||||
|
|
||||||
if (sdl_lock (s, "sdl_run_out")) {
|
SDL_LockAudio();
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sdl->decr > live) {
|
if (sdl->decr > live) {
|
||||||
ldebug ("sdl->decr %d live %d sdl->live %d\n",
|
ldebug ("sdl->decr %d live %d sdl->live %d\n",
|
||||||
@ -355,19 +250,10 @@ static int sdl_run_out (HWVoiceOut *hw, int live)
|
|||||||
decr = audio_MIN (sdl->decr, live);
|
decr = audio_MIN (sdl->decr, live);
|
||||||
sdl->decr -= decr;
|
sdl->decr -= decr;
|
||||||
|
|
||||||
#if USE_SEMAPHORE
|
|
||||||
sdl->live = live - decr;
|
|
||||||
hw->rpos = sdl->rpos;
|
|
||||||
#else
|
|
||||||
sdl->live = live;
|
sdl->live = live;
|
||||||
#endif
|
|
||||||
|
|
||||||
if (sdl->live > 0) {
|
SDL_UnlockAudio();
|
||||||
sdl_unlock_and_post (s, "sdl_run_out");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
sdl_unlock (s, "sdl_run_out");
|
|
||||||
}
|
|
||||||
return decr;
|
return decr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -449,23 +335,6 @@ static void *sdl_audio_init (void)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if USE_SEMAPHORE
|
|
||||||
s->mutex = SDL_CreateMutex ();
|
|
||||||
if (!s->mutex) {
|
|
||||||
sdl_logerr ("Failed to create SDL mutex\n");
|
|
||||||
SDL_QuitSubSystem (SDL_INIT_AUDIO);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
s->sem = SDL_CreateSemaphore (0);
|
|
||||||
if (!s->sem) {
|
|
||||||
sdl_logerr ("Failed to create SDL semaphore\n");
|
|
||||||
SDL_DestroyMutex (s->mutex);
|
|
||||||
SDL_QuitSubSystem (SDL_INIT_AUDIO);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
s->driver_created = true;
|
s->driver_created = true;
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
@ -474,10 +343,6 @@ static void sdl_audio_fini (void *opaque)
|
|||||||
{
|
{
|
||||||
SDLAudioState *s = opaque;
|
SDLAudioState *s = opaque;
|
||||||
sdl_close (s);
|
sdl_close (s);
|
||||||
#if USE_SEMAPHORE
|
|
||||||
SDL_DestroySemaphore (s->sem);
|
|
||||||
SDL_DestroyMutex (s->mutex);
|
|
||||||
#endif
|
|
||||||
SDL_QuitSubSystem (SDL_INIT_AUDIO);
|
SDL_QuitSubSystem (SDL_INIT_AUDIO);
|
||||||
s->driver_created = false;
|
s->driver_created = false;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user