fluid_sys.h
上传用户:tjmskj2
上传日期:2020-08-17
资源大小:577k
文件大小:11k
源码类别:

midi

开发平台:

C/C++

  1. /* FluidSynth - A Software Synthesizer
  2.  *
  3.  * Copyright (C) 2003  Peter Hanappe and others.
  4.  *
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Library General Public License
  7.  * as published by the Free Software Foundation; either version 2 of
  8.  * the License, or (at your option) any later version.
  9.  *
  10.  * This library is distributed in the hope that it will be useful, but
  11.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Library General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU Library General Public
  16.  * License along with this library; if not, write to the Free
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  18.  * 02111-1307, USA
  19.  */
  20. /**
  21.    This header contains a bunch of (mostly) system and machine
  22.    dependent functions:
  23.    - timers
  24.    - current time in milliseconds and microseconds
  25.    - debug logging
  26.    - profiling
  27.    - memory locking
  28.    - checking for floating point exceptions
  29.  */
  30. #ifndef _FLUID_SYS_H
  31. #define _FLUID_SYS_H
  32. #include <glib.h>
  33. #include "fluidsynth_priv.h"
  34. /**
  35.  * Macro used for safely accessing a message from a GError and using a default
  36.  * message if it is NULL.
  37.  * @param err Pointer to a GError to access the message field of.
  38.  * @return Message string
  39.  */
  40. #define fluid_gerror_message(err)  ((err) ? err->message : "No error details")
  41. void fluid_sys_config(void);
  42. void fluid_log_config(void);
  43. void fluid_time_config(void);
  44. /* Misc */
  45. #define fluid_return_val_if_fail  g_return_val_if_fail
  46. #define fluid_return_if_fail      g_return_if_fail
  47. #define FLUID_INLINE              inline
  48. #define FLUID_POINTER_TO_UINT     GPOINTER_TO_UINT
  49. #define FLUID_UINT_TO_POINTER     GUINT_TO_POINTER
  50. #define FLUID_POINTER_TO_INT      GPOINTER_TO_INT
  51. #define FLUID_INT_TO_POINTER      GINT_TO_POINTER
  52. #define FLUID_N_ELEMENTS(struct)  (sizeof (struct) / sizeof (struct[0]))
  53. #define FLUID_IS_BIG_ENDIAN       (G_BYTE_ORDER == G_BIG_ENDIAN)
  54. /*
  55.  * Utility functions
  56.  */
  57. char *fluid_strtok (char **str, char *delim);
  58. /**
  59.   Additional debugging system, separate from the log system. This
  60.   allows to print selected debug messages of a specific subsystem.
  61.  */
  62. extern unsigned int fluid_debug_flags;
  63. #if DEBUG
  64. enum fluid_debug_level {
  65.   FLUID_DBG_DRIVER = 1
  66. };
  67. int fluid_debug(int level, char * fmt, ...);
  68. #else
  69. #define fluid_debug
  70. #endif
  71. #if defined(__OS2__)
  72. #define INCL_DOS
  73. #include <os2.h>
  74. typedef int socklen_t;
  75. #endif
  76. unsigned int fluid_curtime(void);
  77. double fluid_utime(void);
  78. /**
  79.     Timers
  80.  */
  81. /* if the callback function returns 1 the timer will continue; if it
  82.    returns 0 it will stop */
  83. typedef int (*fluid_timer_callback_t)(void* data, unsigned int msec);
  84. typedef struct _fluid_timer_t fluid_timer_t;
  85. fluid_timer_t* new_fluid_timer(int msec, fluid_timer_callback_t callback,
  86.                                void* data, int new_thread, int auto_destroy,
  87.                                int high_priority);
  88. int delete_fluid_timer(fluid_timer_t* timer);
  89. int fluid_timer_join(fluid_timer_t* timer);
  90. int fluid_timer_stop(fluid_timer_t* timer);
  91. /* Muteces */
  92. /* Regular mutex */
  93. typedef GStaticMutex fluid_mutex_t;
  94. #define FLUID_MUTEX_INIT          G_STATIC_MUTEX_INIT
  95. #define fluid_mutex_destroy(_m)   g_static_mutex_free(&(_m))
  96. #define fluid_mutex_lock(_m)      g_static_mutex_lock(&(_m))
  97. #define fluid_mutex_unlock(_m)    g_static_mutex_unlock(&(_m))
  98. #define fluid_mutex_init(_m)      G_STMT_START { 
  99.   if (!g_thread_supported ()) g_thread_init (NULL); 
  100.   g_static_mutex_init (&(_m)); 
  101. } G_STMT_END;
  102. /* Recursive lock capable mutex */
  103. typedef GStaticRecMutex fluid_rec_mutex_t;
  104. #define fluid_rec_mutex_destroy(_m)   g_static_rec_mutex_free(&(_m))
  105. #define fluid_rec_mutex_lock(_m)      g_static_rec_mutex_lock(&(_m))
  106. #define fluid_rec_mutex_unlock(_m)    g_static_rec_mutex_unlock(&(_m))
  107. #define fluid_rec_mutex_init(_m)      G_STMT_START { 
  108.   if (!g_thread_supported ()) g_thread_init (NULL); 
  109.   g_static_rec_mutex_init (&(_m)); 
  110. } G_STMT_END;
  111. /* Dynamically allocated mutex suitable for fluid_cond_t use */
  112. typedef GMutex    fluid_cond_mutex_t;
  113. #define delete_fluid_cond_mutex(m)      g_mutex_free(m)
  114. #define fluid_cond_mutex_lock(m)        g_mutex_lock(m)
  115. #define fluid_cond_mutex_unlock(m)      g_mutex_unlock(m)
  116. static FLUID_INLINE fluid_cond_mutex_t *
  117. new_fluid_cond_mutex (void)
  118. {
  119.   if (!g_thread_supported ()) g_thread_init (NULL);
  120.   return g_mutex_new ();
  121. }
  122. /* Thread condition signaling */
  123. typedef GCond fluid_cond_t;
  124. fluid_cond_t *new_fluid_cond (void);
  125. #define delete_fluid_cond(cond)         g_cond_free(cond)
  126. #define fluid_cond_signal(cond)         g_cond_signal(cond)
  127. #define fluid_cond_broadcast(cond)      g_cond_broadcast(cond)
  128. #define fluid_cond_wait(cond, mutex)    g_cond_wait(cond, mutex)
  129. /* Atomic operations */
  130. #define fluid_atomic_int_inc(_pi) g_atomic_int_inc(_pi)
  131. #define fluid_atomic_int_add(_pi, _val) g_atomic_int_add(_pi, _val)
  132. #define fluid_atomic_int_get(_pi) g_atomic_int_get(_pi)
  133. #define fluid_atomic_int_set(_pi, _val) g_atomic_int_set(_pi, _val)
  134. #define fluid_atomic_int_dec_and_test(_pi) g_atomic_int_dec_and_test(_pi)
  135. #define fluid_atomic_int_compare_and_exchange(_pi, _old, _new) 
  136.   g_atomic_int_compare_and_exchange(_pi, _old, _new)
  137. #define fluid_atomic_int_exchange_and_add(_pi, _add) 
  138.   g_atomic_int_exchange_and_add(_pi, _add)
  139. #define fluid_atomic_pointer_get(_pp)           g_atomic_pointer_get(_pp)
  140. #define fluid_atomic_pointer_set(_pp, val)      g_atomic_pointer_set(_pp, val)
  141. #define fluid_atomic_pointer_compare_and_exchange(_pp, _old, _new) 
  142.   g_atomic_pointer_compare_and_exchange(_pp, _old, _new)
  143. static FLUID_INLINE void
  144. fluid_atomic_float_set(volatile float *fptr, float val)
  145. {
  146.   sint32 ival;
  147.   memcpy (&ival, &val, 4);
  148.   fluid_atomic_int_set ((volatile int *)fptr, ival);
  149. }
  150. static FLUID_INLINE float
  151. fluid_atomic_float_get(volatile float *fptr)
  152. {
  153.   sint32 ival;
  154.   float fval;
  155.   ival = fluid_atomic_int_get ((volatile int *)fptr);
  156.   memcpy (&fval, &ival, 4);
  157.   return fval;
  158. }
  159. /* Thread private data */
  160. typedef GStaticPrivate fluid_private_t;
  161. #define fluid_private_get(_priv)                   g_static_private_get(&(_priv))
  162. #define fluid_private_set(_priv, _data, _notify)   g_static_private_set(&(_priv), _data, _notify)
  163. #define fluid_private_free(_priv)                  g_static_private_free(&(_priv))
  164. #define fluid_private_init(_priv)                  G_STMT_START { 
  165.   if (!g_thread_supported ()) g_thread_init (NULL); 
  166.   g_static_private_init (&(_priv)); 
  167. } G_STMT_END;
  168. /* Threads */
  169. typedef GThread fluid_thread_t;
  170. typedef void (*fluid_thread_func_t)(void* data);
  171. #define FLUID_THREAD_ID_NULL            NULL                    /* A NULL "ID" value */
  172. #define fluid_thread_id_t               GThread *               /* Data type for a thread ID */
  173. #define fluid_thread_get_id()           g_thread_self()         /* Get unique "ID" for current thread */
  174. fluid_thread_t* new_fluid_thread(fluid_thread_func_t func, void *data,
  175.                                  int prio_level, int detach);
  176. void delete_fluid_thread(fluid_thread_t* thread);
  177. void fluid_thread_self_set_prio (int prio_level);
  178. int fluid_thread_join(fluid_thread_t* thread);
  179. /* Sockets and I/O */
  180. fluid_istream_t fluid_get_stdin (void);
  181. fluid_ostream_t fluid_get_stdout (void);
  182. int fluid_istream_readline(fluid_istream_t in, fluid_ostream_t out, char* prompt, char* buf, int len);
  183. int fluid_ostream_printf (fluid_ostream_t out, char* format, ...);
  184. /* The function should return 0 if no error occured, non-zero
  185.    otherwise. If the function return non-zero, the socket will be
  186.    closed by the server. */
  187. typedef int (*fluid_server_func_t)(void* data, fluid_socket_t client_socket, char* addr);
  188. fluid_server_socket_t* new_fluid_server_socket(int port, fluid_server_func_t func, void* data);
  189. int delete_fluid_server_socket(fluid_server_socket_t* sock);
  190. int fluid_server_socket_join(fluid_server_socket_t* sock);
  191. void fluid_socket_close(fluid_socket_t sock);
  192. fluid_istream_t fluid_socket_get_istream(fluid_socket_t sock);
  193. fluid_ostream_t fluid_socket_get_ostream(fluid_socket_t sock);
  194. /* Profiling */
  195. /**
  196.  * Profile numbers. List all the pieces of code you want to profile
  197.  * here. Be sure to add an entry in the fluid_profile_data table in
  198.  * fluid_sys.c
  199.  */
  200. enum {
  201.   FLUID_PROF_WRITE_S16,
  202.   FLUID_PROF_ONE_BLOCK,
  203.   FLUID_PROF_ONE_BLOCK_CLEAR,
  204.   FLUID_PROF_ONE_BLOCK_VOICE,
  205.   FLUID_PROF_ONE_BLOCK_VOICES,
  206.   FLUID_PROF_ONE_BLOCK_REVERB,
  207.   FLUID_PROF_ONE_BLOCK_CHORUS,
  208.   FLUID_PROF_VOICE_NOTE,
  209.   FLUID_PROF_VOICE_RELEASE,
  210.   FLUID_PROF_LAST
  211. };
  212. #if WITH_PROFILING
  213. void fluid_profiling_print(void);
  214. /** Profiling data. Keep track of min/avg/max values to execute a
  215.     piece of code. */
  216. typedef struct _fluid_profile_data_t {
  217.   int num;
  218.   char* description;
  219.   double min, max, total;
  220.   unsigned int count;
  221. } fluid_profile_data_t;
  222. extern fluid_profile_data_t fluid_profile_data[];
  223. /** Macro to obtain a time refence used for the profiling */
  224. #define fluid_profile_ref() fluid_utime()
  225. /** Macro to create a variable and assign the current reference time for profiling.
  226.  * So we don't get unused variable warnings when profiling is disabled. */
  227. #define fluid_profile_ref_var(name)     double name = fluid_utime()
  228. /** Macro to calculate the min/avg/max. Needs a time refence and a
  229.     profile number. */
  230. #define fluid_profile(_num,_ref) { 
  231.   double _now = fluid_utime(); 
  232.   double _delta = _now - _ref; 
  233.   fluid_profile_data[_num].min = _delta < fluid_profile_data[_num].min ? _delta : fluid_profile_data[_num].min; 
  234.   fluid_profile_data[_num].max = _delta > fluid_profile_data[_num].max ? _delta : fluid_profile_data[_num].max; 
  235.   fluid_profile_data[_num].total += _delta; 
  236.   fluid_profile_data[_num].count++; 
  237.   _ref = _now; 
  238. }
  239. #else
  240. /* No profiling */
  241. #define fluid_profiling_print()
  242. #define fluid_profile_ref()  0
  243. #define fluid_profile_ref_var(name)
  244. #define fluid_profile(_num,_ref)
  245. #endif
  246. /**
  247.     Memory locking
  248.     Memory locking is used to avoid swapping of the large block of
  249.     sample data.
  250.  */
  251. #if defined(HAVE_SYS_MMAN_H) && !defined(__OS2__)
  252. #define fluid_mlock(_p,_n)      mlock(_p, _n)
  253. #define fluid_munlock(_p,_n)    munlock(_p,_n)
  254. #else
  255. #define fluid_mlock(_p,_n)      0
  256. #define fluid_munlock(_p,_n)
  257. #endif
  258. /**
  259.     Floating point exceptions
  260.     fluid_check_fpe() checks for "unnormalized numbers" and other
  261.     exceptions of the floating point processsor.
  262. */
  263. #ifdef FPE_CHECK
  264. #define fluid_check_fpe(expl) fluid_check_fpe_i386(expl)
  265. #define fluid_clear_fpe() fluid_clear_fpe_i386()
  266. #else
  267. #define fluid_check_fpe(expl)
  268. #define fluid_clear_fpe()
  269. #endif
  270. unsigned int fluid_check_fpe_i386(char * explanation_in_case_of_fpe);
  271. void fluid_clear_fpe_i386(void);
  272. #endif /* _FLUID_SYS_H */