fluid-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[fluid-dev] [PATCH] OS/2 DART support


From: KO Myung-Hun
Subject: [fluid-dev] [PATCH] OS/2 DART support
Date: Wed, 04 Feb 2009 14:53:17 +0900
User-agent: Mozilla/5.0 (OS/2; U; Warp 4.5; en-US; rv:1.8.1.19) Gecko/20081217 SeaMonkey/1.1.14 Mnenhy/0.7.6.0

Hi/2.

This patch enables a OS/2 DART audio driver support based on 1.0.8
release sources.

Any comments ?

-- 
KO Myung-Hun

Using Mozilla SeaMonkey 1.1.14
Under OS/2 Warp 4 for Korean with FixPak #15
On AMD ThunderBird 1 GHz with 512 MB RAM

Korean OS/2 User Community : http://www.ecomstation.co.kr


diff -EbuNr --strip-trailing-cr configure.ac.org configure.ac
--- configure.ac.org    2007-11-17 14:32:06.000000000 +0900
+++ configure.ac        2008-08-26 11:35:40.000000000 +0900
@@ -75,6 +75,10 @@
   LIBFLUID_LDFLAGS="-no-undefined"
   FLUID_CPPFLAGS="-DFLUIDSYNTH_NOT_A_DLL"
   ;;
+os2*)
+  LDFLAGS="$LDFLAGS -Zbin-files"
+  LIBFLUID_LDFLAGS="-no-undefined"
+  ;;
 esac
 
 AC_SUBST(LIBFLUID_LIBS)
@@ -227,6 +231,24 @@
 AC_SUBST(COREAUDIO_LIBS)
 
 dnl
