src/audio/SDL_audiomem.c
author Sam Lantinga
Mon, 06 Feb 2006 08:28:51 +0000
changeset 1330 450721ad5436
parent 1312 c9b51268668f
child 1336 3692456e7b0f
permissions -rw-r--r--
It's now possible to build SDL without any C runtime at all on Windows,
using Visual C++ 2005
     1 /*
     2     SDL - Simple DirectMedia Layer
     3     Copyright (C) 1997-2006 Sam Lantinga
     4 
     5     This library is free software; you can redistribute it and/or
     6     modify it under the terms of the GNU Lesser General Public
     7     License as published by the Free Software Foundation; either
     8     version 2.1 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     Lesser General Public License for more details.
    14 
    15     You should have received a copy of the GNU Lesser General Public
    16     License along with this library; if not, write to the Free Software
    17     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    18 
    19     Sam Lantinga
    20     slouken@libsdl.org
    21 */
    22 
    23 /* Functions to allocate audio buffer memory, shareable across threads
    24 	(necessary because SDL audio emulates threads with fork()
    25  */
    26 
    27 #ifdef FORK_HACK
    28 #include <sys/types.h>
    29 #include <sys/ipc.h>
    30 #include <sys/shm.h>
    31 #include <stddef.h>
    32 #endif
    33 
    34 #include "SDL_audiomem.h"
    35 #include "SDL_stdlib.h"
    36 
    37 /* Allocate memory that will be shared between threads (freed on exit) */
    38 void *SDL_AllocAudioMem(int size)
    39 {
    40 	void *chunk;
    41 
    42 #ifdef FORK_HACK
    43 	int   semid;
    44 	
    45 	/* Create and get the address of a shared memory segment */
    46 	semid = shmget(IPC_PRIVATE, size, (IPC_CREAT|0600));
    47 	if ( semid < 0 ) {
    48 		return(NULL);
    49 	}
    50 	chunk = shmat(semid, NULL, 0);
    51 	
    52 	/* Set the segment for deletion when it is detatched */
    53 	shmctl(semid, IPC_RMID, NULL);	/* Delets semid if shmat() fails */
    54 #else
    55 	chunk = malloc(size);
    56 #endif
    57 	return((void *)chunk);
    58 }
    59 
    60 void SDL_FreeAudioMem(void *chunk)
    61 {
    62 #ifdef FORK_HACK
    63 	shmdt(chunk);
    64 #else
    65 	free(chunk);
    66 #endif
    67 }