ref: e30325c40f6ea482862745db0f4555e513f2952e
parent: 58f71d21b021bddcb24ac2b2b9736bf821221bd1
author: Simon Howard <[email protected]>
date: Sat Oct 17 18:36:15 EDT 2009
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
--- a/opl/opl.c
+++ b/opl/opl.c
@@ -68,6 +68,8 @@
static opl_driver_t *driver = NULL;
static int init_stage_reg_writes = 1;
+unsigned int opl_sample_rate = 22050;
+
//
// Init/shutdown code.
//
@@ -180,6 +182,13 @@
driver->shutdown_func();
driver = NULL;
}
+}
+
+// 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)
--- a/opl/opl.h
+++ b/opl/opl.h
@@ -70,6 +70,10 @@
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);
--- a/opl/opl_internal.h
+++ b/opl/opl_internal.h
@@ -56,5 +56,9 @@
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 */
--- 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 @@
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 @@
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());
--- a/src/i_oplmusic.c
+++ b/src/i_oplmusic.c
@@ -1372,6 +1372,8 @@
static boolean I_OPL_InitMusic(void)
{
+ OPL_SetSampleRate(snd_samplerate);
+
if (!OPL_Init(opl_io_port))
{
printf("Dude. The Adlib isn't responding.\n");