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

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.  * Josh Green <josh@resonance.org>
  22.  * 2009-05-28
  23.  */
  24. #include "fluid_event_queue.h"
  25. #include "fluidsynth_priv.h"
  26. /**
  27.  * Create a lock free queue with a fixed maximum count and size of elements.
  28.  * @param count Count of elements in queue (fixed max number of queued elements)
  29.  * @return New lock free queue or NULL if out of memory (error message logged)
  30.  *
  31.  * Lockless FIFO queues don't use any locking mechanisms and can therefore be
  32.  * advantageous in certain situations, such as passing data between a lower
  33.  * priority thread and a higher "real time" thread, without potential lock
  34.  * contention which could stall the high priority thread.  Note that there may
  35.  * only be one producer thread and one consumer thread.
  36.  */
  37. fluid_event_queue_t *
  38. fluid_event_queue_new (int count)
  39. {
  40.   fluid_event_queue_t *queue;
  41.   fluid_return_val_if_fail (count > 0, NULL);
  42.   queue = FLUID_NEW (fluid_event_queue_t);
  43.   if (!queue)
  44.   {
  45.     FLUID_LOG (FLUID_ERR, "Out of memory");
  46.     return NULL;
  47.   }
  48.   queue->array = FLUID_ARRAY (fluid_event_queue_elem_t, count);
  49.   if (!queue->array)
  50.   {
  51.     FLUID_FREE (queue);
  52.     FLUID_LOG (FLUID_ERR, "Out of memory");
  53.     return NULL;
  54.   }
  55.   /* Clear array, in case dynamic pointer reclaiming is being done */
  56.   FLUID_MEMSET (queue->array, 0, sizeof (fluid_event_queue_elem_t) * count);
  57.   queue->totalcount = count;
  58.   queue->count = 0;
  59.   queue->in = 0;
  60.   queue->out = 0;
  61.   return (queue);
  62. }
  63. /**
  64.  * Free an event queue.
  65.  * @param queue Lockless queue instance
  66.  *
  67.  * Care must be taken when freeing a queue, to ensure that the consumer and
  68.  * producer threads will no longer access it.
  69.  */
  70. void
  71. fluid_event_queue_free (fluid_event_queue_t *queue)
  72. {
  73.   FLUID_FREE (queue->array);
  74.   FLUID_FREE (queue);
  75. }