annotate extra_rwops.c @ 562:7e08477b0fc1

MP3 decoder upgrade work. Ripped out SMPEG and mpglib support, replaced it with "mpg123.c" and libmpg123. libmpg123 is a much better version of mpglib, so it should solve all the problems about MP3's not seeking, or most modern MP3's not playing at all, etc. Since you no longer have to make a tradeoff with SMPEG for features, and SMPEG is basically rotting, I removed it from the project. There is still work to be done with libmpg123...there are MMX, 3DNow, SSE, Altivec, etc decoders which we don't have enabled at the moment, and the build system could use some work to make this compile more cleanly, etc. Still: huge win.
author Ryan C. Gordon <icculus@icculus.org>
date Fri, 30 Jan 2009 02:44:47 -0500
parents 2e8907ff98e9
children
rev   line source
8
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1 /*
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
2 * SDL_sound -- An abstract sound format decoding API.
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
3 * Copyright (C) 2001 Ryan C. Gordon.
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
4 *
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
8 * version 2.1 of the License, or (at your option) any later version.
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
9 *
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
13 * Lesser General Public License for more details.
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
14 *
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
18 */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
19
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
20 /*
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
21 * Some extra RWops that are needed or are just handy to have.
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
22 *
552
2e8907ff98e9 Replaced references to COPYING with references to LICENSE.txt ...
Ryan C. Gordon <icculus@icculus.org>
parents: 526
diff changeset
23 * Please see the file LICENSE.txt in the source's root directory.
8
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
24 *
526
2df1f5c62d38 Updated my email address.
Ryan C. Gordon <icculus@icculus.org>
parents: 491
diff changeset
25 * This file written by Ryan C. Gordon. (icculus@icculus.org)
8
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
26 */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
27
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
28 #include <stdio.h>
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
29 #include <stdlib.h>
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
30 #include "SDL.h"
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
31
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
32
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
33 /*
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
34 * The Reference Counter RWops...
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
35 */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
36
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
37
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
38 typedef struct
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
39 {
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
40 SDL_RWops *rw; /* The actual RWops we're refcounting... */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
41 int refcount; /* The refcount; starts at 1. If goes to 0, delete. */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
42 } RWRefCounterData;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
43
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
44
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
45 /* Just pass through to the actual SDL_RWops's method... */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
46 static int refcounter_seek(SDL_RWops *rw, int offset, int whence)
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
47 {
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
48 RWRefCounterData *data = (RWRefCounterData *) rw->hidden.unknown.data1;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
49 return(data->rw->seek(data->rw, offset, whence));
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
50 } /* refcounter_seek */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
51
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
52
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
53 /* Just pass through to the actual SDL_RWops's method... */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
54 static int refcounter_read(SDL_RWops *rw, void *ptr, int size, int maxnum)
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
55 {
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
56 RWRefCounterData *data = (RWRefCounterData *) rw->hidden.unknown.data1;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
57 return(data->rw->read(data->rw, ptr, size, maxnum));
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
58 } /* refcounter_read */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
59
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
60
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
61 /* Just pass through to the actual SDL_RWops's method... */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
62 static int refcounter_write(SDL_RWops *rw, const void *ptr, int size, int num)
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
63 {
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
64 RWRefCounterData *data = (RWRefCounterData *) rw->hidden.unknown.data1;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
65 return(data->rw->write(data->rw, ptr, size, num));
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
66 } /* refcounter_write */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
67
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
68
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
69 /*
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
70 * Decrement the reference count. If there are no more references, pass
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
71 * through to the actual SDL_RWops's method, and then clean ourselves up.
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
72 */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
73 static int refcounter_close(SDL_RWops *rw)
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
74 {
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
75 int retval = 0;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
76 RWRefCounterData *data = (RWRefCounterData *) rw->hidden.unknown.data1;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
77 data->refcount--;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
78 if (data->refcount <= 0)
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
79 {
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
80 retval = data->rw->close(data->rw);
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
81 free(data);
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
82 SDL_FreeRW(rw);
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
83 } /* if */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
84
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
85 return(retval);
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
86 } /* refcounter_close */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
87
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
88
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
89 void RWops_RWRefCounter_addRef(SDL_RWops *rw)
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
90 {
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
91 RWRefCounterData *data = (RWRefCounterData *) rw->hidden.unknown.data1;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
92 data->refcount++;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
93 } /* RWops_RWRefCounter_addRef */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
94
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
95
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
96 SDL_RWops *RWops_RWRefCounter_new(SDL_RWops *rw)
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
97 {
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
98 SDL_RWops *retval = NULL;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
99
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
100 if (rw == NULL)
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
101 {
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
102 SDL_SetError("NULL argument to RWops_RWRefCounter_new().");
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
103 return(NULL);
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
104 } /* if */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
105
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
106 retval = SDL_AllocRW();
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
107 if (retval != NULL)
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
108 {
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
109 RWRefCounterData *data;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
110 data = (RWRefCounterData *) malloc(sizeof (RWRefCounterData));
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
111 if (data == NULL)
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
112 {
83
2b5ba7f33840 Stopped using SDL_OutOfMemory().
Ryan C. Gordon <icculus@icculus.org>
parents: 8
diff changeset
113 SDL_SetError("Out of memory.");
8
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
114 SDL_FreeRW(retval);
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
115 retval = NULL;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
116 } /* if */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
117 else
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
118 {
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
119 data->rw = rw;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
120 data->refcount = 1;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
121 retval->hidden.unknown.data1 = data;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
122 retval->seek = refcounter_seek;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
123 retval->read = refcounter_read;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
124 retval->write = refcounter_write;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
125 retval->close = refcounter_close;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
126 } /* else */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
127 } /* if */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
128
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
129 return(retval);
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
130 } /* RWops_RWRefCounter_new */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
131
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
132
485
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
133
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
134 /*
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
135 * RWops pooling...
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
136 */
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
137
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
138 static SDL_RWops *rwops_pool = NULL;
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
139 static SDL_mutex *rwops_pool_mutex = NULL;
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
140
491
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
141 SDL_RWops *RWops_pooled_alloc(void)
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
142 {
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
143 SDL_RWops *rw;
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
144 if (rwops_pool_mutex == NULL)
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
145 return(NULL); /* never initialized. */
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
146
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
147 SDL_LockMutex(rwops_pool_mutex);
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
148 rw = rwops_pool;
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
149 if (rw)
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
150 rwops_pool = (SDL_RWops *) (rw->hidden.unknown.data1);
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
151 SDL_UnlockMutex(rwops_pool_mutex);
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
152
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
153 if (!rw)
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
154 rw = (SDL_RWops *) malloc(sizeof (SDL_RWops));
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
155
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
156 return(rw);
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
157 } /* RWops_pooled_alloc */
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
158
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
159
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
160 void RWops_pooled_free(SDL_RWops *rw)
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
161 {
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
162 if (rwops_pool_mutex == NULL)
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
163 return; /* never initialized...why are we here? */
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
164
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
165 if (rw == NULL)
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
166 return;
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
167
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
168 SDL_LockMutex(rwops_pool_mutex);
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
169 rw->hidden.unknown.data1 = rwops_pool;
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
170 rwops_pool = rw;
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
171 SDL_UnlockMutex(rwops_pool_mutex);
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
172 } /* RWops_pooled_free */
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
173
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
174
485
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
175 int RWops_pooled_init(void)
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
176 {
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
177 const int preallocate = 50;
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
178 int i;
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
179
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
180 rwops_pool_mutex = SDL_CreateMutex();
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
181 if (rwops_pool_mutex == NULL)
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
182 return(0);
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
183
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
184 for (i = 0; i < preallocate; i++)
490
c7ab783f05d3 Patched to compile.
Ryan C. Gordon <icculus@icculus.org>
parents: 485
diff changeset
185 RWops_pooled_free(RWops_pooled_alloc());
485
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
186
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
187 return(1);
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
188 } /* RWops_pooled_init */
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
189
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
190
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
191 void RWops_pooled_deinit(void)
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
192 {
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
193 SDL_RWops *cur;
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
194 SDL_RWops *next;
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
195
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
196 if (rwops_pool_mutex == NULL)
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
197 return; /* never initialized. */
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
198
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
199 SDL_LockMutex(rwops_pool_mutex);
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
200 /* all allocated rwops must be in the pool now, or the memory leaks. */
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
201 cur = rwops_pool;
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
202 rwops_pool = NULL;
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
203 SDL_UnlockMutex(rwops_pool_mutex);
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
204 SDL_DestroyMutex(rwops_pool_mutex);
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
205 rwops_pool_mutex = NULL;
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
206
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
207 while (cur)
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
208 {
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
209 next = (SDL_RWops *) (cur->hidden.unknown.data1);
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
210 free(cur);
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
211 cur = next;
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
212 } /* while */
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
213 } /* RWops_pooled_deinit */
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
214
8
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
215 /* end of extra_rwops.c ... */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
216
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
217