+dnl - Check support for DART
+dnl
+AC_CHECK_HEADER(os2me.h, DART_FOUND="yes", DART_FOUND="no")
+AC_ARG_ENABLE(dart, AS_HELP_STRING([--disable-dart],
+    [disable DART support (default=auto)]),
+  enable_dart=$enableval, enable_dart="yes")
+
+DART_SUPPORT=0
+if test "$enable_dart" = "yes" -a "$DART_FOUND" = "yes"; then
+  AC_DEFINE(DART_SUPPORT, 1, [whether or not we are supporting DART])
+  DART_SUPPORT=1
+fi
+
+AM_CONDITIONAL(DART_SUPPORT, test "$DART_SUPPORT" = "1")
+AC_SUBST(DART_CFLAGS)
+AC_SUBST(DART_LIBS)
+
+dnl
 dnl Check for readline support (Josh Green 2003-06-10)
 dnl
 AC_ARG_WITH(readline,
@@ -379,6 +401,12 @@
   echo "LADCCA support:        no"
 fi
 
+if test "${DART_SUPPORT}" = "1"; then
+  echo "DART support:          yes"
+else
+  echo "DART support:          no"
+fi
+
 dnl if test "${AUFILE_SUPPORT}" = "1"; then
 dnl   echo "Sound file:            yes"
 dnl else
diff -EbuNr --strip-trailing-cr src/config.h.in.org src/config.h.in
--- src/config.h.in.org 2007-11-17 14:32:30.000000000 +0900
+++ src/config.h.in     2008-08-26 11:43:02.000000000 +0900
@@ -6,6 +6,9 @@
 /* whether or not we are supporting CoreAudio */
 #undef COREAUDIO_SUPPORT
 
+/* whether or not we are supporting DART */
+#undef DART_SUPPORT
+
 /* Define if building for Mac OS X Darwin */
 #undef DARWIN
 
diff -EbuNr --strip-trailing-cr src/fluid_adriver.c.org src/fluid_adriver.c
--- src/fluid_adriver.c.org     2007-08-18 14:53:34.000000000 +0900
+++ src/fluid_adriver.c 2008-03-30 20:13:20.000000000 +0900
@@ -96,6 +96,13 @@
 int delete_fluid_sndmgr_audio_driver(fluid_audio_driver_t* p);
 #endif
 
+#if DART_SUPPORT
+fluid_audio_driver_t* new_fluid_dart_audio_driver(fluid_settings_t* settings,
+                          fluid_synth_t* synth);
+int delete_fluid_dart_audio_driver(fluid_audio_driver_t* p);
+void fluid_dart_audio_driver_settings(fluid_settings_t* settings);
+#endif
+
 #define AUFILE_SUPPORT 1
 #if AUFILE_SUPPORT
 fluid_audio_driver_t* new_fluid_file_audio_driver(fluid_settings_t* settings,
@@ -154,6 +161,13 @@
     delete_fluid_jack_audio_driver,
     fluid_jack_audio_driver_settings },
 #endif
+#if DART_SUPPORT
+  { "dart",
+    new_fluid_dart_audio_driver,
+    NULL,
+    delete_fluid_dart_audio_driver,
+    fluid_dart_audio_driver_settings },
+#endif
 #if AUFILE_SUPPORT
   { "file",
     new_fluid_file_audio_driver,
@@ -205,6 +219,8 @@
   fluid_settings_register_str(settings, "audio.driver", "portaudio", 0, NULL, 
NULL);
 #elif JACK_SUPPORT
   fluid_settings_register_str(settings, "audio.driver", "jack", 0, NULL, NULL);
+#elif DART_SUPPORT
+  fluid_settings_register_str(settings, "audio.driver", "dart", 0, NULL, NULL);
 #elif AUFILE_SUPPORT
   fluid_settings_register_str(settings, "audio.driver", "file", 0, NULL, NULL);
 #else
@@ -233,6 +249,9 @@
 #if JACK_SUPPORT
   fluid_settings_add_option(settings, "audio.driver", "jack");
 #endif
+#if DART_SUPPORT
+  fluid_settings_add_option(settings, "audio.driver", "dart");
+#endif
 #if AUFILE_SUPPORT
   fluid_settings_add_option(settings, "audio.driver", "file");
 #endif
diff -EbuNr --strip-trailing-cr src/fluid_dart.c.org src/fluid_dart.c
--- src/fluid_dart.c.org        2008-04-29 23:41:52.000000000 +0900
+++ src/fluid_dart.c    2008-08-11 23:12:14.000000000 +0900
@@ -0,0 +1,264 @@
+/* FluidSynth - A Software Synthesizer
+ *
+ * Copyright (C) 2003  Peter Hanappe and others.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public License
+ * as published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ * 02111-1307, USA
+ */
+
+/* fluid_dart.c
+ *
+ * Driver for OS/2 DART
+ *
+ */
+
+#include "fluid_adriver.h"
+#include "fluid_settings.h"
+#include "fluid_sys.h"
+
+#if DART_SUPPORT
+
+/* To avoid name conflict */
+#undef VERSION
+
+#define INCL_DOS
+#include <os2.h>
+
+#define INCL_OS2MM
+#include <os2me.h>
+
+#define NUM_MIX_BUFS        2
+
+/** fluid_dart_audio_driver_t
+ *
+ * This structure should not be accessed directly. Use audio port
+ * functions instead.
+ */
+typedef struct {
+    fluid_audio_driver_t driver;
+    fluid_synth_t* synth;
+    int frame_size;
+    USHORT usDeviceID;                          /* Amp Mixer device id     */
+    MCI_MIX_BUFFER MixBuffers[NUM_MIX_BUFS];    /* Device buffers          */
+    MCI_MIXSETUP_PARMS MixSetupParms;           /* Mixer parameters        */
+    MCI_BUFFER_PARMS BufferParms;               /* Device buffer parms     */
+} fluid_dart_audio_driver_t;
+
+static fluid_dart_audio_driver_t* m_dev;
+static HMODULE m_hmodMDM = NULLHANDLE;
+static ULONG (APIENTRY *m_pfnmciSendCommand)(USHORT, USHORT, ULONG, PVOID, 
USHORT) = NULL;
+
+fluid_audio_driver_t* new_fluid_dart_audio_driver(fluid_settings_t* settings,
+                          fluid_synth_t* synth);
+
+int delete_fluid_dart_audio_driver(fluid_audio_driver_t* p);
+void fluid_dart_audio_driver_settings(fluid_settings_t* settings);
+
+static LONG APIENTRY fluid_dart_audio_run( ULONG ulStatus, PMCI_MIX_BUFFER 
pBuffer, ULONG ulFlags );
+
+/**************************************************************
+ *
+ *        DART audio driver
+ *
+ */
+
+void fluid_dart_audio_driver_settings(fluid_settings_t* settings)
+{
+    fluid_settings_register_str(settings, "audio.dart.device", "default", 0, 
NULL, NULL);
+}
+
+
+fluid_audio_driver_t*
+new_fluid_dart_audio_driver(fluid_settings_t* settings, fluid_synth_t* synth)
+{
+    fluid_dart_audio_driver_t* dev;
+    double sample_rate;
+    int periods, period_size;
+    UCHAR szFailedName[ 256 ];
+    MCI_AMP_OPEN_PARMS AmpOpenParms;
+    int i;
+    ULONG rc;
+
+    dev = FLUID_NEW(fluid_dart_audio_driver_t);
+    if (dev == NULL) {
+        FLUID_LOG(FLUID_ERR, "Out of memory");
+        return NULL;
+    }
+    FLUID_MEMSET(dev, 0, sizeof(fluid_dart_audio_driver_t));
+
+    fluid_settings_getnum(settings, "synth.sample-rate", &sample_rate);
+    fluid_settings_getint(settings, "audio.periods", &periods);
+    fluid_settings_getint(settings, "audio.period-size", &period_size);
+
+    /* check the format */
+    if (!fluid_settings_str_equal(settings, "audio.sample-format", "16bits")) {
+        FLUID_LOG(FLUID_ERR, "Unhandled sample format");
+        goto error_recovery;
+    }
+
+    dev->synth = synth;
+    dev->frame_size = 2 * sizeof(short);
+
+    /* Load only once
+     */
+    if( m_hmodMDM == NULLHANDLE )
+    {
+        rc = DosLoadModule(szFailedName, sizeof(szFailedName), "MDM.DLL", 
&m_hmodMDM);
+
+        if (rc != 0 ) {
+            FLUID_LOG(FLUID_ERR, "Cannot load MDM.DLL for DART due to %s", 
szFailedName);
+            goto error_recovery;
+        }
+
+        rc = DosQueryProcAddr(m_hmodMDM, 1, NULL, (PFN *)&m_pfnmciSendCommand);
+
+        if (rc != 0 ) {
+            FLUID_LOG(FLUID_ERR, "Cannot find mciSendCommand() in MDM.DLL");
+            DosFreeModule(m_hmodMDM);
+            m_hmodMDM = NULLHANDLE;
+            goto error_recovery;
+        }
+    }
+
+    /* open the mixer device
+     */
+    FLUID_MEMSET(&AmpOpenParms, 0, sizeof(MCI_AMP_OPEN_PARMS));
+    AmpOpenParms.usDeviceID = (USHORT)0;
+    AmpOpenParms.pszDeviceType = (PSZ)MCI_DEVTYPE_AUDIO_AMPMIX;
+
+    rc = m_pfnmciSendCommand(0, MCI_OPEN,
+                             MCI_WAIT | MCI_OPEN_TYPE_ID | MCI_OPEN_SHAREABLE,
+                             (PVOID)&AmpOpenParms, 0);
+
+    if (rc != MCIERR_SUCCESS) {
+        FLUID_LOG(FLUID_ERR, "Cannot open DART, rc = %lu", rc);
+        goto error_recovery;
+    }
+
+    dev->usDeviceID = AmpOpenParms.usDeviceID;
+
+    /* Set the m_MixSetupParms data structure to match the requirements.
+     * This is a global that is used to setup the mixer.
+     */
+    dev->MixSetupParms.ulBitsPerSample = BPS_16;
+    dev->MixSetupParms.ulFormatTag = MCI_WAVE_FORMAT_PCM;
+    dev->MixSetupParms.ulSamplesPerSec = sample_rate;
+    dev->MixSetupParms.ulChannels = 2;
+
+    /* Setup the mixer for playback of wave data
+     */
+    dev->MixSetupParms.ulFormatMode = MCI_PLAY;
+    dev->MixSetupParms.ulDeviceType = MCI_DEVTYPE_WAVEFORM_AUDIO;
+    dev->MixSetupParms.pmixEvent    = fluid_dart_audio_run;
+
+    rc = m_pfnmciSendCommand(dev->usDeviceID, MCI_MIXSETUP,
+                             MCI_WAIT | MCI_MIXSETUP_INIT,
+                             (PVOID)&dev->MixSetupParms, 0);
+
+    if (rc != MCIERR_SUCCESS) {
+        FLUID_LOG(FLUID_ERR, "Cannot setup DART, rc = %lu", rc);
+        goto error_recovery;
+    }
+
+    /* Set up the m_BufferParms data structure and allocate
+     * device buffers from the Amp-Mixer
+     */
+    dev->BufferParms.ulNumBuffers = NUM_MIX_BUFS;
+    dev->BufferParms.ulBufferSize = periods * period_size * dev->frame_size;
+    dev->BufferParms.pBufList = dev->MixBuffers;
+
+    rc = m_pfnmciSendCommand(dev->usDeviceID, MCI_BUFFER,
+                             MCI_WAIT | MCI_ALLOCATE_MEMORY,
+                             (PVOID)&dev->BufferParms, 0);
+
+    if ((USHORT)rc != MCIERR_SUCCESS) {
+        FLUID_LOG(FLUID_ERR, "Cannot allocate memory for DART, rc = %lu", rc);
+        goto error_recovery;
+    }
+
+    /* Initialize all device buffers.
+     */
+    for (i = 0; i < NUM_MIX_BUFS; i++) {
+       FLUID_MEMSET(dev->MixBuffers[i].pBuffer, 0, 
dev->BufferParms.ulBufferSize);
+       dev->MixBuffers[i].ulBufferLength = dev->BufferParms.ulBufferSize;
+       dev->MixBuffers[i].ulFlags = 0;
+       fluid_synth_write_s16(dev->synth, dev->MixBuffers[i].ulBufferLength / 
dev->frame_size,
+                             dev->MixBuffers[i].pBuffer, 0, 2, 
dev->MixBuffers[i].pBuffer, 1, 2 );
+    }
+
+    /* Write buffers to kick off the amp mixer.
+     */
+    dev->MixSetupParms.pmixWrite(dev->MixSetupParms.ulMixHandle,
+                                 dev->MixBuffers,
+                                 NUM_MIX_BUFS);
+
+    m_dev = dev;
+
+    return (fluid_audio_driver_t*) dev;
+
+error_recovery:
+
+    delete_fluid_dart_audio_driver((fluid_audio_driver_t*) dev);
+    return NULL;
+}
+
+int delete_fluid_dart_audio_driver(fluid_audio_driver_t* p)
+{
+    fluid_dart_audio_driver_t* dev = (fluid_dart_audio_driver_t*) p;
+
+    if (dev == NULL) {
+        return FLUID_OK;
+    }
+
+    if (dev->usDeviceID != 0) {
+        MCI_GENERIC_PARMS    GenericParms;
+
+        /* Send message to stop the audio device
+         */
+        m_pfnmciSendCommand(dev->usDeviceID, MCI_STOP, MCI_WAIT,
+                            (PVOID)&GenericParms, 0);
+
+        /* Deallocate device buffers
+         */
+        m_pfnmciSendCommand(dev->usDeviceID, MCI_BUFFER,
+                            MCI_WAIT | MCI_DEALLOCATE_MEMORY,
+                            (PVOID)&dev->BufferParms, 0);
+
+        /* Close device the mixer device
+         */
+        m_pfnmciSendCommand(dev->usDeviceID, MCI_CLOSE, MCI_WAIT,
+                            (PVOID)&GenericParms, 0);
+    }
+
+    FLUID_FREE(dev);
+    return FLUID_OK;
+}
+
+static LONG APIENTRY fluid_dart_audio_run( ULONG ulStatus, PMCI_MIX_BUFFER 
pBuffer, ULONG ulFlags )
+{
+    switch( ulFlags ) {
+        case MIX_STREAM_ERROR | MIX_WRITE_COMPLETE: /* error occur in device */
+        case MIX_WRITE_COMPLETE:                    /* for playback  */
+            FLUID_MEMSET(pBuffer->pBuffer, 0, pBuffer->ulBufferLength);
+            fluid_synth_write_s16(m_dev->synth, pBuffer->ulBufferLength / 
m_dev->frame_size,
+                                  pBuffer->pBuffer, 0, 2, pBuffer->pBuffer, 1, 
2 );
+            m_dev->MixSetupParms.pmixWrite(m_dev->MixSetupParms.ulMixHandle, 
pBuffer, 1);
+            break;
+    }
+
+    return TRUE;
+}
+
+#endif /* #if DART_SUPPORT */
diff -EbuNr --strip-trailing-cr src/fluid_sys.c.org src/fluid_sys.c
--- src/fluid_sys.c.org 2008-03-31 23:14:32.000000000 +0900
+++ src/fluid_sys.c     2008-03-27 21:52:02.000000000 +0900
@@ -636,6 +636,186 @@
 
 
 
+#elif defined(__OS2__)
+/*=============================================================*/
+/*                                                             */
+/*                           OS2                               */
+/*                                                             */
+/*=============================================================*/
+
+/***************************************************************
+ *
+ *               Timer
+ *
+ */
+
+struct _fluid_timer_t
+{
+  long msec;
+  fluid_timer_callback_t callback;
+  void* data;
+  int thread_id;
+  int cont;
+  int auto_destroy;
+};
+
+static int fluid_timer_count = 0;
+void fluid_timer_run(void *data);
+
+fluid_timer_t*
+new_fluid_timer(int msec, fluid_timer_callback_t callback, void* data,
+           int new_thread, int auto_destroy)
+{
+  fluid_timer_t* timer = FLUID_NEW(fluid_timer_t);
+  if (timer == NULL) {
+    FLUID_LOG(FLUID_ERR, "Out of memory");
+    return NULL;
+  }
+
+  timer->cont = 1;
+  timer->msec = msec;
+  timer->callback = callback;
+  timer->data = data;
+  timer->thread_id =-1;
+  timer->auto_destroy = auto_destroy;
+
+  if (new_thread) {
+    timer->thread_id = _beginthread( fluid_timer_run, NULL, 256 * 1024, ( void 
* )timer );
+    if (timer->thread_id == -1) {
+      FLUID_LOG(FLUID_ERR, "Couldn't create timer thread");
+      FLUID_FREE(timer);
+      return NULL;
+    }
+    DosSetPriority(PRTYS_THREAD, PRTYC_TIMECRITICAL, PRTYD_MAXIMUM, 
timer->thread_id);
+  } else {
+    fluid_timer_run(( void * )timer);
+  }
+  return timer;
+}
+
+void
+fluid_timer_run(void *data)
+{
+  int count = 0;
+  int cont = 1;
+  long start;
+  long delay;
+  fluid_timer_t* timer;
+  timer = (fluid_timer_t*) data;
+
+  if ((timer == NULL) || (timer->callback == NULL)) {
+    return;
+  }
+
+  DosSetPriority( PRTYS_THREAD, PRTYC_REGULAR, PRTYD_MAXIMUM, 0 );
+
+  /* keep track of the start time for absolute positioning */
+  start = fluid_curtime();
+
+  while (cont) {
+
+    /* do whatever we have to do */
+    cont = (*timer->callback)(timer->data, fluid_curtime() - start);
+
+    count++;
+
+    /* to avoid incremental time errors, I calculate the delay between
+       two callbacks bringing in the "absolute" time (count *
+       timer->msec) */
+    delay = (count * timer->msec) - (fluid_curtime() - start);
+    if (delay > 0) {
+      DosSleep(delay);
+    }
+
+    cont &= timer->cont;
+  }
+
+  FLUID_LOG(FLUID_DBG, "Timer thread finished");
+
+  if (timer->auto_destroy) {
+    FLUID_FREE(timer);
+  }
+
+  return;
+}
+
+int
+delete_fluid_timer(fluid_timer_t* timer)
+{
+  timer->cont = 0;
+  fluid_timer_join(timer);
+  FLUID_FREE(timer);
+  return FLUID_OK;
+}
+
+int
+fluid_timer_join(fluid_timer_t* timer)
+{
+  ULONG wait_result;
+  if (timer->thread_id == -1) {
+    return FLUID_OK;
+  }
+  wait_result = DosWaitThread(&timer->thread_id, DCWW_WAIT);
+  return (wait_result == 0)? FLUID_OK : FLUID_FAILED;
+}
+
+
+/***************************************************************
+ *
+ *               Time
+ */
+
+double rdtsc(void);
+double fluid_estimate_cpu_frequency(void);
+
+static double fluid_cpu_frequency = -1.0;
+
+void fluid_time_config(void)
+{
+  if (fluid_cpu_frequency < 0.0) {
+    fluid_cpu_frequency = fluid_estimate_cpu_frequency() / 1000000.0;
+  }
+}
+
+unsigned int fluid_curtime(void)
+{
+  ULONG ulMS;
+  DosQuerySysInfo( QSV_MS_COUNT, QSV_MS_COUNT, &ulMS, sizeof( ULONG ));
+  return ulMS;
+}
+
+double fluid_utime(void)
+{
+  return (rdtsc() / fluid_cpu_frequency);
+}
+
+#define Q2ULL( q ) (*(unsigned long long *)&q)
+
+double rdtsc(void)
+{
+  QWORD t;
+  DosTmrQueryTime(&t);
+  return (double)Q2ULL(t);
+}
+
+double fluid_estimate_cpu_frequency(void)
+{
+  unsigned int before, after;
+  QWORD start, stop;
+
+  before = fluid_curtime();
+  DosTmrQueryTime(&start);
+
+  DosSleep(1000);
+
+  after = fluid_curtime();
+  DosTmrQueryTime(&stop);
+
+  return (double) 1000 * (Q2ULL(stop) - Q2ULL(start)) / (after - before);
+}
+
+
+
 #else
 
 /*=============================================================*/
@@ -1062,6 +1242,75 @@
   return (wait_result == WAIT_OBJECT_0)? FLUID_OK : FLUID_FAILED;
 }
 
+#elif defined(__OS2__)
+
+struct _fluid_thread_t {
+  int thread_id;
+  fluid_thread_func_t func;
+  void* data;
+  int detached;
+};
+
+static void fluid_thread_start(void *data)
+{
+  fluid_thread_t* thread = (fluid_thread_t*) data;
+
+  thread->func(thread->data);
+
+  if (thread->detached) {
+    FLUID_FREE(thread);
+  }
+
+  return 0;
+}
+
+
+fluid_thread_t* new_fluid_thread(fluid_thread_func_t func, void* data, int 
detach)
+{
+  fluid_thread_t* thread;
+
+  if (func == NULL) {
+    FLUID_LOG(FLUID_ERR, "Invalid thread function");
+    return NULL;
+  }
+
+  thread = FLUID_NEW(fluid_thread_t);
+  if (thread == NULL) {
+    FLUID_LOG(FLUID_ERR, "Out of memory");
+    return NULL;
+  }
+
+  thread->data = data;
+  thread->func = func;
+  thread->detached = detach;
+
+  thread->thread_id = _beginthread(fluid_thread_start, NULL, 256 * 1024, (void 
*) thread);
+  if (thread->thread_id == -1) {
+    FLUID_LOG(FLUID_ERR, "Couldn't create the thread");
+    FLUID_FREE(thread);
+    return NULL;
+  }
+
+  return thread;
+}
+
+int delete_fluid_thread(fluid_thread_t* thread)
+{
+  FLUID_FREE(thread);
+  return FLUID_OK;
+}
+
+
+int fluid_thread_join(fluid_thread_t* thread)
+{
+  ULONG wait_result;
+  if (thread->thread_id == -1) {
+    return FLUID_OK;
+  }
+  wait_result = DosWaitThread(&thread->thread_id, DCWW_WAIT);
+  return (wait_result == 0)? FLUID_OK : FLUID_FAILED;
+}
+
 #else
 
 
diff -EbuNr --strip-trailing-cr src/fluid_sys.h.org src/fluid_sys.h
--- src/fluid_sys.h.org 2007-11-11 12:30:40.000000000 +0900
+++ src/fluid_sys.h     2008-03-27 21:31:36.000000000 +0900
@@ -90,6 +90,15 @@
 unsigned int fluid_curtime();
 #define fluid_utime()  0.0
 
+#elif defined(__OS2__)
+#define INCL_DOS
+#include <os2.h>
+
+typedef int socklen_t;
+
+unsigned int fluid_curtime(void);
+double fluid_utime(void);
+
 #else
 
 unsigned int fluid_curtime(void);
@@ -137,6 +146,13 @@
 #define fluid_mutex_lock(_m)      WaitForSingleObject(_m, INFINITE)
 #define fluid_mutex_unlock(_m)    ReleaseMutex(_m)
 
+#elif defined(__OS2__)
+typedef HMTX fluid_mutex_t;
+#define fluid_mutex_init(_m)      { (_m) = 0; DosCreateMutexSem( NULL, &(_m), 
0, FALSE ); }
+#define fluid_mutex_destroy(_m)   if (_m) { DosCloseMutexSem(_m); }
+#define fluid_mutex_lock(_m)      DosRequestMutexSem(_m, -1L)
+#define fluid_mutex_unlock(_m)    DosReleaseMutexSem(_m)
+
 #else
 typedef pthread_mutex_t fluid_mutex_t;
 #define fluid_mutex_init(_m)      pthread_mutex_init(&(_m), NULL)
