summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Howard2009-10-17 22:36:15 +0000
committerSimon Howard2009-10-17 22:36:15 +0000
commite30325c40f6ea482862745db0f4555e513f2952e (patch)
tree74bf8304a8b9d5edb2f303d1673a03785e6e7bfc
parent58f71d21b021bddcb24ac2b2b9736bf821221bd1 (diff)
downloadchocolate-doom-e30325c40f6ea482862745db0f4555e513f2952e.tar.gz
chocolate-doom-e30325c40f6ea482862745db0f4555e513f2952e.tar.bz2
chocolate-doom-e30325c40f6ea482862745db0f4555e513f2952e.zip
Add OPL library API function to set software emulation sample rate, and
set from snd_samplerate in the configuration file. Subversion-branch: /branches/opl-branch Subversion-revision: 1723
-rw-r--r--opl/opl.c9
-rw-r--r--opl/opl.h4
-rw-r--r--opl/opl_internal.h4
-rw-r--r--opl/opl_sdl.c19
-rw-r--r--src/i_oplmusic.c2
5 files changed, 34 insertions, 4 deletions
diff --git a/opl/opl.c b/opl/opl.c
index 8e57647e..2c8fd692 100644
--- a/opl/opl.c
+++ b/opl/opl.c
@@ -68,6 +68,8 @@ static opl_driver_t *drivers[] =
static opl_driver_t *driver = NULL;
static int init_stage_reg_writes = 1;
+unsigned int opl_sample_rate = 22050;
+
//
// Init/shutdown code.
//
@@ -182,6 +184,13 @@ void OPL_Shutdown(void)
}
}
+// Set the sample rate used for software OPL emulation.
+
+void OPL_SetSampleRate(unsigned int rate)
+{
+ opl_sample_rate = rate;
+}
+
void OPL_WritePort(opl_port_t port, unsigned int value)
{
if (driver != NULL)
diff --git a/opl/opl.h b/opl/opl.h
index 9f5d0a9f..04d3cf27 100644
--- a/opl/opl.h
+++ b/opl/opl.h
@@ -70,6 +70,10 @@ int OPL_Init(unsigned int port_base);
void OPL_Shutdown(void);
+// Set the sample rate used for software emulation.
+
+void OPL_SetSampleRate(unsigned int rate);
+
// Write to one of the OPL I/O ports:
void OPL_WritePort(opl_port_t port, unsigned int value);
diff --git a/opl/opl_internal.h b/opl/opl_internal.h
index 78cbe7b2..4a46b060 100644
--- a/opl/opl_internal.h
+++ b/opl/opl_internal.h
@@ -56,5 +56,9 @@ typedef struct
opl_set_paused_func set_paused_func;
} opl_driver_t;
+// Sample rate to use when doing software emulation.
+
+extern unsigned int opl_sample_rate;
+
#endif /* #ifndef OPL_INTERNAL_H */
diff --git a/opl/opl_sdl.c b/opl/opl_sdl.c
index 4a2e1ff8..2eb8288f 100644
--- a/opl/opl_sdl.c
+++ b/opl/opl_sdl.c
@@ -40,9 +40,6 @@
#include "opl_queue.h"
-// TODO:
-#define opl_sample_rate 22050
-
// When the callback mutex is locked using OPL_Lock, callback functions
// are not invoked.
@@ -278,6 +275,20 @@ static void TimerHandler(int channel, double interval_seconds)
SDL_UnlockMutex(callback_queue_mutex);
}
+static unsigned int GetSliceSize(void)
+{
+ unsigned int slicesize;
+
+ slicesize = 1024 * (opl_sample_rate / 11025);
+
+ if (slicesize <= 1024)
+ {
+ slicesize = 1024;
+ }
+
+ return slicesize;
+}
+
static int OPL_SDL_Init(unsigned int port_base)
{
// Check if SDL_mixer has been opened already
@@ -291,7 +302,7 @@ static int OPL_SDL_Init(unsigned int port_base)
return 0;
}
- if (Mix_OpenAudio(opl_sample_rate, AUDIO_S16SYS, 2, 1024) < 0)
+ if (Mix_OpenAudio(opl_sample_rate, AUDIO_S16SYS, 2, GetSliceSize()) < 0)
{
fprintf(stderr, "Error initialising SDL_mixer: %s\n", Mix_GetError());
diff --git a/src/i_oplmusic.c b/src/i_oplmusic.c
index d32a163e..474877d4 100644
--- a/src/i_oplmusic.c
+++ b/src/i_oplmusic.c
@@ -1372,6 +1372,8 @@ static void I_OPL_ShutdownMusic(void)
static boolean I_OPL_InitMusic(void)
{
+ OPL_SetSampleRate(snd_samplerate);
+
if (!OPL_Init(opl_io_port))
{
printf("Dude. The Adlib isn't responding.\n");