diff --git a/Makefile b/Makefile index 670ad4415f..5d4bd045d1 100644 --- a/Makefile +++ b/Makefile @@ -16,6 +16,10 @@ ifeq ($(BUILD_ALSA), 1) OBJ += alsa.o LIBS += -lasound endif +ifeq ($(BUILD_ROAR), 1) + OBJ += roar.o + LIBS += -lroar +endif ifeq ($(BUILD_OPENGL), 1) OBJ += gl.o @@ -25,7 +29,7 @@ ifeq ($(BUILD_FILTER), 1) OBJ += hqflt/hq.o endif -CFLAGS = -Wall -O3 -march=native -std=c99 +CFLAGS = -Wall -O3 -march=native -std=gnu99 diff --git a/config.h b/config.h index 1ae612f814..24602c5106 100644 --- a/config.h +++ b/config.h @@ -35,6 +35,7 @@ #define AUDIO_RSOUND 1 #define AUDIO_OSS 2 #define AUDIO_ALSA 3 +#define AUDIO_ROAR 4 //////////////////////// // Chooses which video and audio subsystem to use. Remember to update config.mk if you change these. diff --git a/config.mk b/config.mk index 04fb973188..fbce73ec6a 100644 --- a/config.mk +++ b/config.mk @@ -5,6 +5,7 @@ BUILD_FILTER = 0 BUILD_RSOUND = 0 BUILD_OSS = 0 BUILD_ALSA = 1 +BUILD_ROAR = 0 PREFIX = /usr/local diff --git a/roar.c b/roar.c new file mode 100644 index 0000000000..3e93ad6a81 --- /dev/null +++ b/roar.c @@ -0,0 +1,92 @@ +/* SSNES - A Super Ninteno Entertainment System (SNES) Emulator frontend for libsnes. + * Copyright (C) 2010 - Hans-Kristian Arntzen + * + * Some code herein may be based on code found in BSNES. + * + * SSNES 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 Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * SSNES 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 SSNES. + * If not, see . + */ + + +#include "driver.h" +#include +#include +#include +#include + +static void* __roar_init(const char* device, int rate, int latency) +{ + int err; + roar_vs_t *vss; + if ( (vss = roar_vs_new_simple(NULL, NULL, rate, 2, ROAR_CODEC_PCM_S_LE, 16, ROAR_DIR_PLAY, &err)) == NULL ) + { + fprintf(stderr, "roar_vs: \"%s\"\n", roar_vs_strerr(err)); + return NULL; + } + + return vss; +} + +static ssize_t __roar_write(void* data, const void* buf, size_t size) +{ + roar_vs_t *vss = data; + + if ( size == 0 ) + return 0; + + int err; + if (roar_vs_write(vss, buf, size, &err) < 0) + { + if (err == ROAR_ERROR_NONE) + return 0; + return -1; + } + + return size; +} + +static bool __roar_stop(void *data) +{ + return true; +} + +static void __roar_set_nonblock_state(void *data, bool state) +{ + roar_vs_t *vss = data; + if (roar_vs_blocking(vss, (state) ? ROAR_VS_FALSE : ROAR_VS_TRUE, NULL) < 0) + fprintf(stderr, "SSNES [ERROR]: Can't set nonblocking. Will not be able to fast-forward.\n"); +} + +static bool __roar_start(void *data) +{ + return true; +} + +static void __roar_free(void *data) +{ + roar_vs_t *vss = data; + roar_vs_close(vss, ROAR_VS_TRUE, NULL); +} + +const audio_driver_t audio_roar = { + .init = __roar_init, + .write = __roar_write, + .stop = __roar_stop, + .start = __roar_start, + .set_nonblock_state = __roar_set_nonblock_state, + .free = __roar_free +}; + + + + + + diff --git a/ssnes.c b/ssnes.c index cf9a52618e..eb85c41e13 100644 --- a/ssnes.c +++ b/ssnes.c @@ -36,6 +36,7 @@ static SRC_STATE* source = NULL; extern const audio_driver_t audio_rsound; extern const audio_driver_t audio_oss; extern const audio_driver_t audio_alsa; +extern const audio_driver_t audio_roar; extern const video_driver_t video_gl; //////////////////////////////////////////////// @@ -52,6 +53,8 @@ static driver_t driver = { .audio = &audio_oss, #elif AUDIO_DRIVER == AUDIO_ALSA .audio = &audio_alsa, +#elif AUDIO_DRIVER == AUDIO_ROAR + .audio = &audio_roar, #else #error "Define a valid audio driver in config.h" #endif