@@ -268,7 +284,7 @@
     sample data.
  */
 
-#if HAVE_SYS_MMAN_H
+#if defined(HAVE_SYS_MMAN_H) && !defined(__OS2__)
 #define fluid_mlock(_p,_n)      mlock(_p, _n)
 #define fluid_munlock(_p,_n)    munlock(_p,_n)
 #else
diff -EbuNr --strip-trailing-cr src/Makefile.am.org src/Makefile.am
--- src/Makefile.am.org 2007-11-11 13:06:56.000000000 +0900
+++ src/Makefile.am     2008-04-01 23:40:02.000000000 +0900
@@ -30,13 +30,16 @@
 endif
 endif
 
+if DART_SUPPORT
+fluid_dart = fluid_dart.c
+endif
 
 # Extra files and optional drivers
 EXTRA_DIST = fluid_dll.c fluid_dsound.c fluid_winmidi.c fluid_portaudio.c \
        fluid_coreaudio.c fluid_alsa.c fluid_oss.c \
        fluid_dsp_simple.c \
        fluid_sndmgr.c config_macos.h config_macosx.h config_macosx_pb.h \
-       config_win32.h fluid_jack.c
+       config_win32.h fluid_jack.c fluid_dart.c
 
 lib_LTLIBRARIES = libfluidsynth.la
 bin_PROGRAMS = fluidsynth 
