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)
_______________________________________________ fluid-dev mailing list fluid-dev@nongnu.org http://lists.nongnu.org/mailman/listinfo/fluid-dev