Ok I downloaded https://macintoshgarden.org/games/the-colony and it played wonderfully.
When removing the audio device, it says, "Cannot open sndio." but it still works so for me! When I get to my i386 I hope to test it there as well. On Mon, 2024-07-22 at 19:26 -0400, Jag Talon wrote: > This is amazing! I tested it on amd64, and I heard the bootup beep > and > also the sample "How are you?" audio in HyperCard. > > I haven't found longer audio to test it with perhaps I can run a game > inside it soon. > > Thank you so much! > > On Mon, 2024-07-22 at 00:31 -0400, George Koehler wrote: > > This diff adds sound to Mini vMac, with files/SGLUSNIO.h using > > sndio. > > > > The emulator passes sound samples via MySound_BeginWrite and > > MySound_EndWrite to the X11 glue OSGLUXWN.c, which collects them > > into > > a ring of 16 buffers of 512 samples each. The other sound glues > > (for > > ALSA and /dev/dsp) use non-blocking writes in a weird way. I tried > > to > > use non-blocking writes for sndio, but that caused the sound to go > > silent after 3 seconds (at the 3rd call to MySound_SecondNotify). > > This diff uses blocking writes. > > > > I have not contacted upstream. When I do, I plan to change the > > license of files/GLUSNIO.h to Mini vMac's license. > > > > Does it work? Is it ok to commit? > > --gkoehler > > > > Index: Makefile > > =================================================================== > > RCS file: /cvs/ports/emulators/minivmac/Makefile,v > > diff -u -p -r1.1.1.1 Makefile > > --- Makefile 18 Jul 2024 01:58:15 -0000 1.1.1.1 > > +++ Makefile 22 Jul 2024 03:45:27 -0000 > > @@ -2,6 +2,7 @@ ONLY_FOR_ARCHS = i386 amd64 powerpc > > > > COMMENT = early macintosh emulator > > V = 36.04 > > +REVISION = 0 > > DISTNAME = minivmac-${V} > > > > CATEGORIES = emulators > > @@ -10,7 +11,7 @@ HOMEPAGE > > = https://gryphel.com/c/miniv > > > > MAINTAINER = Jag Talon <jag@aangat.lahat.computer> > > > > -WANTLIB = X11 c > > +WANTLIB = X11 c sndio > > > > # GPLv2 > > PERMIT_PACKAGE = Yes > > @@ -31,6 +32,9 @@ ALL_TARGET = minivmac > > SETUP_FLAGS-amd64 = -t ob64 > > SETUP_FLAGS-i386 = -t obsd > > SETUP_FLAGS-powerpc = -t obsd -cpu ppc > > + > > +post-extract: > > + cp ${FILESDIR}/SGLUSNIO.h ${WRKSRC}/src > > > > do-gen: > > cd ${WRKSRC}; cc setup/tool.c -o setup_t && \ > > Index: files/SGLUSNIO.h > > =================================================================== > > RCS file: files/SGLUSNIO.h > > diff -N files/SGLUSNIO.h > > --- /dev/null 1 Jan 1970 00:00:00 -0000 > > +++ files/SGLUSNIO.h 22 Jul 2024 03:45:27 -0000 > > @@ -0,0 +1,125 @@ > > +/* > > + * Copyright (c) 2024 George Koehler <gkoeh...@openbsd.org> > > + * > > + * Permission to use, copy, modify, and distribute this software > > for > > any > > + * purpose with or without fee is hereby granted, provided that > > the > > above > > + * copyright notice and this permission notice appear in all > > copies. > > + * > > + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL > > WARRANTIES > > + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES > > OF > > + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE > > LIABLE FOR > > + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY > > DAMAGES > > + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER > > IN AN > > + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, > > ARISING > > OUT OF > > + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. > > + */ > > + > > +/* > > + Sound GLUe for SNdIO, https://man.openbsd.org/sio_open.3 > > +*/ > > + > > +LOCALVAR struct sio_hdl *audio_hdl; > > +LOCALVAR int audio_samples_pending; > > + > > +LOCALPROC MySound_Moved(void *arg, int delta) > > +{ > > + audio_samples_pending -= delta; > > +} > > + > > +LOCALPROC MySound_Start(void) > > +{ > > + if (audio_hdl) { > > + MySound_Start0(); > > + audio_samples_pending = 0; > > + sio_start(audio_hdl); > > + } > > +} > > + > > +LOCALPROC MySound_Stop(void) > > +{ > > + if (audio_hdl) { > > + sio_flush(audio_hdl); > > + } > > +} > > + > > +LOCALFUNC blnr MySound_Init(void) > > +{ > > + struct sio_par par; > > + > > + audio_hdl = sio_open(SIO_DEVANY, SIO_PLAY, 0 /* blocking > > */); > > + if (audio_hdl == NULL) { > > + fprintf(stderr, "Cannot open sndio.\n"); > > + return trueblnr; > > + } > > + > > + sio_initpar(&par); > > + par.bits = 1 << kLn2SoundSampSz; > > + par.sig = 0; /* unsigned samples */ > > + par.le = SIO_LE_NATIVE; /* byte order */ > > + par.pchan = 1; > > + par.rate = SOUND_SAMPLERATE; > > + par.round = kOneBuffLen; > > + if (!sio_setpar(audio_hdl, &par) || > > + !sio_getpar(audio_hdl, &par) || > > + par.bits != 1 << kLn2SoundSampSz || par.sig != 0 > > || > > + par.le != SIO_LE_NATIVE || par.pchan != 1 || > > + par.rate < SOUND_SAMPLERATE * 995 / 1000 || > > + par.rate > SOUND_SAMPLERATE * 1005 / 1000) > > + { > > + fprintf(stderr, "Cannot set sndio parameters.\n"); > > + goto init_error; > > + } > > + > > + sio_onmove(audio_hdl, MySound_Moved, NULL); > > + return trueblnr; > > + > > +init_error: > > + sio_close(audio_hdl); > > + audio_hdl = NULL; > > + return trueblnr; > > +} > > + > > +LOCALPROC MySound_UnInit(void) > > +{ > > + if (audio_hdl) { > > + sio_close(audio_hdl); > > + audio_hdl = NULL; > > + } > > +} > > + > > +GLOBALOSGLUPROC MySound_EndWrite(ui4r actL) > > +{ > > + tpSoundSamp PlayPtr; > > + ui4b TotPendBuffs; > > + > > + if (!MySound_EndWrite0(actL) || !audio_hdl) { > > + return; > > + } > > + > > + /* sio_write will call MySound_Moved. */ > > + audio_samples_pending += kOneBuffLen; > > + > > + /* > > + Play one buffer (of kOneBuffSz bytes). > > + Don't leave part of the buffer for later. > > + */ > > + PlayPtr = TheSoundBuffer + (ThePlayOffset & kAllBuffMask); > > + if (sio_write(audio_hdl, PlayPtr, kOneBuffSz) != > > kOneBuffSz) > > { > > + fprintf(stderr, "Error from sndio playing > > audio!\n"); > > + sio_close(audio_hdl); > > + audio_hdl = NULL; > > + } > > + ThePlayOffset += kOneBuffLen; > > + > > + TotPendBuffs = audio_samples_pending >> kLnOneBuffLen; > > + if (TotPendBuffs < MinFilledSoundBuffs) { > > + MinFilledSoundBuffs = TotPendBuffs; > > + } > > +} > > + > > +LOCALPROC MySound_SecondNotify(void) > > +{ > > + if (audio_hdl) { > > + MySound_SecondNotify0(); > > + } > > +} > > Index: patches/patch-setup_SPBLDOPT_i > > =================================================================== > > RCS file: patches/patch-setup_SPBLDOPT_i > > diff -N patches/patch-setup_SPBLDOPT_i > > --- /dev/null 1 Jan 1970 00:00:00 -0000 > > +++ patches/patch-setup_SPBLDOPT_i 22 Jul 2024 03:45:27 -0000 > > @@ -0,0 +1,42 @@ > > +- enable sndio on OpenBSD > > + > > +Index: setup/SPBLDOPT.i > > +--- setup/SPBLDOPT.i.orig > > ++++ setup/SPBLDOPT.i > > +@@ -542,7 +542,8 @@ LOCALFUNC blnr dfo_SoundEnabled(void) > > + || ((gbk_apifam_xwn == gbo_apifam) > > + && ((gbo_targfam == gbk_targfam_linx) > > + || (gbo_targfam == > > gbk_targfam_fbsd) > > +- || (gbo_targfam == > > gbk_targfam_nbsd))); > > ++ || (gbo_targfam == > > gbk_targfam_nbsd) > > ++ || (gbo_targfam == > > gbk_targfam_obsd))); > > + > > + return v; > > + } > > +@@ -568,6 +569,7 @@ enum { > > + gbk_sndapi_none, > > + gbk_sndapi_alsa, > > + gbk_sndapi_ddsp, > > ++ gbk_sndapi_sndio, > > + kNumSndApiLevels > > + }; > > + > > +@@ -594,6 +596,9 @@ LOCALFUNC char * GetSndApiName(int i) > > + case gbk_sndapi_ddsp: > > + s = "ddsp"; > > + break; > > ++ case gbk_sndapi_sndio: > > ++ s = "sndio"; > > ++ break; > > + default: > > + s = "(unknown sound api)"; > > + break; > > +@@ -617,6 +622,8 @@ LOCALFUNC int dfo_sndapi(void) > > + v = gbk_sndapi_none; > > + } else if (gbo_targfam == gbk_targfam_linx) { > > + v = gbk_sndapi_alsa; > > ++ } else if (gbo_targfam == gbk_targfam_obsd) { > > ++ v = gbk_sndapi_sndio; > > + } else { > > + v = gbk_sndapi_ddsp; > > + } > > Index: patches/patch-setup_SPFILDEF_i > > =================================================================== > > RCS file: patches/patch-setup_SPFILDEF_i > > diff -N patches/patch-setup_SPFILDEF_i > > --- /dev/null 1 Jan 1970 00:00:00 -0000 > > +++ patches/patch-setup_SPFILDEF_i 22 Jul 2024 03:45:27 -0000 > > @@ -0,0 +1,15 @@ > > +- add sndio > > + > > +Index: setup/SPFILDEF.i > > +--- setup/SPFILDEF.i.orig > > ++++ setup/SPFILDEF.i > > +@@ -88,6 +88,9 @@ static void DoMYOSGLUEdepends(tDoOneDepends p) > > + case gbk_sndapi_ddsp: > > + s = "SGLUDDSP.h"; > > + break; > > ++ case gbk_sndapi_sndio: > > ++ s = "SGLUSNIO.h"; > > ++ break; > > + } > > + > > + if (nullpr != s) { > > Index: patches/patch-setup_SPOTHRCF_i > > =================================================================== > > RCS file: patches/patch-setup_SPOTHRCF_i > > diff -N patches/patch-setup_SPOTHRCF_i > > --- /dev/null 1 Jan 1970 00:00:00 -0000 > > +++ patches/patch-setup_SPOTHRCF_i 22 Jul 2024 03:45:27 -0000 > > @@ -0,0 +1,15 @@ > > +- add sndio > > + > > +Index: setup/SPOTHRCF.i > > +--- setup/SPOTHRCF.i.orig > > ++++ setup/SPOTHRCF.i > > +@@ -555,6 +555,9 @@ LOCALPROC WriteAppSOUNDGLUcontents(void) > > + case gbk_sndapi_ddsp: > > + s = "DDSP"; > > + break; > > ++ case gbk_sndapi_sndio: > > ++ s = "SNIO"; > > ++ break; > > + default: > > + s = "???"; > > + break; > > Index: patches/patch-setup_WRBGCFLS_i > > =================================================================== > > RCS file: patches/patch-setup_WRBGCFLS_i > > diff -N patches/patch-setup_WRBGCFLS_i > > --- /dev/null 1 Jan 1970 00:00:00 -0000 > > +++ patches/patch-setup_WRBGCFLS_i 22 Jul 2024 03:45:27 -0000 > > @@ -0,0 +1,14 @@ > > +- add sndio > > + > > +Index: setup/WRBGCFLS.i > > +--- setup/WRBGCFLS.i.orig > > ++++ setup/WRBGCFLS.i > > +@@ -357,6 +357,8 @@ LOCALPROC WriteBashGccMakeFile(void) > > + { > > + WriteCStrToDestFil > > e( > > " -lossaudio"); > > + } > > ++ } else if (gbk_sndapi_sndio == > > gbo_sndapi) { > > ++ WriteCStrToDestFile(" - > > lsndio"); > > + } > > + #endif > > + #if 0 > > Index: patches/patch-setup_WRCNFGAP_i > > =================================================================== > > RCS file: patches/patch-setup_WRCNFGAP_i > > diff -N patches/patch-setup_WRCNFGAP_i > > --- /dev/null 1 Jan 1970 00:00:00 -0000 > > +++ patches/patch-setup_WRCNFGAP_i 22 Jul 2024 03:45:27 -0000 > > @@ -0,0 +1,15 @@ > > +- add sndio > > + > > +Index: setup/WRCNFGAP.i > > +--- setup/WRCNFGAP.i.orig > > ++++ setup/WRCNFGAP.i > > +@@ -194,6 +194,9 @@ LOCALPROC WriteCommonCNFGRAPIContents(void) > > + WriteDestFileLn("# > > in > > clude <sys/soundcard.h>"); > > + } > > + break; > > ++ case gbk_sndapi_sndio: > > ++ WriteDestFileLn("#include > > <sndio.h>"); > > ++ break; > > + default: > > + break; > > + } > > > -- he/him jagtalon.net weirder.earth/@jag