src/audio/SDL_audiomem.c
author Sam Lantinga <slouken@libsdl.org>
Fri, 14 Dec 2001 13:13:20 +0000
changeset 254 4fc12b8edf74
parent 252 e8157fcb3114
child 297 f6ffac90895c
permissions -rw-r--r--
*** empty log message ***
     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@libsdl.org
    21 */
    22 
    23 #ifdef SAVE_RCSID
    24 static char rcsid =
    25  "@(#) $Id$";
    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 #include <stdlib.h>
    33 #ifdef FORK_HACK
    34 #include <sys/types.h>
    35 #include <sys/ipc.h>
    36 #include <sys/shm.h>
    37 #include <stddef.h>
    38 #endif
    39 
    40 #include "SDL_audiomem.h"
    41 
    42 /* Allocate memory that will be shared between threads (freed on exit) */
    43 void *SDL_AllocAudioMem(int size)
    44 {
    45 	void *chunk;
    46 
    47 #ifdef FORK_HACK
    48 	int   semid;
    49 	
    50 	/* Create and get the address of a shared memory segment */
    51 	semid = shmget(IPC_PRIVATE, size, (IPC_CREAT|0600));
    52 	if ( semid < 0 ) {
    53 		return(NULL);
    54 	}
    55 	chunk = shmat(semid, NULL, 0);
    56 	
    57 	/* Set the segment for deletion when it is detatched */
    58 	shmctl(semid, IPC_RMID, NULL);	/* Delets semid if shmat() fails */
    59 #else
    60 	chunk = malloc(size);
    61 #endif
    62 	return((void *)chunk);
    63 }
    64 
    65 void SDL_FreeAudioMem(void *chunk)
    66 {
    67 #ifdef FORK_HACK
    68 	shmdt(chunk);
    69 #else
    70 	free(chunk);
    71 #endif
    72 }