From d3d102710382bfb9a3bd74e660b22f90d4f36b3e Mon Sep 17 00:00:00 2001 From: deuce <> Date: Thu, 30 Apr 2020 01:57:20 +0000 Subject: [PATCH] Completely disentangle xpdev/xpbeep.c from conio/sdlfuncs.c SDL audio should work from any thread, and on the platforms that care, SDL video is coddled appropriately. The only question is around SDL_Quit() in an audio-only build, but we can punt on that since the default builds will never do that... the only thing I'm aware of that could be broken that way is tone, which nobody likes anyway. --- src/build/Common.bmake | 2 -- src/conio/Common.gmake | 6 ++-- src/conio/GNUmakefile | 10 ++---- src/conio/Makefile | 4 --- src/conio/ciolib.c | 22 ++++++------- src/conio/sdlfuncs.c | 72 +++--------------------------------------- src/conio/sdlfuncs.h | 6 ---- src/syncterm/COMPILING | 2 +- src/xpdev/sdlfuncs.c | 18 +++-------- src/xpdev/sdlfuncs.h | 3 +- src/xpdev/xpbeep.c | 24 +++++++------- 11 files changed, 36 insertions(+), 133 deletions(-) diff --git a/src/build/Common.bmake b/src/build/Common.bmake index d004f17c27..d5626f48ec 100644 --- a/src/build/Common.bmake +++ b/src/build/Common.bmake @@ -168,10 +168,8 @@ UIFC_SRC = $(SRC_ROOT)$(DIRSEP)uifc # SDL ciolib enabled by default for the moment. !ifndef WITHOUT_SDL -!ifndef USE_SDL_AUDIO USE_SDL = 1 !endif -!endif # Pull in lib-specific flags !include $(XPDEV_SRC)$(DIRSEP)Common.make diff --git a/src/conio/Common.gmake b/src/conio/Common.gmake index b5b5fb4338..f2b6603d1f 100644 --- a/src/conio/Common.gmake +++ b/src/conio/Common.gmake @@ -157,9 +157,7 @@ endif ifdef NO_X ifndef WITH_SDL - ifndef WITH_SDL_AUDIO - CIOLIB-MT_CFLAGS += -DNO_FONTS - CIOLIB_CFLAGS += -DNO_FONTS - endif + CIOLIB-MT_CFLAGS += -DNO_FONTS + CIOLIB_CFLAGS += -DNO_FONTS endif endif diff --git a/src/conio/GNUmakefile b/src/conio/GNUmakefile index d0f1a428bc..63e4398d11 100644 --- a/src/conio/GNUmakefile +++ b/src/conio/GNUmakefile @@ -19,16 +19,10 @@ else NEED_BITMAP := 1 endif -ifdef WITH_SDL_AUDIO +ifdef WITH_SDL + NEED_BITMAP := 1 OBJS += $(MTOBJODIR)$(DIRSEP)sdl_con$(OFILE) OBJS += $(MTOBJODIR)$(DIRSEP)sdlfuncs$(OFILE) - NEED_BITMAP := 1 -else - ifdef WITH_SDL - NEED_BITMAP := 1 - OBJS += $(MTOBJODIR)$(DIRSEP)sdl_con$(OFILE) - OBJS += $(MTOBJODIR)$(DIRSEP)sdlfuncs$(OFILE) - endif endif ifeq ($(os),netbsd) diff --git a/src/conio/Makefile b/src/conio/Makefile index 601977a018..f16681f361 100644 --- a/src/conio/Makefile +++ b/src/conio/Makefile @@ -20,16 +20,12 @@ SRC_ROOT = .. # Cross platform/compiler definitions !include ..\build\Common.bmake # defines clean and output directory rules -!ifdef USE_SDL_AUDIO -OBJS = $(OBJS) $(MTOBJODIR)$(DIRSEP)sdl_con$(OFILE) -!else !ifdef USE_SDL OBJS = $(OBJS) $(MTOBJODIR)$(DIRSEP)sdl_con$(OFILE) OBJS = $(OBJS) $(MTOBJODIR)$(DIRSEP)SDL_win32_main$(OFILE) OBJS = $(OBJS) $(MTOBJODIR)$(DIRSEP)sdlfuncs$(OFILE) NEED_BITMAP = 1 !endif -!endif !ifdef NEED_BITMAP OBJS = $(OBJS) $(MTOBJODIR)$(DIRSEP)bitmap_con$(OFILE) diff --git a/src/conio/ciolib.c b/src/conio/ciolib.c index bca88a156a..37457c09d9 100644 --- a/src/conio/ciolib.c +++ b/src/conio/ciolib.c @@ -50,7 +50,7 @@ #define CIOLIB_NO_MACROS #include "ciolib.h" -#if defined(WITH_SDL) || defined(WITH_SDL_AUDIO) +#if defined(WITH_SDL) #include "sdl_con.h" #include "sdlfuncs.h" #endif @@ -141,13 +141,13 @@ CIOLIBEXPORT void CIOLIBCALL ciolib_setwinsize(int width, int height); CIOLIBEXPORT void CIOLIBCALL ciolib_setwinposition(int x, int y); CIOLIBEXPORT enum ciolib_codepage CIOLIBCALL ciolib_getcodepage(void); -#if defined(WITH_SDL) || defined(WITH_SDL_AUDIO) +#if defined(WITH_SDL) int sdl_video_initialized = 0; #endif #define CIOLIB_INIT() { if(initialized != 1) initciolib(CIOLIB_MODE_AUTO); } -#if defined(WITH_SDL) || defined(WITH_SDL_AUDIO) +#if defined(WITH_SDL) static int try_sdl_init(int mode) { if(!sdl_initciolib(mode)) { @@ -201,10 +201,9 @@ static int try_sdl_init(int mode) #ifndef NO_X static int try_x_init(int mode) { -#if defined(WITH_SDL) || defined(WITH_SDL_AUDIO) +#if defined(WITH_SDL) if (sdl_video_initialized) { sdl.QuitSubSystem(SDL_INIT_VIDEO); - sdl_video_initialized = FALSE; } #endif @@ -256,10 +255,9 @@ static int try_x_init(int mode) static int try_curses_init(int mode) { -#if defined(WITH_SDL) || defined(WITH_SDL_AUDIO) +#if defined(WITH_SDL) if (sdl_video_initialized) { sdl.QuitSubSystem(SDL_INIT_VIDEO); - sdl_video_initialized = FALSE; } #endif @@ -293,10 +291,9 @@ static int try_curses_init(int mode) static int try_ansi_init(int mode) { -#if defined(WITH_SDL) || defined(WITH_SDL_AUDIO) +#if defined(WITH_SDL) if (sdl_video_initialized) { sdl.QuitSubSystem(SDL_INIT_VIDEO); - sdl_video_initialized = FALSE; } #endif @@ -324,10 +321,9 @@ static int try_ansi_init(int mode) #endif static int try_conio_init(int mode) { -#if defined(WITH_SDL) || defined(WITH_SDL_AUDIO) +#if defined(WITH_SDL) if (sdl_video_initialized) { sdl.QuitSubSystem(SDL_INIT_VIDEO); - sdl_video_initialized = FALSE; } #endif @@ -389,7 +385,7 @@ CIOLIBEXPORT int CIOLIBCALL initciolib(int mode) switch(mode) { case CIOLIB_MODE_AUTO: -#if defined(WITH_SDL) || defined(WITH_SDL_AUDIO) +#if defined(WITH_SDL) if(!try_sdl_init(CIOLIB_MODE_SDL)) #endif #ifdef _WIN32 @@ -424,7 +420,7 @@ CIOLIBEXPORT int CIOLIBCALL initciolib(int mode) try_ansi_init(mode); break; -#if defined(WITH_SDL) || defined(WITH_SDL_AUDIO) +#if defined(WITH_SDL) case CIOLIB_MODE_SDL: case CIOLIB_MODE_SDL_FULLSCREEN: try_sdl_init(mode); diff --git a/src/conio/sdlfuncs.c b/src/conio/sdlfuncs.c index 5c5cdb87d5..a0d4497c9a 100644 --- a/src/conio/sdlfuncs.c +++ b/src/conio/sdlfuncs.c @@ -19,8 +19,6 @@ struct sdlfuncs sdl; #include "ciolib.h" static int sdl_funcs_loaded=0; -static int sdl_initialized=0; -static int sdl_audio_initialized=0; static void QuitWrap(void); @@ -109,30 +107,6 @@ int load_sdl_funcs(struct sdlfuncs *sdlf) xp_dlclose(sdl_dll); return(-1); } - if((sdlf->OpenAudio=xp_dlsym(sdl_dll, SDL_OpenAudio))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->CloseAudio=xp_dlsym(sdl_dll, SDL_CloseAudio))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->PauseAudio=xp_dlsym(sdl_dll, SDL_PauseAudio))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->LockAudio=xp_dlsym(sdl_dll, SDL_LockAudio))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->UnlockAudio=xp_dlsym(sdl_dll, SDL_UnlockAudio))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetAudioStatus=xp_dlsym(sdl_dll, SDL_GetAudioStatus))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } if((sdlf->CreateTexture=xp_dlsym(sdl_dll, SDL_CreateTexture))==NULL) { xp_dlclose(sdl_dll); return(-1); @@ -226,10 +200,6 @@ int load_sdl_funcs(struct sdlfuncs *sdlf) int init_sdl_video(void) { char *drivername; - int use_sdl_video=FALSE; -#ifdef _WIN32 - char *driver_env=NULL; -#endif if(sdl_video_initialized) return(0); @@ -239,19 +209,12 @@ int init_sdl_video(void) if (!sdl.gotfuncs) return -1; - use_sdl_video=TRUE; - sdl.SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "2" ); sdl.SetHint(SDL_HINT_VIDEO_ALLOW_SCREENSAVER, "1" ); #ifdef _WIN32 /* Fail to windib (ie: No mouse attached) */ - if(sdl.Init(SDL_INIT_VIDEO)) { - if(sdl.Init(0)==0) - sdl_initialized=TRUE; - } - else { + if(sdl.Init(SDL_INIT_VIDEO) == 0) { sdl_video_initialized=TRUE; - sdl_initialized=TRUE; } #else /* @@ -262,32 +225,18 @@ int init_sdl_video(void) * This ugly hack attempts to prevent this... of course, remote X11 * connections must still be allowed. */ - if((!use_sdl_video) || ((getenv("REMOTEHOST")!=NULL || getenv("SSH_CLIENT")!=NULL) && getenv("DISPLAY")==NULL)) { - /* Sure ,we can't use video, but audio is still valid! */ - if(sdl.Init(0)==0) - sdl_initialized=TRUE; - } - else { + if(getenv("DISPLAY") != NULL || (getenv("REMOTEHOST") == NULL && getenv("SSH_CLIENT") == NULL)) { if(sdl.Init(SDL_INIT_VIDEO)==0) { - sdl_initialized=TRUE; sdl_video_initialized=TRUE; } - else { - /* Sure ,we can't use video, but audio is still valid! */ - if(sdl.Init(0)==0) - sdl_initialized=TRUE; - } } #endif if(sdl_video_initialized && (drivername = sdl.GetCurrentVideoDriver())!=NULL) { /* Unacceptable drivers */ if((!strcmp(drivername, "caca")) || (!strcmp(drivername,"aalib")) || (!strcmp(drivername,"dummy"))) { - sdl.QuitSubSystem(SDL_INIT_VIDEO); + sdl.Quit(); sdl_video_initialized=FALSE; } - else { - sdl_video_initialized=TRUE; - } } if(sdl_video_initialized) { @@ -298,22 +247,9 @@ int init_sdl_video(void) return(-1); } -int init_sdl_audio(void) -{ - if(!sdl_initialized) - return(-1); - if(sdl_audio_initialized) - return(0); - if(sdl.InitSubSystem(SDL_INIT_AUDIO)==0) { - sdl_audio_initialized=TRUE; - return(0); - } - return(-1); -} - static void QuitWrap(void) { - if (sdl_initialized) { + if (sdl_video_initialized) { #if !defined(__DARWIN__) exit_sdl_con(); #endif diff --git a/src/conio/sdlfuncs.h b/src/conio/sdlfuncs.h index 19de796a91..3a8d21071f 100644 --- a/src/conio/sdlfuncs.h +++ b/src/conio/sdlfuncs.h @@ -32,12 +32,6 @@ struct sdlfuncs { const char *(HACK_HACK_HACK *GetError) (void); int (HACK_HACK_HACK *InitSubSystem)(Uint32 flags); void (HACK_HACK_HACK *QuitSubSystem)(Uint32 flags); - int (HACK_HACK_HACK *OpenAudio)(SDL_AudioSpec *desired, SDL_AudioSpec *obtained); - void (HACK_HACK_HACK *CloseAudio)(void); - void (HACK_HACK_HACK *LockAudio)(void); - void (HACK_HACK_HACK *UnlockAudio)(void); - void (HACK_HACK_HACK *PauseAudio)(int pause_on); - SDL_AudioStatus (HACK_HACK_HACK *GetAudioStatus)(void); SDL_Texture* (HACK_HACK_HACK *CreateTexture) (SDL_Renderer *renderer, Uint32 format, int access, int w, int h); int (HACK_HACK_HACK *UpdateTexture) (SDL_Texture *texture, const SDL_Rect * rect, const void *pixels, int pitch); int (HACK_HACK_HACK *RenderClear) (SDL_Renderer *renderer); diff --git a/src/syncterm/COMPILING b/src/syncterm/COMPILING index 43c85b044c..a814c3a24a 100644 --- a/src/syncterm/COMPILING +++ b/src/syncterm/COMPILING @@ -39,7 +39,7 @@ Refer to src/build/Common.gmake or src/build/Common.bmake for details of some of the make options the build system supports. Release builds for Mac OS X use the following command line: -make USE_SDL_AUDIO=1 STATIC_SDL=1 RELEASE=1 PREFIX=/usr +make RELEASE=1 USE_SDL_AUDIO=1 PREFIX=/usr The package is generated and copied do a disk image which is then converted with the following command: diff --git a/src/xpdev/sdlfuncs.c b/src/xpdev/sdlfuncs.c index 597a21fc6a..3eab1578aa 100644 --- a/src/xpdev/sdlfuncs.c +++ b/src/xpdev/sdlfuncs.c @@ -2,19 +2,11 @@ #include <stdio.h> /* NULL */ #include <SDL.h> -#ifndef main - #define USE_REAL_MAIN -#endif #include "gen_defs.h" #include "threadwrap.h" -#ifdef USE_REAL_MAIN - #undef main -#endif #include "sdlfuncs.h" -#ifndef _WIN32 -struct sdlfuncs sdl; -#endif +struct sdlfuncs xpbeep_sdl; /* Make xp_dl do static linking */ #ifdef STATIC_SDL @@ -26,7 +18,7 @@ static int sdl_funcs_loaded=0; static int sdl_initialized=0; static int sdl_audio_initialized=0; -int load_sdl_funcs(struct sdlfuncs *sdlf) +int xpbeep_load_sdl_funcs(struct sdlfuncs *sdlf) { dll_handle sdl_dll; const char *libnames[]={"SDL", "SDL-1.2", "SDL-1.1", NULL}; @@ -100,18 +92,18 @@ int load_sdl_funcs(struct sdlfuncs *sdlf) int init_sdl_audio(void) { if (!sdl_funcs_loaded) { - if (load_sdl_funcs(&sdl) != 0) + if (xpbeep_load_sdl_funcs(&xpbeep_sdl) != 0) return -1; } if(!sdl_initialized) { - if(sdl.Init(0)==0) + if(xpbeep_sdl.Init(0)==0) sdl_initialized=TRUE; else return(-1); } if(sdl_audio_initialized) return(0); - if(sdl.InitSubSystem(SDL_INIT_AUDIO)==0) { + if(xpbeep_sdl.InitSubSystem(SDL_INIT_AUDIO)==0) { sdl_audio_initialized=TRUE; return(0); } diff --git a/src/xpdev/sdlfuncs.h b/src/xpdev/sdlfuncs.h index aa61d64c4a..2251da354d 100644 --- a/src/xpdev/sdlfuncs.h +++ b/src/xpdev/sdlfuncs.h @@ -23,8 +23,7 @@ struct sdlfuncs { int gotfuncs; }; -/* Defined in SDL_win32_main.c for Win32 */ -extern struct sdlfuncs sdl; +extern struct sdlfuncs xpbeep_sdl; extern SDL_sem *sdl_exit_sem; #ifdef __cplusplus diff --git a/src/xpdev/xpbeep.c b/src/xpdev/xpbeep.c index f667c98a1f..c41eed1c53 100644 --- a/src/xpdev/xpbeep.c +++ b/src/xpdev/xpbeep.c @@ -335,7 +335,7 @@ void DLLCALL sdl_fillbuf(void *userdata, Uint8 *stream, int len) sdl_audio_buf_pos+=copylen; /* If we're done, post the semaphore */ if(sdl_audio_buf_pos>=sdl_audio_buf_len) { - sdl.SemPost(sdlToneDone); + xpbeep_sdl.SemPost(sdlToneDone); sdl_audio_buf_len=0; sdl_audio_buf_pos=0; free((void *)swave); @@ -447,14 +447,14 @@ DLLCALL xptone_open_locked(void) spec.size=256; spec.callback=sdl_fillbuf; spec.userdata=NULL; - if(sdl.OpenAudio(&spec, NULL)==-1) { + if(xpbeep_sdl.OpenAudio(&spec, NULL)==-1) { sdl_device_open_failed=TRUE; } else { - sdlToneDone=sdl.SDL_CreateSemaphore(0); + sdlToneDone=xpbeep_sdl.SDL_CreateSemaphore(0); sdl_audio_buf_len=0; sdl_audio_buf_pos=0; - sdl.PauseAudio(FALSE); + xpbeep_sdl.PauseAudio(FALSE); handle_type=SOUND_DEVICE_SDL; handle_rc++; return(TRUE); @@ -611,7 +611,7 @@ xptone_complete_locked(void) #ifdef WITH_SDL_AUDIO else if(handle_type==SOUND_DEVICE_SDL) { - while(sdl.GetAudioStatus()==SDL_AUDIO_PLAYING) + while(xpbeep_sdl.GetAudioStatus()==SDL_AUDIO_PLAYING) SLEEP(1); } #endif @@ -676,8 +676,8 @@ BOOL DLLCALL xptone_close_locked(void) #ifdef WITH_SDL_AUDIO if(handle_type==SOUND_DEVICE_SDL) { - sdl.CloseAudio(); - sdl.SDL_DestroySemaphore(sdlToneDone); + xpbeep_sdl.CloseAudio(); + xpbeep_sdl.SDL_DestroySemaphore(sdlToneDone); } #endif @@ -786,14 +786,14 @@ do_xp_play_sample(const unsigned char *sampo, size_t sz, int *freed) #ifdef WITH_SDL_AUDIO if(handle_type==SOUND_DEVICE_SDL) { - sdl.LockAudio(); + xpbeep_sdl.LockAudio(); swave=samp; sdl_audio_buf_pos=0; sdl_audio_buf_len=sz; - sdl.UnlockAudio(); - sdl.PauseAudio(FALSE); - sdl.SemWait(sdlToneDone); - sdl.PauseAudio(TRUE); + xpbeep_sdl.UnlockAudio(); + xpbeep_sdl.PauseAudio(FALSE); + xpbeep_sdl.SemWait(sdlToneDone); + xpbeep_sdl.PauseAudio(TRUE); return TRUE; } #endif -- GitLab