X-Git-Url: https://repo.jachan.dev/qemu.git/blobdiff_plain/1dd3e4d13d0d59de61de518c9e504cb444782510..2685d2961b51437d0c7bc71f4ed7c320f6cbd010:/audio/sdlaudio.c diff --git a/audio/sdlaudio.c b/audio/sdlaudio.c index e8c6a2866b..b74dcfa734 100644 --- a/audio/sdlaudio.c +++ b/audio/sdlaudio.c @@ -48,7 +48,7 @@ typedef struct SDLVoiceOut { static struct { int nb_samples; } conf = { - 1024 + .nb_samples = 1024 }; static struct SDLAudioState { @@ -115,23 +115,19 @@ static int sdl_unlock_and_post (SDLAudioState *s, const char *forfn) return sdl_post (s, forfn); } -static int aud_to_sdlfmt (audfmt_e fmt, int *shift) +static int aud_to_sdlfmt (audfmt_e fmt) { switch (fmt) { case AUD_FMT_S8: - *shift = 0; return AUDIO_S8; case AUD_FMT_U8: - *shift = 0; return AUDIO_U8; case AUD_FMT_S16: - *shift = 1; return AUDIO_S16LSB; case AUD_FMT_U16: - *shift = 1; return AUDIO_U16LSB; default: @@ -188,11 +184,20 @@ static int sdl_open (SDL_AudioSpec *req, SDL_AudioSpec *obt) { int status; #ifndef _WIN32 + int err; sigset_t new, old; /* Make sure potential threads created by SDL don't hog signals. */ - sigfillset (&new); - pthread_sigmask (SIG_BLOCK, &new, &old); + err = sigfillset (&new); + if (err) { + dolog ("sdl_open: sigfillset failed: %s\n", strerror (errno)); + return -1; + } + err = pthread_sigmask (SIG_BLOCK, &new, &old); + if (err) { + dolog ("sdl_open: pthread_sigmask failed: %s\n", strerror (err)); + return -1; + } #endif status = SDL_OpenAudio (req, obt); @@ -201,7 +206,14 @@ static int sdl_open (SDL_AudioSpec *req, SDL_AudioSpec *obt) } #ifndef _WIN32 - pthread_sigmask (SIG_SETMASK, &old, NULL); + err = pthread_sigmask (SIG_SETMASK, &old, NULL); + if (err) { + dolog ("sdl_open: pthread_sigmask (restore) failed: %s\n", + strerror (errno)); + /* We have failed to restore original signal mask, all bets are off, + so exit the process */ + exit (EXIT_FAILURE); + } #endif return status; } @@ -282,18 +294,16 @@ static int sdl_write_out (SWVoiceOut *sw, void *buf, int len) return audio_pcm_sw_write (sw, buf, len); } -static int sdl_run_out (HWVoiceOut *hw) +static int sdl_run_out (HWVoiceOut *hw, int live) { - int decr, live; + int decr; SDLVoiceOut *sdl = (SDLVoiceOut *) hw; SDLAudioState *s = &glob_sdl; - if (sdl_lock (s, "sdl_callback")) { + if (sdl_lock (s, "sdl_run_out")) { return 0; } - live = audio_pcm_hw_get_live_out (hw); - if (sdl->decr > live) { ldebug ("sdl->decr %d live %d sdl->live %d\n", sdl->decr, @@ -308,10 +318,10 @@ static int sdl_run_out (HWVoiceOut *hw) hw->rpos = sdl->rpos; if (sdl->live > 0) { - sdl_unlock_and_post (s, "sdl_callback"); + sdl_unlock_and_post (s, "sdl_run_out"); } else { - sdl_unlock (s, "sdl_callback"); + sdl_unlock (s, "sdl_run_out"); } return decr; } @@ -328,16 +338,13 @@ static int sdl_init_out (HWVoiceOut *hw, struct audsettings *as) SDLVoiceOut *sdl = (SDLVoiceOut *) hw; SDLAudioState *s = &glob_sdl; SDL_AudioSpec req, obt; - int shift; int endianess; int err; audfmt_e effective_fmt; struct audsettings obt_as; - shift <<= as->nchannels == 2; - req.freq = as->freq; - req.format = aud_to_sdlfmt (as->fmt, &shift); + req.format = aud_to_sdlfmt (as->fmt); req.channels = as->nchannels; req.samples = conf.nb_samples; req.callback = sdl_callback; @@ -420,10 +427,12 @@ static void sdl_audio_fini (void *opaque) } static struct audio_option sdl_options[] = { - {.name = "SAMPLES", - .tag = AUD_OPT_INT, - .valp = &conf.nb_samples, - .descr = "Size of SDL buffer in samples"}, + { + .name = "SAMPLES", + .tag = AUD_OPT_INT, + .valp = &conf.nb_samples, + .descr = "Size of SDL buffer in samples" + }, { /* End of list */ } };