@@ -48,6 +51,7 @@
        $(fluid_lash) \
        $(fluid_oss) \
        $(fluid_windows) \
+       $(fluid_dart) \
        fluid_adriver.c \
        fluid_adriver.h \
        fluid_chan.c \
@@ -105,10 +109,10 @@
        fluid_aufile.c 
 
 INCLUDES = -I$(top_srcdir)/include $(LASH_CFLAGS) $(LADCCA_CFLAGS) \
-  $(READLINE_CFLAGS) $(JACK_CFLAGS) $(ALSA_CFLAGS)
+  $(READLINE_CFLAGS) $(JACK_CFLAGS) $(ALSA_CFLAGS) $(DART_CFLAGS)
 
 libfluidsynth_la_LIBADD = $(LIBFLUID_LIBS) $(LASH_LIBS) $(LADCCA_LIBS) \
-  $(READLINE_LIBS) $(COREAUDIO_LIBS) $(JACK_LIBS) $(ALSA_LIBS)
+  $(READLINE_LIBS) $(COREAUDIO_LIBS) $(JACK_LIBS) $(ALSA_LIBS) $(DART_LIBS)
 libfluidsynth_la_LDFLAGS = \
        -version-info @LT_VERSION_INFO@ \
        -export-dynamic $(LIBFLUID_LDFLAGS)

reply via email to

[Prev in Thread] Current Thread [Next in Thread]