From 7ee48ce7780eef14b27586a820893c89c0d5469f Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sun, 24 Jul 2011 03:37:13 -0700 Subject: [PATCH] Removed /dev/dsp DMA audio target. --- Makefile.pandora | 2 +- Makefile.wiz | 2 +- configure.in | 1 - src/audio/SDL_audio.c | 2 - src/audio/bsd/SDL_bsdaudio.c | 2 +- src/audio/dma/SDL_dmaaudio.c | 534 ---------------------------------- src/audio/dma/SDL_dmaaudio.h | 62 ---- src/audio/paudio/SDL_paudio.c | 2 +- 8 files changed, 4 insertions(+), 603 deletions(-) delete mode 100644 src/audio/dma/SDL_dmaaudio.c delete mode 100644 src/audio/dma/SDL_dmaaudio.h diff --git a/Makefile.pandora b/Makefile.pandora index 60ac8d563..de15c846b 100644 --- a/Makefile.pandora +++ b/Makefile.pandora @@ -15,7 +15,7 @@ TARGET = libSDL.a SOURCES = ./src/*.c ./src/audio/*.c ./src/cpuinfo/*.c ./src/events/*.c \ ./src/file/*.c ./src/stdlib/*.c ./src/thread/*.c ./src/timer/*.c ./src/video/*.c \ ./src/joystick/*.c ./src/haptic/*.c ./src/power/*.c ./src/video/dummy/*.c ./src/audio/disk/*.c \ - ./src/audio/dummy/*.c ./src/loadso/dlopen/*.c ./src/audio/dsp/*.c ./src/audio/dma/*.c \ + ./src/audio/dummy/*.c ./src/loadso/dlopen/*.c ./src/audio/dsp/*.c \ ./src/thread/pthread/SDL_systhread.c ./src/thread/pthread/SDL_syssem.c \ ./src/thread/pthread/SDL_sysmutex.c ./src/thread/pthread/SDL_syscond.c \ ./src/joystick/linux/*.c ./src/haptic/linux/*.c ./src/timer/unix/*.c \ diff --git a/Makefile.wiz b/Makefile.wiz index 53aea7306..82619f076 100644 --- a/Makefile.wiz +++ b/Makefile.wiz @@ -15,7 +15,7 @@ TARGET_SHARED = libSDL13.so SOURCES = ./src/*.c ./src/audio/*.c ./src/cdrom/*.c ./src/cpuinfo/*.c ./src/events/*.c \ ./src/file/*.c ./src/stdlib/*.c ./src/thread/*.c ./src/timer/*.c ./src/video/*.c \ ./src/joystick/*.c ./src/haptic/*.c ./src/video/dummy/*.c ./src/audio/disk/*.c \ - ./src/audio/dummy/*.c ./src/loadso/dlopen/*.c ./src/audio/dsp/*.c ./src/audio/dma/*.c \ + ./src/audio/dummy/*.c ./src/loadso/dlopen/*.c ./src/audio/dsp/*.c \ ./src/thread/pthread/SDL_systhread.c ./src/thread/pthread/SDL_syssem.c \ ./src/thread/pthread/SDL_sysmutex.c ./src/thread/pthread/SDL_syscond.c \ ./src/joystick/linux/*.c ./src/haptic/linux/*.c ./src/timer/unix/*.c ./src/cdrom/dummy/*.c \ diff --git a/configure.in b/configure.in index 37a59233a..8155e01db 100644 --- a/configure.in +++ b/configure.in @@ -682,7 +682,6 @@ AC_HELP_STRING([--enable-oss], [support the OSS audio API [[default=yes]]]), if test x$have_oss = xyes; then AC_DEFINE(SDL_AUDIO_DRIVER_OSS, 1, [ ]) SOURCES="$SOURCES $srcdir/src/audio/dsp/*.c" - SOURCES="$SOURCES $srcdir/src/audio/dma/*.c" have_audio=yes # We may need to link with ossaudio emulation library diff --git a/src/audio/SDL_audio.c b/src/audio/SDL_audio.c index f83a7d271..1aaa756c2 100644 --- a/src/audio/SDL_audio.c +++ b/src/audio/SDL_audio.c @@ -45,7 +45,6 @@ static SDL_AudioDevice *open_devices[16]; */ extern AudioBootStrap BSD_AUDIO_bootstrap; extern AudioBootStrap DSP_bootstrap; -extern AudioBootStrap DMA_bootstrap; extern AudioBootStrap ALSA_bootstrap; extern AudioBootStrap PULSEAUDIO_bootstrap; extern AudioBootStrap QSAAUDIO_bootstrap; @@ -82,7 +81,6 @@ static const AudioBootStrap *const bootstrap[] = { #endif #if SDL_AUDIO_DRIVER_OSS &DSP_bootstrap, - &DMA_bootstrap, #endif #if SDL_AUDIO_DRIVER_QSA &QSAAUDIO_bootstrap, diff --git a/src/audio/bsd/SDL_bsdaudio.c b/src/audio/bsd/SDL_bsdaudio.c index 33590c71a..5f39935ea 100644 --- a/src/audio/bsd/SDL_bsdaudio.c +++ b/src/audio/bsd/SDL_bsdaudio.c @@ -67,7 +67,7 @@ #define OPEN_FLAGS_INPUT (O_RDONLY|O_NONBLOCK) #endif -/* !!! FIXME: so much cut and paste with dsp/dma drivers... */ +/* !!! FIXME: so much cut and paste with dsp target... */ static char **outputDevices = NULL; static int outputDeviceCount = 0; static char **inputDevices = NULL; diff --git a/src/audio/dma/SDL_dmaaudio.c b/src/audio/dma/SDL_dmaaudio.c deleted file mode 100644 index 36667b396..000000000 --- a/src/audio/dma/SDL_dmaaudio.c +++ /dev/null @@ -1,534 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2011 Sam Lantinga - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "SDL_config.h" - -/* !!! FIXME: merge this driver with "dsp". */ - -/* Allow access to a raw mixing buffer */ - -#include -#include /* For strerror() */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H -/* This is installed on some systems */ -#include -#else -/* This is recommended by OSS */ -#include -#endif - -#ifndef MAP_FAILED -#define MAP_FAILED ((Uint8 *)-1) -#endif - -#include "SDL_timer.h" -#include "SDL_audio.h" -#include "../SDL_audio_c.h" -#include "../SDL_audiodev_c.h" -#include "SDL_dmaaudio.h" - -/* The tag name used by DMA audio */ -#define DMA_DRIVER_NAME "dma" - -/* Open the audio device for playback, and don't block if busy */ -#define OPEN_FLAGS_INPUT (O_RDWR|O_NONBLOCK) -#define OPEN_FLAGS_OUTPUT (O_RDWR|O_NONBLOCK) - -static char **outputDevices = NULL; -static int outputDeviceCount = 0; -static char **inputDevices = NULL; -static int inputDeviceCount = 0; - -static int -test_for_mmap(int fd) -{ - int caps = 0; - struct audio_buf_info info; - if ((ioctl(fd, SNDCTL_DSP_GETCAPS, &caps) == 0) && - (caps & DSP_CAP_TRIGGER) && (caps & DSP_CAP_MMAP) && - (ioctl(fd, SNDCTL_DSP_GETOSPACE, &info) == 0)) { - size_t len = info.fragstotal * info.fragsize; - Uint8 *buf = (Uint8 *) mmap(NULL, len, PROT_WRITE, MAP_SHARED, fd, 0); - if (buf != MAP_FAILED) { - munmap(buf, len); - return 1; - } - } - return 0; -} - - -static inline void -free_device_list(char ***devs, int *count) -{ - SDL_FreeUnixAudioDevices(devs, count); -} - -static inline void -build_device_list(int iscapture, char ***devs, int *count) -{ - const int flags = ((iscapture) ? OPEN_FLAGS_INPUT : OPEN_FLAGS_OUTPUT); - free_device_list(devs, count); - SDL_EnumUnixAudioDevices(flags, 0, test_for_mmap, devs, count); -} - -static inline void -build_device_lists(void) -{ - build_device_list(0, &outputDevices, &outputDeviceCount); - build_device_list(1, &inputDevices, &inputDeviceCount); -} - - -static inline void -free_device_lists(void) -{ - free_device_list(&outputDevices, &outputDeviceCount); - free_device_list(&inputDevices, &inputDeviceCount); -} - - -static void -DMA_Deinitialize(void) -{ - free_device_lists(); -} - -static int -DMA_DetectDevices(int iscapture) -{ - if (iscapture) { - build_device_list(1, &inputDevices, &inputDeviceCount); - return inputDeviceCount; - } else { - build_device_list(0, &outputDevices, &outputDeviceCount); - return outputDeviceCount; - } - - return 0; /* shouldn't ever hit this. */ -} - - -static const char * -DMA_GetDeviceName(int index, int iscapture) -{ - if ((iscapture) && (index < inputDeviceCount)) { - return inputDevices[index]; - } else if ((!iscapture) && (index < outputDeviceCount)) { - return outputDevices[index]; - } - - SDL_SetError("No such device"); - return NULL; -} - - -static int -DMA_ReopenAudio(_THIS, const char *audiodev, int format, int stereo) -{ - int frag_spec; - int value; - - /* Close and then reopen the audio device */ - close(audio_fd); - audio_fd = open(audiodev, O_RDWR, 0); - if (audio_fd < 0) { - SDL_SetError("Couldn't open %s: %s", audiodev, strerror(errno)); - return (-1); - } - - /* Calculate the final parameters for this audio specification */ - SDL_CalculateAudioSpec(&this->spec); - - /* Determine the power of two of the fragment size */ - for (frag_spec = 0; (0x01 << frag_spec) < this->spec.size; ++frag_spec); - if ((0x01 << frag_spec) != this->spec.size) { - SDL_SetError("Fragment size must be a power of two"); - return (-1); - } - - /* Set the audio buffering parameters */ - if (ioctl(audio_fd, SNDCTL_DSP_SETFRAGMENT, &frag_spec) < 0) { - SDL_SetError("Couldn't set audio fragment spec"); - return (-1); - } - - /* Set the audio format */ - value = format; - if ((ioctl(audio_fd, SNDCTL_DSP_SETFMT, &value) < 0) || (value != format)) { - SDL_SetError("Couldn't set audio format"); - return (-1); - } - - /* Set mono or stereo audio */ - value = (this->spec.channels > 1); - if ((ioctl(audio_fd, SNDCTL_DSP_STEREO, &stereo) < 0) || - (value != stereo)) { - SDL_SetError("Couldn't set audio channels"); - return (-1); - } - - /* Set the DSP frequency */ - value = this->spec.freq; - if (ioctl(audio_fd, SNDCTL_DSP_SPEED, &value) < 0) { - SDL_SetError("Couldn't set audio frequency"); - return (-1); - } - this->spec.freq = value; - - /* We successfully re-opened the audio */ - return (0); -} - - -static void -DMA_CloseDevice(_THIS) -{ - if (this->hidden != NULL) { - if (dma_buf != NULL) { - munmap(dma_buf, dma_len); - dma_buf = NULL; - } - if (audio_fd >= 0) { - close(audio_fd); - audio_fd = -1; - } - SDL_free(this->hidden); - this->hidden = NULL; - } -} - - -static int -DMA_OpenDevice(_THIS, const char *devname, int iscapture) -{ - const int flags = ((iscapture) ? OPEN_FLAGS_INPUT : OPEN_FLAGS_OUTPUT); - int format; - int stereo; - int value; - SDL_AudioFormat test_format; - struct audio_buf_info info; - - /* We don't care what the devname is...we'll try to open anything. */ - /* ...but default to first name in the list... */ - if (devname == NULL) { - if (((iscapture) && (inputDeviceCount == 0)) || - ((!iscapture) && (outputDeviceCount == 0))) { - SDL_SetError("No such audio device"); - return 0; - } - devname = ((iscapture) ? inputDevices[0] : outputDevices[0]); - } - - /* Initialize all variables that we clean on shutdown */ - this->hidden = (struct SDL_PrivateAudioData *) - SDL_malloc((sizeof *this->hidden)); - if (this->hidden == NULL) { - SDL_OutOfMemory(); - return 0; - } - SDL_memset(this->hidden, 0, (sizeof *this->hidden)); - - /* Open the audio device */ - audio_fd = open(devname, flags, 0); - if (audio_fd < 0) { - DMA_CloseDevice(this); - SDL_SetError("Couldn't open %s: %s", devname, strerror(errno)); - return 0; - } - dma_buf = NULL; - ioctl(audio_fd, SNDCTL_DSP_RESET, 0); - - /* Get a list of supported hardware formats */ - if (ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &value) < 0) { - DMA_CloseDevice(this); - SDL_SetError("Couldn't get audio format list"); - return 0; - } - - /* Try for a closest match on audio format */ - format = 0; - for (test_format = SDL_FirstAudioFormat(this->spec.format); - !format && test_format;) { -#ifdef DEBUG_AUDIO - fprintf(stderr, "Trying format 0x%4.4x\n", test_format); -#endif - switch (test_format) { - case AUDIO_U8: - if (value & AFMT_U8) { - format = AFMT_U8; - } - break; - case AUDIO_S8: - if (value & AFMT_S8) { - format = AFMT_S8; - } - break; - case AUDIO_S16LSB: - if (value & AFMT_S16_LE) { - format = AFMT_S16_LE; - } - break; - case AUDIO_S16MSB: - if (value & AFMT_S16_BE) { - format = AFMT_S16_BE; - } - break; - case AUDIO_U16LSB: - if (value & AFMT_U16_LE) { - format = AFMT_U16_LE; - } - break; - case AUDIO_U16MSB: - if (value & AFMT_U16_BE) { - format = AFMT_U16_BE; - } - break; - default: - format = 0; - break; - } - if (!format) { - test_format = SDL_NextAudioFormat(); - } - } - if (format == 0) { - DMA_CloseDevice(this); - SDL_SetError("Couldn't find any hardware audio formats"); - return 0; - } - this->spec.format = test_format; - - /* Set the audio format */ - value = format; - if ((ioctl(audio_fd, SNDCTL_DSP_SETFMT, &value) < 0) || (value != format)) { - DMA_CloseDevice(this); - SDL_SetError("Couldn't set audio format"); - return 0; - } - - /* Set mono or stereo audio (currently only two channels supported) */ - stereo = (this->spec.channels > 1); - ioctl(audio_fd, SNDCTL_DSP_STEREO, &stereo); - if (stereo) { - this->spec.channels = 2; - } else { - this->spec.channels = 1; - } - - /* Because some drivers don't allow setting the buffer size - after setting the format, we must re-open the audio device - once we know what format and channels are supported - */ - if (DMA_ReopenAudio(this, devname, format, stereo) < 0) { - DMA_CloseDevice(this); - /* Error is set by DMA_ReopenAudio() */ - return 0; - } - - /* Memory map the audio buffer */ - if (ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &info) < 0) { - DMA_CloseDevice(this); - SDL_SetError("Couldn't get OSPACE parameters"); - return 0; - } - this->spec.size = info.fragsize; - this->spec.samples = this->spec.size / ((this->spec.format & 0xFF) / 8); - this->spec.samples /= this->spec.channels; - num_buffers = info.fragstotal; - dma_len = num_buffers * this->spec.size; - dma_buf = (Uint8 *) mmap(NULL, dma_len, PROT_WRITE, MAP_SHARED, - audio_fd, 0); - if (dma_buf == MAP_FAILED) { - DMA_CloseDevice(this); - SDL_SetError("DMA memory map failed"); - dma_buf = NULL; - return 0; - } - SDL_memset(dma_buf, this->spec.silence, dma_len); - - /* Check to see if we need to use select() workaround */ - { - char *workaround; - workaround = SDL_getenv("SDL_DSP_NOSELECT"); - if (workaround) { - frame_ticks = - (float) (this->spec.samples * 1000) / this->spec.freq; - next_frame = SDL_GetTicks() + frame_ticks; - } - } - - /* Trigger audio playback */ - value = 0; - ioctl(audio_fd, SNDCTL_DSP_SETTRIGGER, &value); - value = PCM_ENABLE_OUTPUT; - if (ioctl(audio_fd, SNDCTL_DSP_SETTRIGGER, &value) < 0) { - DMA_CloseDevice(this); - SDL_SetError("Couldn't trigger audio output"); - return 0; - } - - /* Get the parent process id (we're the parent of the audio thread) */ - parent = getpid(); - - /* We're ready to rock and roll. :-) */ - return 1; -} - - -/* This function waits until it is possible to write a full sound buffer */ -static void -DMA_WaitDevice(_THIS) -{ - fd_set fdset; - - /* Check to see if the thread-parent process is still alive */ - { - static int cnt = 0; - /* Note that this only works with thread implementations - that use a different process id for each thread. - */ - if (parent && (((++cnt) % 10) == 0)) { /* Check every 10 loops */ - if (kill(parent, 0) < 0 && errno == ESRCH) { - this->enabled = 0; - } - } - } - - /* See if we need to use timed audio synchronization */ - if (frame_ticks) { - /* Use timer for general audio synchronization */ - Sint32 ticks; - - ticks = ((Sint32) (next_frame - SDL_GetTicks())) - FUDGE_TICKS; - if (ticks > 0) { - SDL_Delay(ticks); - } - } else { - /* Use select() for audio synchronization */ - struct timeval timeout; - FD_ZERO(&fdset); - FD_SET(audio_fd, &fdset); - timeout.tv_sec = 10; - timeout.tv_usec = 0; -#ifdef DEBUG_AUDIO - fprintf(stderr, "Waiting for audio to get ready\n"); -#endif - if (select(audio_fd + 1, NULL, &fdset, NULL, &timeout) <= 0) { - const char *message = -#ifdef AUDIO_OSPACE_HACK - "Audio timeout - buggy audio driver? (trying ospace)"; -#else - "Audio timeout - buggy audio driver? (disabled)"; -#endif - /* In general we should never print to the screen, - but in this case we have no other way of letting - the user know what happened. - */ - fprintf(stderr, "SDL: %s\n", message); -#ifdef AUDIO_OSPACE_HACK - /* We may be able to use GET_OSPACE trick */ - frame_ticks = (float) (this->spec.samples * 1000) / - this->spec.freq; - next_frame = SDL_GetTicks() + frame_ticks; -#else - this->enabled = 0; - /* Don't try to close - may hang */ - audio_fd = -1; -#ifdef DEBUG_AUDIO - fprintf(stderr, "Done disabling audio\n"); -#endif -#endif /* AUDIO_OSPACE_HACK */ - } -#ifdef DEBUG_AUDIO - fprintf(stderr, "Ready!\n"); -#endif - } -} - -static void -DMA_PlayDevice(_THIS) -{ - /* If timer synchronization is enabled, set the next write frame */ - if (frame_ticks) { - next_frame += frame_ticks; - } - return; -} - -static Uint8 * -DMA_GetDeviceBuf(_THIS) -{ - count_info info; - int playing; - int filling; - - /* Get number of blocks, looping if we're not using select() */ - do { - if (ioctl(audio_fd, SNDCTL_DSP_GETOPTR, &info) < 0) { - /* Uh oh... */ - this->enabled = 0; - return (NULL); - } - } while (frame_ticks && (info.blocks < 1)); -#ifdef DEBUG_AUDIO - if (info.blocks > 1) { - printf("Warning: audio underflow (%d frags)\n", info.blocks - 1); - } -#endif - playing = info.ptr / this->spec.size; - filling = (playing + 1) % num_buffers; - return (dma_buf + (filling * this->spec.size)); -} - - -static int -DMA_Init(SDL_AudioDriverImpl * impl) -{ - /* Set the function pointers */ - impl->DetectDevices = DMA_DetectDevices; - impl->GetDeviceName = DMA_GetDeviceName; - impl->OpenDevice = DMA_OpenDevice; - impl->WaitDevice = DMA_WaitDevice; - impl->PlayDevice = DMA_PlayDevice; - impl->GetDeviceBuf = DMA_GetDeviceBuf; - impl->CloseDevice = DMA_CloseDevice; - impl->Deinitialize = DMA_Deinitialize; - - build_device_lists(); - - return 1; /* this audio target is available. */ -} - -AudioBootStrap DMA_bootstrap = { - DMA_DRIVER_NAME, "OSS /dev/dsp DMA audio", DMA_Init, 0 -}; - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/audio/dma/SDL_dmaaudio.h b/src/audio/dma/SDL_dmaaudio.h deleted file mode 100644 index 6485d8cda..000000000 --- a/src/audio/dma/SDL_dmaaudio.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2011 Sam Lantinga - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "SDL_config.h" - -#ifndef _SDL_dmaaudio_h -#define _SDL_dmaaudio_h - -#include "../SDL_sysaudio.h" - -/* Hidden "this" pointer for the audio functions */ -#define _THIS SDL_AudioDevice *this - -struct SDL_PrivateAudioData -{ - /* The file descriptor for the audio device */ - int audio_fd; - - /* The parent process id, to detect when application quits */ - pid_t parent; - - /* Raw mixing buffer */ - Uint8 *dma_buf; - int dma_len; - int num_buffers; - - /* Support for audio timing using a timer, in addition to select() */ - float frame_ticks; - float next_frame; -}; -#define FUDGE_TICKS 10 /* The scheduler overhead ticks per frame */ - -/* Old variable names */ -/* !!! FIXME: remove these. */ -#define audio_fd (this->hidden->audio_fd) -#define parent (this->hidden->parent) -#define dma_buf (this->hidden->dma_buf) -#define dma_len (this->hidden->dma_len) -#define num_buffers (this->hidden->num_buffers) -#define frame_ticks (this->hidden->frame_ticks) -#define next_frame (this->hidden->next_frame) - -#endif /* _SDL_dmaaudio_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/audio/paudio/SDL_paudio.c b/src/audio/paudio/SDL_paudio.c index 6137ddd15..b53fcbf74 100644 --- a/src/audio/paudio/SDL_paudio.c +++ b/src/audio/paudio/SDL_paudio.c @@ -429,7 +429,7 @@ PAUDIO_OpenDevice(_THIS, const char *devname, int iscapture) /* * The AIX paud device init can't modify the values of the audio_init * structure that we pass to it. So we don't need any recalculation - * of this stuff and no reinit call as in linux dsp and dma code. + * of this stuff and no reinit call as in linux dsp code. * * /dev/paud supports all of the encoding formats, so we don't need * to do anything like reopening the device, either.