Mercurial > sdl-ios-xcode
changeset 68:ac6645260d31
Added an audio driver that writes to disk (thanks Ryan!)
author | Sam Lantinga <slouken@lokigames.com> |
---|---|
date | Sat, 16 Jun 2001 01:51:42 +0000 |
parents | 3647c809813d |
children | 280ff3af2ecc |
files | configure.in docs.html src/audio/Makefile.am src/audio/SDL_audio.c src/audio/SDL_sysaudio.h src/audio/disk/.cvsignore src/audio/disk/Makefile.am src/audio/disk/SDL_diskaudio.c src/audio/disk/SDL_diskaudio.h |
diffstat | 9 files changed, 321 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/configure.in Sat Jun 16 01:32:09 2001 +0000 +++ b/configure.in Sat Jun 16 01:51:42 2001 +0000 @@ -368,6 +368,21 @@ fi } + +dnl rcg07142001 See if the user wants the disk writer audio driver... +CheckDiskAudio() +{ + AC_ARG_ENABLE(diskaudio, +[ --enable-diskaudio support the disk writer audio driver [default=no]], + , enable_diskaudio=no) + if test x$enable_audio = xyes -a x$enable_diskaudio = xyes; then + CFLAGS="$CFLAGS -DDISKAUD_SUPPORT" + AUDIO_SUBDIRS="$AUDIO_SUBDIRS disk" + AUDIO_DRIVERS="$AUDIO_DRIVERS disk/libaudio_disk.la" + fi +} + + dnl See if we can use x86 assembly blitters CheckNASM() { @@ -1085,6 +1100,7 @@ *-*-linux*) ARCH=linux CheckDummyVideo + CheckDiskAudio CheckNASM CheckOSS CheckALSA @@ -1151,6 +1167,7 @@ *-*-bsdi*) ARCH=bsdi CheckDummyVideo + CheckDiskAudio CheckNASM CheckOSS CheckARTSC @@ -1194,6 +1211,7 @@ *-*-freebsd*) ARCH=freebsd CheckDummyVideo + CheckDiskAudio CheckNASM CheckOSS CheckARTSC @@ -1246,6 +1264,7 @@ *-*-netbsd*) ARCH=netbsd CheckDummyVideo + CheckDiskAudio CheckNASM CheckOSS CheckARTSC @@ -1297,6 +1316,7 @@ *-*-openbsd*) ARCH=openbsd CheckDummyVideo + CheckDiskAudio CheckNASM CheckOSS CheckARTSC @@ -1345,6 +1365,7 @@ *-*-sysv5*) ARCH=sysv5 CheckDummyVideo + CheckDiskAudio CheckNASM CheckOSS CheckARTSC @@ -1392,6 +1413,7 @@ ARCH=solaris CFLAGS="$CFLAGS -D__ELF__" # Fix for nasm on Solaris x86 CheckDummyVideo + CheckDiskAudio CheckNASM CheckOSS CheckARTSC @@ -1438,6 +1460,7 @@ *-*-irix*) ARCH=irix CheckDummyVideo + CheckDiskAudio CheckNAS CheckX11 CheckAAlib @@ -1496,6 +1519,7 @@ *-*-hpux*) ARCH=hpux CheckDummyVideo + CheckDiskAudio CheckOSS CheckNAS CheckX11 @@ -1540,6 +1564,7 @@ *-*-aix*) ARCH=aix CheckDummyVideo + CheckDiskAudio CheckOSS CheckNAS CheckX11 @@ -1583,6 +1608,7 @@ *-*-osf*) ARCH=osf CheckDummyVideo + CheckDiskAudio CheckNAS CheckX11 CheckGGI @@ -1626,6 +1652,7 @@ *-*-qnx*) ARCH=qnx CheckDummyVideo + CheckDiskAudio CheckNAS CheckPHOTON CheckX11 @@ -1680,6 +1707,7 @@ fi fi CheckDummyVideo + CheckDiskAudio CheckWIN32 CheckDIRECTX CheckNASM @@ -1736,6 +1764,7 @@ ARCH=beos ac_default_prefix=/boot/develop/tools/gnupro CheckDummyVideo + CheckDiskAudio CheckNASM CheckBWINDOW CheckBeGL @@ -1781,6 +1810,7 @@ # for which this case would be handy. ARCH=macos CheckDummyVideo + CheckDiskAudio CheckTOOLBOX CheckMacGL # Set up files for the main() stub @@ -1824,6 +1854,7 @@ # config.guess comes back with "darwin", so go with the flow. ARCH=macos CheckDummyVideo + CheckDiskAudio CheckCARBON CheckMacGL CheckPTHREAD @@ -1973,6 +2004,7 @@ src/audio/ums/Makefile src/audio/windib/Makefile src/audio/windx5/Makefile +src/audio/disk/Makefile src/video/Makefile src/video/cybergfx/Makefile src/video/x11/Makefile
--- a/docs.html Sat Jun 16 01:32:09 2001 +0000 +++ b/docs.html Sat Jun 16 01:51:42 2001 +0000 @@ -16,6 +16,7 @@ Major changes since SDL 1.0.0: </H2> <UL> + <LI> 1.2.1: Added an audio driver that writes to disk (thanks Ryan!) <LI> 1.2.1: Mouse wheel sends mouse button (4/5) events on Windows <LI> 1.2.1: Added MacOS X Project Builder projects (thanks Darrell!) <LI> 1.2.1: Added initial support for Quartz video (thanks Darrell!)
--- a/src/audio/Makefile.am Sat Jun 16 01:32:09 2001 +0000 +++ b/src/audio/Makefile.am Sat Jun 16 01:51:42 2001 +0000 @@ -5,8 +5,7 @@ # Define which subdirectories need to be built SUBDIRS = @AUDIO_SUBDIRS@ -DIST_SUBDIRS = alsa arts baudio dma dmedia dsp esd macrom nas nto \ - openbsd paudio sun ums windib windx5 +DIST_SUBDIRS = alsa arts baudio dma dmedia dsp esd macrom nas nto openbsd paudio sun ums windib windx5 disk DRIVERS = @AUDIO_DRIVERS@
--- a/src/audio/SDL_audio.c Sat Jun 16 01:32:09 2001 +0000 +++ b/src/audio/SDL_audio.c Sat Jun 16 01:51:42 2001 +0000 @@ -81,7 +81,9 @@ #ifdef ENABLE_AHI &AHI_bootstrap, #endif - +#ifdef DISKAUD_SUPPORT + &DISKAUD_bootstrap, +#endif NULL }; SDL_AudioDevice *current_audio = NULL;
--- a/src/audio/SDL_sysaudio.h Sat Jun 16 01:32:09 2001 +0000 +++ b/src/audio/SDL_sysaudio.h Sat Jun 16 01:51:42 2001 +0000 @@ -140,6 +140,9 @@ #ifdef ENABLE_AHI extern AudioBootStrap AHI_bootstrap; #endif +#ifdef DISKAUD_SUPPORT +extern AudioBootStrap DISKAUD_bootstrap; +#endif /* This is the current audio device */ extern SDL_AudioDevice *current_audio;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/audio/disk/.cvsignore Sat Jun 16 01:51:42 2001 +0000 @@ -0,0 +1,6 @@ +Makefile.in +Makefile +.libs +*.o +*.lo +*.la
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/audio/disk/Makefile.am Sat Jun 16 01:51:42 2001 +0000 @@ -0,0 +1,9 @@ + +## Makefile.am for SDL audio "driver" that writes to a file. + +noinst_LTLIBRARIES = libaudio_disk.la +libaudio_disk_la_SOURCES = $(SRCS) + +# The SDL audio driver sources +SRCS = SDL_diskaudio.c \ + SDL_diskaudio.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/audio/disk/SDL_diskaudio.c Sat Jun 16 01:51:42 2001 +0000 @@ -0,0 +1,222 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@devolution.com + + This file hacked^H^H^H^H^H^Hwritten by Ryan C. Gordon + (icculus@linuxgames.com) +*/ + +#ifdef SAVE_RCSID +static char rcsid = + "@(#) $Id$"; +#endif + +/* Output raw audio data to a file. */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <unistd.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + + +#include "SDL_audio.h" +#include "SDL_error.h" +#include "SDL_audiomem.h" +#include "SDL_audio_c.h" +#include "SDL_timer.h" +#include "SDL_audiodev_c.h" +#include "SDL_diskaudio.h" + +/* The tag name used by DISK audio */ +#define DISKAUD_DRIVER_NAME "disk" + +/* environment variables and defaults. */ +#define DISKENVR_OUTFILE "SDL_DISKAUDIOFILE" +#define DISKDEFAULT_OUTFILE "sdlaudio.raw" +#define DISKENVR_WRITEDELAY "SDL_DISKAUDIODELAY" +#define DISKDEFAULT_WRITEDELAY 150 + +/* Audio driver functions */ +static int DISKAUD_OpenAudio(_THIS, SDL_AudioSpec *spec); +static void DISKAUD_WaitAudio(_THIS); +static void DISKAUD_PlayAudio(_THIS); +static Uint8 *DISKAUD_GetAudioBuf(_THIS); +static void DISKAUD_CloseAudio(_THIS); + +static const char *DISKAUD_GetOutputFilename(void) +{ + const char *envr = getenv(DISKENVR_OUTFILE); + return((envr != NULL) ? envr : DISKDEFAULT_OUTFILE); +} + +/* Audio driver bootstrap functions */ +static int DISKAUD_Available(void) +{ +#if 0 + int fd; + int available; + int exists = 0; + struct stat statbuf; + const char *fname = DISKAUD_GetOutputFilename(); + + available = 0; + + if (stat(fname, &statbuf) == 0) + exists = 1; + + fd = open(fname, O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR); + if ( fd != -1 ) { + available = 1; + close(fd); + if (!exists) { + unlink(fname); + } + } + return(available); +#else + return(1); +#endif +} + +static void DISKAUD_DeleteDevice(SDL_AudioDevice *device) +{ + free(device->hidden); + free(device); +} + +static SDL_AudioDevice *DISKAUD_CreateDevice(int devindex) +{ + SDL_AudioDevice *this; + const char *envr; + + /* Initialize all variables that we clean on shutdown */ + this = (SDL_AudioDevice *)malloc(sizeof(SDL_AudioDevice)); + if ( this ) { + memset(this, 0, (sizeof *this)); + this->hidden = (struct SDL_PrivateAudioData *) + malloc((sizeof *this->hidden)); + } + if ( (this == NULL) || (this->hidden == NULL) ) { + SDL_OutOfMemory(); + if ( this ) { + free(this); + } + return(0); + } + memset(this->hidden, 0, (sizeof *this->hidden)); + + envr = getenv(DISKENVR_WRITEDELAY); + this->hidden->write_delay = (envr) ? atoi(envr) : DISKDEFAULT_WRITEDELAY; + + /* Set the function pointers */ + this->OpenAudio = DISKAUD_OpenAudio; + this->WaitAudio = DISKAUD_WaitAudio; + this->PlayAudio = DISKAUD_PlayAudio; + this->GetAudioBuf = DISKAUD_GetAudioBuf; + this->CloseAudio = DISKAUD_CloseAudio; + + this->free = DISKAUD_DeleteDevice; + + return this; +} + +AudioBootStrap DISKAUD_bootstrap = { + DISKAUD_DRIVER_NAME, "direct-to-disk audio", + DISKAUD_Available, DISKAUD_CreateDevice +}; + +/* This function waits until it is possible to write a full sound buffer */ +static void DISKAUD_WaitAudio(_THIS) +{ + SDL_Delay(this->hidden->write_delay); +} + +static void DISKAUD_PlayAudio(_THIS) +{ + int written; + + /* Write the audio data, checking for EAGAIN on broken audio drivers */ + do { + written = write(this->hidden->audio_fd, + this->hidden->mixbuf, + this->hidden->mixlen); + if ( (written < 0) && ((errno == 0) || (errno == EAGAIN)) ) { + SDL_Delay(1); /* Let a little CPU time go by */ + } + } while ( (written < 0) && + ((errno == 0) || (errno == EAGAIN) || (errno == EINTR)) ); + + /* If we couldn't write, assume fatal error for now */ + if ( written < 0 ) { + this->enabled = 0; + } +#ifdef DEBUG_AUDIO + fprintf(stderr, "Wrote %d bytes of audio data\n", written); +#endif +} + +static Uint8 *DISKAUD_GetAudioBuf(_THIS) +{ + return(this->hidden->mixbuf); +} + +static void DISKAUD_CloseAudio(_THIS) +{ + if ( this->hidden->mixbuf != NULL ) { + SDL_FreeAudioMem(this->hidden->mixbuf); + this->hidden->mixbuf = NULL; + } + if ( this->hidden->audio_fd >= 0 ) { + close(this->hidden->audio_fd); + this->hidden->audio_fd = -1; + } +} + +static int DISKAUD_OpenAudio(_THIS, SDL_AudioSpec *spec) +{ + const char *fname = DISKAUD_GetOutputFilename(); + + /* Open the audio device */ + this->hidden->audio_fd = open(fname, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR); + if ( this->hidden->audio_fd < 0 ) { + SDL_SetError("Couldn't open %s: %s", fname, strerror(errno)); + return(-1); + } + + fprintf(stderr, "WARNING: You are using the SDL disk writer" + " audio driver!\n Writing to file [%s].\n", fname); + + /* Allocate mixing buffer */ + this->hidden->mixlen = spec->size; + this->hidden->mixbuf = (Uint8 *) SDL_AllocAudioMem(this->hidden->mixlen); + if ( this->hidden->mixbuf == NULL ) { + return(-1); + } + memset(this->hidden->mixbuf, spec->silence, spec->size); + + /* We're ready to rock and roll. :-) */ + return(0); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/audio/disk/SDL_diskaudio.h Sat Jun 16 01:51:42 2001 +0000 @@ -0,0 +1,44 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@devolution.com +*/ + +#ifdef SAVE_RCSID +static char rcsid = + "@(#) $Id$"; +#endif + +#ifndef _SDL_diskaudio_h +#define _SDL_diskaudio_h + +#include "SDL_sysaudio.h" + +/* Hidden "this" pointer for the video functions */ +#define _THIS SDL_AudioDevice *this + +struct SDL_PrivateAudioData { + /* The file descriptor for the audio device */ + int audio_fd; + Uint8 *mixbuf; + Uint32 mixlen; + Uint32 write_delay; +}; + +#endif /* _SDL_diskaudio_h */