tAdd sound support on Mac - vaccinewars - be a doctor and try to vaccinate the world
(HTM) git clone git://src.adamsgaard.dk/vaccinewars
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 81bdbf0ebfdca35cfde80dcc3a70911446234feb
(DIR) parent c6c0df719bf603a7547cc1f85c1179957d96344b
(HTM) Author: Ben Webb <ben@salilab.org>
Date: Tue, 3 Nov 2020 23:24:33 -0800
Add sound support on Mac
Add a new sound driver which uses the native
Cocoa libraries on Mac OS to play sounds.
This requires an Objective C compiler.
Diffstat:
M ChangeLog | 1 +
M configure.ac | 25 +++++++++++++++++++++++++
M src/plugins/Makefile.am | 12 ++++++++++--
A src/plugins/sound_cocoa.m | 70 +++++++++++++++++++++++++++++++
M src/sound.c | 6 ++++++
5 files changed, 112 insertions(+), 2 deletions(-)
---
(DIR) diff --git a/ChangeLog b/ChangeLog
t@@ -14,6 +14,7 @@ SVN
and MetaServer.UseSocks are removed (set the https_proxy environment
variable instead, as per
https://curl.haxx.se/libcurl/c/libcurl-tutorial.html#Environment)
+ - Add sound support on Mac.
- Fix for a DOS against the server using the REQUESTJET message type
(thanks to Doug Prostko for reporting the problem).
(DIR) diff --git a/configure.ac b/configure.ac
t@@ -58,8 +58,13 @@ AC_ARG_WITH(sdl,
[ --without-sdl do not support SDL sound output],
[ USE_SDL="$withval" ], [ USE_SDL="probe" ])
+AC_ARG_WITH(cocoa,
+[ --without-cocoa do not support Cocoa (Mac) sound output],
+[ USE_COCOA="$withval" ], [ USE_COCOA="probe" ])
+
ESD=no
SDL=no
+COCOA=no
dnl Test for Cygwin environment
AC_CYGWIN
t@@ -194,6 +199,25 @@ else
fi
fi
+ dnl Add Cocoa (Mac) sound support if available
+ if test "$USE_COCOA" != "no"; then
+ AC_PROG_OBJC
+ if test "x$OBJC" != "x"; then
+ AC_LANG_PUSH([Objective C])
+ AC_CHECK_HEADERS(AppKit/AppKit.h, [HAVE_APPKIT="1"], [HAVE_APPKIT="0"])
+ AC_LANG_POP()
+ if test "x$HAVE_APPKIT" = "x1"; then
+ COCOA="yes"
+ PLUGOBJS="$PLUGOBJS plugins/sound_cocoa.o"
+ AC_DEFINE(HAVE_COCOA, 1, [Do we have the Cocoa sound library?])
+ else
+ AC_MSG_ERROR([Cannot find AppKit.h, needed for Cocoa (Mac) sound])
+ fi
+ else
+ AC_MSG_ERROR([Cannot find Cocoa (Mac) sound library])
+ fi
+ fi
+
dnl Use console server by default
if test "$GUI_SERVER" = "probe"; then
GUI_SERVER="no"
t@@ -211,6 +235,7 @@ fi
AM_CONDITIONAL(ESD, test "$ESD" = "yes")
AM_CONDITIONAL(SDL, test "$SDL" = "yes")
+AM_CONDITIONAL(COCOA, test "$COCOA" = "yes")
dnl If probing was unsuccessful, these will be set to "no"; therefore,
dnl if still set to "probe" then everything worked, so set to "yes"
(DIR) diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am
t@@ -1,9 +1,11 @@
-noinst_LTLIBRARIES = libsound_esd.la libsound_sdl.la libsound_winmm.la
+noinst_LTLIBRARIES = libsound_esd.la libsound_sdl.la libsound_winmm.la libsound_cocoa.la
libsound_esd_la_SOURCES = sound_esd.c sound_esd.h
libsound_esd_la_LDFLAGS = @ESD_LIBS@
libsound_sdl_la_SOURCES = sound_sdl.c sound_sdl.h
libsound_sdl_la_LDFLAGS = @SDL_LIBS@
libsound_winmm_la_SOURCES = sound_winmm.c sound_winmm.h
+libsound_cocoa_la_LDFLAGS = -module -avoid-version -no-undefined -Wl,-framework,Foundation,-framework,AppKit
+libsound_cocoa_la_SOURCES = sound_cocoa.m
LIBS = @GLIB_LIBS@
AM_CPPFLAGS = @SOUND_CFLAGS@ @GLIB_CFLAGS@
LINKNOO = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS)
t@@ -16,7 +18,10 @@ endif
if SDL
SDL_SO = .libs/libsound_sdl.so
endif
-PLUGINS = $(ESD_SO) $(SDL_SO)
+if COCOA
+COCOA_SO = .libs/libsound_cocoa.so
+endif
+PLUGINS = $(ESD_SO) $(SDL_SO) $(COCOA_SO)
all-local: ${PLUGINS}
t@@ -29,6 +34,9 @@ all-local: ${PLUGINS}
.libs/libsound_winmm.so: $(libsound_winmm_la_OBJECTS)
$(LINKNOO) -o libsound_winmm.la -rpath $(libdir) $(libsound_winmm_la_LDFLAGS) $(libsound_winmm_la_OBJECTS) $(libsound_winmm_la_LIBADD) $(LIBS)
+.libs/libsound_cocoa.so: $(libsound_cocoa_la_OBJECTS)
+ $(LINKNOO) -o libsound_cocoa.la -rpath $(libdir) $(libsound_cocoa_la_LDFLAGS) $(libsound_cocoa_la_OBJECTS) $(libsound_cocoa_la_LIBADD) $(LIBS)
+
install-exec-am:
${mkinstalldirs} ${PLUGINDIR}
for plug in ${PLUGINS}; do \
(DIR) diff --git a/src/plugins/sound_cocoa.m b/src/plugins/sound_cocoa.m
t@@ -0,0 +1,70 @@
+/************************************************************************
+ * sound_cocoa.m Implementation of dopewars sound system (Cocoa driver)*
+ * Copyright (C) 1998-2020 Ben Webb *
+ * Email: benwebb@users.sf.net *
+ * WWW: https://dopewars.sourceforge.io/ *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 2 *
+ * of the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, *
+ * MA 02111-1307, USA. *
+ ************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_COCOA
+#include <glib.h>
+#include "../sound.h"
+
+#import <Foundation/Foundation.h>
+#import <AppKit/AppKit.h>
+
+/* Cache player by name of sound file */
+NSMutableDictionary *play_by_name;
+
+static gboolean SoundOpen_Cocoa(void)
+{
+ play_by_name = [[NSMutableDictionary alloc] init];
+ return TRUE;
+}
+
+static void SoundClose_Cocoa(void)
+{
+ [play_by_name release];
+}
+
+static void SoundPlay_Cocoa(const gchar *snd)
+{
+ NSString *sound = [[NSString alloc] initWithUTF8String:snd];
+ NSSound *p;
+ p = [play_by_name objectForKey:sound];
+ if (!p) {
+ p = [[NSSound alloc] initWithContentsOfFile:sound byReference:YES];
+ [play_by_name setObject:p forKey:sound];
+ }
+ [p play];
+}
+
+SoundDriver *sound_cocoa_init(void)
+{
+ static SoundDriver driver;
+
+ driver.name = "cocoa";
+ driver.open = SoundOpen_Cocoa;
+ driver.close = SoundClose_Cocoa;
+ driver.play = SoundPlay_Cocoa;
+ return &driver;
+}
+#endif
(DIR) diff --git a/src/sound.c b/src/sound.c
t@@ -35,6 +35,9 @@
#include "plugins/sound_sdl.h"
#include "plugins/sound_esd.h"
#include "plugins/sound_winmm.h"
+#ifdef HAVE_COCOA
+SoundDriver *sound_cocoa_init(void);
+#endif
#endif
#include "dopewars.h"
t@@ -155,6 +158,9 @@ void SoundInit(void)
#ifdef HAVE_WINMM
AddPlugin(sound_winmm_init, NULL);
#endif
+#ifdef HAVE_COCOA
+ AddPlugin(sound_cocoa_init, NULL);
+#endif
#endif
driver = NULL;
}