diff options
Diffstat (limited to 'plugins/dfsound/sdl.c')
| -rw-r--r-- | plugins/dfsound/sdl.c | 272 |
1 files changed, 135 insertions, 137 deletions
diff --git a/plugins/dfsound/sdl.c b/plugins/dfsound/sdl.c index f3cf92d2..5f80a1ff 100644 --- a/plugins/dfsound/sdl.c +++ b/plugins/dfsound/sdl.c @@ -1,137 +1,135 @@ -/* SDL Driver for P.E.Op.S Sound Plugin - * Copyright (c) 2010, Wei Mingzhi <whistler_wmz@users.sf.net>. - * - * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA - */ - -#include "stdafx.h" - -#include "dsoundoss.h" - -#include "externals.h" -#include <SDL.h> - -#define BUFFER_SIZE 22050 - -short *pSndBuffer = NULL; -int iBufSize = 0; -volatile int iReadPos = 0, iWritePos = 0; - -static void SOUND_FillAudio(void *unused, Uint8 *stream, int len) { - short *p = (short *)stream; - - len /= sizeof(short); - - while (iReadPos != iWritePos && len > 0) { - *p++ = pSndBuffer[iReadPos++]; - if (iReadPos >= iBufSize) iReadPos = 0; - --len; - } - - // Fill remaining space with zero - while (len > 0) { - *p++ = 0; - --len; - } -} - -static void InitSDL() { - if (SDL_WasInit(SDL_INIT_EVERYTHING)) { - SDL_InitSubSystem(SDL_INIT_AUDIO); - } else { - SDL_Init(SDL_INIT_AUDIO | SDL_INIT_NOPARACHUTE); - } -} - -static void DestroySDL() { - if (SDL_WasInit(SDL_INIT_EVERYTHING & ~SDL_INIT_AUDIO)) { - SDL_QuitSubSystem(SDL_INIT_AUDIO); - } else { - SDL_Quit(); - } -} - -void SetupSound(void) { - SDL_AudioSpec spec; - - if (pSndBuffer != NULL) return; - - InitSDL(); - - spec.freq = 44100; - spec.format = AUDIO_S16SYS; - spec.channels = iDisStereo ? 1 : 2; - spec.samples = 1024; - spec.callback = SOUND_FillAudio; - - if (SDL_OpenAudio(&spec, NULL) < 0) { - DestroySDL(); - return; - } - - iBufSize = BUFFER_SIZE; - if (iDisStereo) iBufSize /= 2; - - pSndBuffer = (short *)malloc(iBufSize * sizeof(short)); - if (pSndBuffer == NULL) { - SDL_CloseAudio(); - return; - } - - iReadPos = 0; - iWritePos = 0; - - SDL_PauseAudio(0); -} - -void RemoveSound(void) { - if (pSndBuffer == NULL) return; - - SDL_CloseAudio(); - DestroySDL(); - - free(pSndBuffer); - pSndBuffer = NULL; -} - -unsigned long SoundGetBytesBuffered(void) { - int size; - - if (pSndBuffer == NULL) return SOUNDSIZE; - - size = iReadPos - iWritePos; - if (size <= 0) size += iBufSize; - - if (size < iBufSize / 2) return SOUNDSIZE; - - return 0; -} - -void SoundFeedStreamData(unsigned char *pSound, long lBytes) { - short *p = (short *)pSound; - - if (pSndBuffer == NULL) return; - - while (lBytes > 0) { - if (((iWritePos + 1) % iBufSize) == iReadPos) break; - - pSndBuffer[iWritePos] = *p++; - - ++iWritePos; - if (iWritePos >= iBufSize) iWritePos = 0; - - lBytes -= sizeof(short); - } -} +/* SDL Driver for P.E.Op.S Sound Plugin
+ * Copyright (c) 2010, Wei Mingzhi <whistler_wmz@users.sf.net>.
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA
+ */
+
+#include "stdafx.h"
+
+#include "externals.h"
+#include <SDL.h>
+
+#define BUFFER_SIZE 22050
+
+short *pSndBuffer = NULL;
+int iBufSize = 0;
+volatile int iReadPos = 0, iWritePos = 0;
+
+static void SOUND_FillAudio(void *unused, Uint8 *stream, int len) {
+ short *p = (short *)stream;
+
+ len /= sizeof(short);
+
+ while (iReadPos != iWritePos && len > 0) {
+ *p++ = pSndBuffer[iReadPos++];
+ if (iReadPos >= iBufSize) iReadPos = 0;
+ --len;
+ }
+
+ // Fill remaining space with zero
+ while (len > 0) {
+ *p++ = 0;
+ --len;
+ }
+}
+
+static void InitSDL() {
+ if (SDL_WasInit(SDL_INIT_EVERYTHING)) {
+ SDL_InitSubSystem(SDL_INIT_AUDIO);
+ } else {
+ SDL_Init(SDL_INIT_AUDIO | SDL_INIT_NOPARACHUTE);
+ }
+}
+
+static void DestroySDL() {
+ if (SDL_WasInit(SDL_INIT_EVERYTHING & ~SDL_INIT_AUDIO)) {
+ SDL_QuitSubSystem(SDL_INIT_AUDIO);
+ } else {
+ SDL_Quit();
+ }
+}
+
+void SetupSound(void) {
+ SDL_AudioSpec spec;
+
+ if (pSndBuffer != NULL) return;
+
+ InitSDL();
+
+ spec.freq = 44100;
+ spec.format = AUDIO_S16SYS;
+ spec.channels = iDisStereo ? 1 : 2;
+ spec.samples = 1024;
+ spec.callback = SOUND_FillAudio;
+
+ if (SDL_OpenAudio(&spec, NULL) < 0) {
+ DestroySDL();
+ return;
+ }
+
+ iBufSize = BUFFER_SIZE;
+ if (iDisStereo) iBufSize /= 2;
+
+ pSndBuffer = (short *)malloc(iBufSize * sizeof(short));
+ if (pSndBuffer == NULL) {
+ SDL_CloseAudio();
+ return;
+ }
+
+ iReadPos = 0;
+ iWritePos = 0;
+
+ SDL_PauseAudio(0);
+}
+
+void RemoveSound(void) {
+ if (pSndBuffer == NULL) return;
+
+ SDL_CloseAudio();
+ DestroySDL();
+
+ free(pSndBuffer);
+ pSndBuffer = NULL;
+}
+
+unsigned long SoundGetBytesBuffered(void) {
+ int size;
+
+ if (pSndBuffer == NULL) return SOUNDSIZE;
+
+ size = iReadPos - iWritePos;
+ if (size <= 0) size += iBufSize;
+
+ if (size < iBufSize / 2) return SOUNDSIZE;
+
+ return 0;
+}
+
+void SoundFeedStreamData(unsigned char *pSound, long lBytes) {
+ short *p = (short *)pSound;
+
+ if (pSndBuffer == NULL) return;
+
+ while (lBytes > 0) {
+ if (((iWritePos + 1) % iBufSize) == iReadPos) break;
+
+ pSndBuffer[iWritePos] = *p++;
+
+ ++iWritePos;
+ if (iWritePos >= iBufSize) iWritePos = 0;
+
+ lBytes -= sizeof(short);
+ }
+}
|
