shithub: choc

Download patch

ref: e30325c40f6ea482862745db0f4555e513f2952e
parent: 58f71d21b021bddcb24ac2b2b9736bf821221bd1
author: Simon Howard <fraggle@gmail.com>
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");