src/audio/SDL_audiomem.c

/* [<][>]
[^][v][top][bottom][index][help] */

FUNCTIONS

This source file includes following functions.
  1. SDL_AllocAudioMem
  2. SDL_FreeAudioMem

   1 /*
   2     SDL - Simple DirectMedia Layer
   3     Copyright (C) 1997, 1998, 1999, 2000, 2001  Sam Lantinga
   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
   7     License as published by the Free Software Foundation; either
   8     version 2 of the License, or (at your option) any later version.
   9 
  10     This library is distributed in the hope that it will be useful,
  11     but 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  02111-1307  USA
  18 
  19     Sam Lantinga
  20     slouken@devolution.com
  21 */
  22 
  23 #ifdef SAVE_RCSID
  24 static char rcsid =
  25  "@(#) $Id: SDL_audiomem.c,v 1.2.2.3 2001/02/10 07:20:03 hercules Exp $";
  26 #endif
  27 
  28 /* Functions to allocate audio buffer memory, shareable across threads
  29         (necessary because SDL audio emulates threads with fork()
  30  */
  31 
  32 #ifdef FORK_HACK
  33 #include <sys/types.h>
  34 #include <sys/ipc.h>
  35 #include <sys/shm.h>
  36 #include <stddef.h>
  37 #else
  38 #include <stdlib.h>
  39 #endif
  40 
  41 #include "SDL_audiomem.h"
  42 
  43 /* Allocate memory that will be shared between threads (freed on exit) */
  44 void *SDL_AllocAudioMem(int size)
     /* [<][>][^][v][top][bottom][index][help] */
  45 {
  46         void *chunk;
  47 
  48 #ifdef FORK_HACK
  49         int   semid;
  50         
  51         /* Create and get the address of a shared memory segment */
  52         semid = shmget(IPC_PRIVATE, size, (IPC_CREAT|0600));
  53         if ( semid < 0 ) {
  54                 return(NULL);
  55         }
  56         chunk = shmat(semid, NULL, 0);
  57         
  58         /* Set the segment for deletion when it is detatched */
  59         shmctl(semid, IPC_RMID, NULL);  /* Delets semid if shmat() fails */
  60 #else
  61         chunk = malloc(size);
  62 #endif
  63         return((void *)chunk);
  64 }
  65 
  66 void SDL_FreeAudioMem(void *chunk)
     /* [<][>][^][v][top][bottom][index][help] */
  67 {
  68 #ifdef FORK_HACK
  69         shmdt(chunk);
  70 #else
  71         free(chunk);
  72 #endif
  73 }

/* [<][>][^][v][top][bottom][index][help] */