Mercurial > SDL_sound_CoreAudio
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 | 1 /* |
2 * SDL_sound -- An abstract sound format decoding API. | |
3 * Copyright (C) 2001 Ryan C. Gordon. | |
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 */ | |
19 | |
20 /* | |
21 * Some extra RWops that are needed or are just handy to have. | |
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 | 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 | 26 */ |
27 | |
28 #include <stdio.h> | |
29 #include <stdlib.h> | |
30 #include "SDL.h" | |
31 | |
32 | |
33 /* | |
34 * The Reference Counter RWops... | |
35 */ | |
36 | |
37 | |
38 typedef struct | |
39 { | |
40 SDL_RWops *rw; /* The actual RWops we're refcounting... */ | |
41 int refcount; /* The refcount; starts at 1. If goes to 0, delete. */ | |
42 } RWRefCounterData; | |
43 | |
44 | |
45 /* Just pass through to the actual SDL_RWops's method... */ | |
46 static int refcounter_seek(SDL_RWops *rw, int offset, int whence) | |
47 { | |
48 RWRefCounterData *data = (RWRefCounterData *) rw->hidden.unknown.data1; | |
49 return(data->rw->seek(data->rw, offset, whence)); | |
50 } /* refcounter_seek */ | |
51 | |
52 | |
53 /* Just pass through to the actual SDL_RWops's method... */ | |
54 static int refcounter_read(SDL_RWops *rw, void *ptr, int size, int maxnum) | |
55 { | |
56 RWRefCounterData *data = (RWRefCounterData *) rw->hidden.unknown.data1; | |
57 return(data->rw->read(data->rw, ptr, size, maxnum)); | |
58 } /* refcounter_read */ | |
59 | |
60 | |
61 /* Just pass through to the actual SDL_RWops's method... */ | |
62 static int refcounter_write(SDL_RWops *rw, const void *ptr, int size, int num) | |
63 { | |
64 RWRefCounterData *data = (RWRefCounterData *) rw->hidden.unknown.data1; | |
65 return(data->rw->write(data->rw, ptr, size, num)); | |
66 } /* refcounter_write */ | |
67 | |
68 | |
69 /* | |
70 * Decrement the reference count. If there are no more references, pass | |
71 * through to the actual SDL_RWops's method, and then clean ourselves up. | |
72 */ | |
73 static int refcounter_close(SDL_RWops *rw) | |
74 { | |
75 int retval = 0; | |
76 RWRefCounterData *data = (RWRefCounterData *) rw->hidden.unknown.data1; | |
77 data->refcount--; | |
78 if (data->refcount <= 0) | |
79 { | |
80 retval = data->rw->close(data->rw); | |
81 free(data); | |
82 SDL_FreeRW(rw); | |
83 } /* if */ | |
84 | |
85 return(retval); | |
86 } /* refcounter_close */ | |
87 | |
88 | |
89 void RWops_RWRefCounter_addRef(SDL_RWops *rw) | |
90 { | |
91 RWRefCounterData *data = (RWRefCounterData *) rw->hidden.unknown.data1; | |
92 data->refcount++; | |
93 } /* RWops_RWRefCounter_addRef */ | |
94 | |
95 | |
96 SDL_RWops *RWops_RWRefCounter_new(SDL_RWops *rw) | |
97 { | |
98 SDL_RWops *retval = NULL; | |
99 | |
100 if (rw == NULL) | |
101 { | |
102 SDL_SetError("NULL argument to RWops_RWRefCounter_new()."); | |
103 return(NULL); | |
104 } /* if */ | |
105 | |
106 retval = SDL_AllocRW(); | |
107 if (retval != NULL) | |
108 { | |
109 RWRefCounterData *data; | |
110 data = (RWRefCounterData *) malloc(sizeof (RWRefCounterData)); | |
111 if (data == NULL) | |
112 { | |
83
2b5ba7f33840
Stopped using SDL_OutOfMemory().
Ryan C. Gordon <icculus@icculus.org>
parents:
8
diff
changeset
|
113 SDL_SetError("Out of memory."); |
8 | 114 SDL_FreeRW(retval); |
115 retval = NULL; | |
116 } /* if */ | |
117 else | |
118 { | |
119 data->rw = rw; | |
120 data->refcount = 1; | |
121 retval->hidden.unknown.data1 = data; | |
122 retval->seek = refcounter_seek; | |
123 retval->read = refcounter_read; | |
124 retval->write = refcounter_write; | |
125 retval->close = refcounter_close; | |
126 } /* else */ | |
127 } /* if */ | |
128 | |
129 return(retval); | |
130 } /* RWops_RWRefCounter_new */ | |
131 | |
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 | 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 | 215 /* end of extra_rwops.c ... */ |
216 | |
217 |