annotate src/sndarray.c @ 457:c7745825439b

trunc fix
author pygame
date Mon, 12 May 2003 14:54:13 +0000
parents be89f62cdb9a
children e12ce508da5b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
372
88501955fada add initial sndarray
pygame
parents:
diff changeset
1 /*
88501955fada add initial sndarray
pygame
parents:
diff changeset
2 pygame - Python Game Library
88501955fada add initial sndarray
pygame
parents:
diff changeset
3 Copyright (C) 2000-2001 Pete Shinners
88501955fada add initial sndarray
pygame
parents:
diff changeset
4
88501955fada add initial sndarray
pygame
parents:
diff changeset
5 This library is free software; you can redistribute it and/or
88501955fada add initial sndarray
pygame
parents:
diff changeset
6 modify it under the terms of the GNU Library General Public
88501955fada add initial sndarray
pygame
parents:
diff changeset
7 License as published by the Free Software Foundation; either
88501955fada add initial sndarray
pygame
parents:
diff changeset
8 version 2 of the License, or (at your option) any later version.
88501955fada add initial sndarray
pygame
parents:
diff changeset
9
88501955fada add initial sndarray
pygame
parents:
diff changeset
10 This library is distributed in the hope that it will be useful,
88501955fada add initial sndarray
pygame
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
88501955fada add initial sndarray
pygame
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
88501955fada add initial sndarray
pygame
parents:
diff changeset
13 Library General Public License for more details.
88501955fada add initial sndarray
pygame
parents:
diff changeset
14
88501955fada add initial sndarray
pygame
parents:
diff changeset
15 You should have received a copy of the GNU Library General Public
88501955fada add initial sndarray
pygame
parents:
diff changeset
16 License along with this library; if not, write to the Free
88501955fada add initial sndarray
pygame
parents:
diff changeset
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
88501955fada add initial sndarray
pygame
parents:
diff changeset
18
88501955fada add initial sndarray
pygame
parents:
diff changeset
19 Pete Shinners
88501955fada add initial sndarray
pygame
parents:
diff changeset
20 pete@shinners.org
88501955fada add initial sndarray
pygame
parents:
diff changeset
21 */
88501955fada add initial sndarray
pygame
parents:
diff changeset
22
88501955fada add initial sndarray
pygame
parents:
diff changeset
23 #include"pygame.h"
88501955fada add initial sndarray
pygame
parents:
diff changeset
24 #include"mixer.h"
88501955fada add initial sndarray
pygame
parents:
diff changeset
25 #include<Numeric/arrayobject.h>
88501955fada add initial sndarray
pygame
parents:
diff changeset
26 #include<SDL_byteorder.h>
88501955fada add initial sndarray
pygame
parents:
diff changeset
27
88501955fada add initial sndarray
pygame
parents:
diff changeset
28
88501955fada add initial sndarray
pygame
parents:
diff changeset
29
88501955fada add initial sndarray
pygame
parents:
diff changeset
30
88501955fada add initial sndarray
pygame
parents:
diff changeset
31 /*DOC*/ static char doc_samples[] =
88501955fada add initial sndarray
pygame
parents:
diff changeset
32 /*DOC*/ "pygame.sndarray.samples(Surface) -> Array\n"
88501955fada add initial sndarray
pygame
parents:
diff changeset
33 /*DOC*/ "get a reference to the sound samples\n"
88501955fada add initial sndarray
pygame
parents:
diff changeset
34 /*DOC*/ "\n"
88501955fada add initial sndarray
pygame
parents:
diff changeset
35 /*DOC*/ "This will return an array that directly references the samples\n"
88501955fada add initial sndarray
pygame
parents:
diff changeset
36 /*DOC*/ "in the array.\n"
88501955fada add initial sndarray
pygame
parents:
diff changeset
37 /*DOC*/ ;
88501955fada add initial sndarray
pygame
parents:
diff changeset
38
88501955fada add initial sndarray
pygame
parents:
diff changeset
39 static PyObject* sndarray_samples(PyObject* self, PyObject* arg)
88501955fada add initial sndarray
pygame
parents:
diff changeset
40 {
88501955fada add initial sndarray
pygame
parents:
diff changeset
41 int dim[2], numdims, type, formatbytes;
88501955fada add initial sndarray
pygame
parents:
diff changeset
42 PyObject *array, *chunkobj;
88501955fada add initial sndarray
pygame
parents:
diff changeset
43 Mix_Chunk* chunk;
88501955fada add initial sndarray
pygame
parents:
diff changeset
44 Uint16 format;
88501955fada add initial sndarray
pygame
parents:
diff changeset
45 int numchannels;
88501955fada add initial sndarray
pygame
parents:
diff changeset
46
88501955fada add initial sndarray
pygame
parents:
diff changeset
47 if(!PyArg_ParseTuple(arg, "O!", &PySound_Type, &chunkobj))
88501955fada add initial sndarray
pygame
parents:
diff changeset
48 return NULL;
88501955fada add initial sndarray
pygame
parents:
diff changeset
49 chunk = PySound_AsChunk(chunkobj);
88501955fada add initial sndarray
pygame
parents:
diff changeset
50
88501955fada add initial sndarray
pygame
parents:
diff changeset
51 if(!Mix_QuerySpec(NULL, &format, &numchannels))
88501955fada add initial sndarray
pygame
parents:
diff changeset
52 return RAISE(PyExc_SDLError, "Mixer not initialized");
88501955fada add initial sndarray
pygame
parents:
diff changeset
53
88501955fada add initial sndarray
pygame
parents:
diff changeset
54 formatbytes = (abs(format)&0xff)/8;
88501955fada add initial sndarray
pygame
parents:
diff changeset
55 if(format == AUDIO_S8)
88501955fada add initial sndarray
pygame
parents:
diff changeset
56 type = PyArray_CHAR;
88501955fada add initial sndarray
pygame
parents:
diff changeset
57 else if(format == AUDIO_U8)
88501955fada add initial sndarray
pygame
parents:
diff changeset
58 type = PyArray_UBYTE;
88501955fada add initial sndarray
pygame
parents:
diff changeset
59 else if(formatbytes == 2)
88501955fada add initial sndarray
pygame
parents:
diff changeset
60 type = PyArray_SHORT;
88501955fada add initial sndarray
pygame
parents:
diff changeset
61 else
88501955fada add initial sndarray
pygame
parents:
diff changeset
62 return RAISE(PyExc_TypeError, "Unpresentable audio format");
88501955fada add initial sndarray
pygame
parents:
diff changeset
63
88501955fada add initial sndarray
pygame
parents:
diff changeset
64 numdims = (numchannels>1)?2:1;
88501955fada add initial sndarray
pygame
parents:
diff changeset
65 dim[0] = chunk->alen / (formatbytes*numchannels);
88501955fada add initial sndarray
pygame
parents:
diff changeset
66 dim[1] = numchannels;
88501955fada add initial sndarray
pygame
parents:
diff changeset
67
88501955fada add initial sndarray
pygame
parents:
diff changeset
68 array = PyArray_FromDimsAndData(numdims, dim, type, chunk->abuf);
88501955fada add initial sndarray
pygame
parents:
diff changeset
69 if(array)
88501955fada add initial sndarray
pygame
parents:
diff changeset
70 {
88501955fada add initial sndarray
pygame
parents:
diff changeset
71 Py_INCREF(chunkobj);
88501955fada add initial sndarray
pygame
parents:
diff changeset
72 ((PyArrayObject*)array)->base = chunkobj;
88501955fada add initial sndarray
pygame
parents:
diff changeset
73 ((PyArrayObject*)array)->flags |= SAVESPACE;
88501955fada add initial sndarray
pygame
parents:
diff changeset
74 }
88501955fada add initial sndarray
pygame
parents:
diff changeset
75 return array;
88501955fada add initial sndarray
pygame
parents:
diff changeset
76 }
88501955fada add initial sndarray
pygame
parents:
diff changeset
77
88501955fada add initial sndarray
pygame
parents:
diff changeset
78 /*DOC*/ static char doc_array[] =
88501955fada add initial sndarray
pygame
parents:
diff changeset
79 /*DOC*/ "pygame.sndarray.array(Sound) -> Array\n"
88501955fada add initial sndarray
pygame
parents:
diff changeset
80 /*DOC*/ "get an array copied from a sound\n"
88501955fada add initial sndarray
pygame
parents:
diff changeset
81 /*DOC*/ "\n"
88501955fada add initial sndarray
pygame
parents:
diff changeset
82 /*DOC*/ "Creates an array with a copy of the sound data.\n"
88501955fada add initial sndarray
pygame
parents:
diff changeset
83 /*DOC*/ ;
88501955fada add initial sndarray
pygame
parents:
diff changeset
84
88501955fada add initial sndarray
pygame
parents:
diff changeset
85 PyObject* sndarray_array(PyObject* self, PyObject* arg)
88501955fada add initial sndarray
pygame
parents:
diff changeset
86 {
88501955fada add initial sndarray
pygame
parents:
diff changeset
87 PyObject *array, *arraycopy=NULL;
88501955fada add initial sndarray
pygame
parents:
diff changeset
88
88501955fada add initial sndarray
pygame
parents:
diff changeset
89 /*we'll let numeric do the copying for us*/
88501955fada add initial sndarray
pygame
parents:
diff changeset
90 array = sndarray_samples(self, arg);
88501955fada add initial sndarray
pygame
parents:
diff changeset
91 if(array)
88501955fada add initial sndarray
pygame
parents:
diff changeset
92 {
373
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
93 arraycopy = PyArray_Copy((PyArrayObject*)array);
372
88501955fada add initial sndarray
pygame
parents:
diff changeset
94 Py_DECREF(array);
88501955fada add initial sndarray
pygame
parents:
diff changeset
95 }
88501955fada add initial sndarray
pygame
parents:
diff changeset
96 return arraycopy;
88501955fada add initial sndarray
pygame
parents:
diff changeset
97 }
88501955fada add initial sndarray
pygame
parents:
diff changeset
98
88501955fada add initial sndarray
pygame
parents:
diff changeset
99
88501955fada add initial sndarray
pygame
parents:
diff changeset
100 /*DOC*/ static char doc_make_sound[] =
88501955fada add initial sndarray
pygame
parents:
diff changeset
101 /*DOC*/ "pygame.sndarray.make_sound(array) -> Sound\n"
88501955fada add initial sndarray
pygame
parents:
diff changeset
102 /*DOC*/ "create a new Sound object from array data\n"
88501955fada add initial sndarray
pygame
parents:
diff changeset
103 /*DOC*/ "\n"
88501955fada add initial sndarray
pygame
parents:
diff changeset
104 /*DOC*/ "Create a new playable Sound object from array data\n"
88501955fada add initial sndarray
pygame
parents:
diff changeset
105 /*DOC*/ "the Sound will be a copy of the array samples.\n"
88501955fada add initial sndarray
pygame
parents:
diff changeset
106 /*DOC*/ "\n"
373
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
107 /*DOC*/ "The array must be 1-dimensional for mono sound, and.\n"
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
108 /*DOC*/ "2-dimensional for stereo.\n"
372
88501955fada add initial sndarray
pygame
parents:
diff changeset
109 /*DOC*/ ;
88501955fada add initial sndarray
pygame
parents:
diff changeset
110
88501955fada add initial sndarray
pygame
parents:
diff changeset
111 PyObject* sndarray_make_sound(PyObject* self, PyObject* arg)
88501955fada add initial sndarray
pygame
parents:
diff changeset
112 {
88501955fada add initial sndarray
pygame
parents:
diff changeset
113 PyObject *arrayobj;
88501955fada add initial sndarray
pygame
parents:
diff changeset
114 PyArrayObject *array;
88501955fada add initial sndarray
pygame
parents:
diff changeset
115 Mix_Chunk *chunk;
88501955fada add initial sndarray
pygame
parents:
diff changeset
116 Uint16 format;
374
cf628b75b7fe win32 warning cleanups
pygame
parents: 373
diff changeset
117 int numchannels, mixerbytes;
448
be89f62cdb9a compiler warning cleanup
pygame
parents: 374
diff changeset
118 int loop1, loop2, step1, step2, length, length2=0;
372
88501955fada add initial sndarray
pygame
parents:
diff changeset
119 Uint8 *src, *dst;
88501955fada add initial sndarray
pygame
parents:
diff changeset
120
88501955fada add initial sndarray
pygame
parents:
diff changeset
121 if(!PyArg_ParseTuple(arg, "O!", &PyArray_Type, &arrayobj))
88501955fada add initial sndarray
pygame
parents:
diff changeset
122 return NULL;
88501955fada add initial sndarray
pygame
parents:
diff changeset
123 array = (PyArrayObject*)arrayobj;
88501955fada add initial sndarray
pygame
parents:
diff changeset
124
88501955fada add initial sndarray
pygame
parents:
diff changeset
125 if(!Mix_QuerySpec(NULL, &format, &numchannels))
88501955fada add initial sndarray
pygame
parents:
diff changeset
126 return RAISE(PyExc_SDLError, "Mixer not initialized");
373
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
127 if(array->descr->type_num > PyArray_LONG)
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
128 return RAISE(PyExc_ValueError, "Invalid array datatype for sound");
372
88501955fada add initial sndarray
pygame
parents:
diff changeset
129
88501955fada add initial sndarray
pygame
parents:
diff changeset
130 if(format==AUDIO_S8 || format==AUDIO_U8)
373
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
131 mixerbytes = 1;
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
132 else
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
133 mixerbytes = 2;
372
88501955fada add initial sndarray
pygame
parents:
diff changeset
134
88501955fada add initial sndarray
pygame
parents:
diff changeset
135 /*test array dimensions*/
88501955fada add initial sndarray
pygame
parents:
diff changeset
136 if(numchannels==1)
88501955fada add initial sndarray
pygame
parents:
diff changeset
137 {
88501955fada add initial sndarray
pygame
parents:
diff changeset
138 if(array->nd != 1)
88501955fada add initial sndarray
pygame
parents:
diff changeset
139 return RAISE(PyExc_ValueError, "Array must be 1-dimensional for mono mixer");
88501955fada add initial sndarray
pygame
parents:
diff changeset
140 }
88501955fada add initial sndarray
pygame
parents:
diff changeset
141 else
88501955fada add initial sndarray
pygame
parents:
diff changeset
142 {
88501955fada add initial sndarray
pygame
parents:
diff changeset
143 if(array->nd != 2)
88501955fada add initial sndarray
pygame
parents:
diff changeset
144 return RAISE(PyExc_ValueError, "Array must be 2-dimensional for stereo mixer");
88501955fada add initial sndarray
pygame
parents:
diff changeset
145 if(array->dimensions[1] != numchannels)
88501955fada add initial sndarray
pygame
parents:
diff changeset
146 return RAISE(PyExc_ValueError, "Array depth must match number of mixer channels");
88501955fada add initial sndarray
pygame
parents:
diff changeset
147 }
373
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
148 length = array->dimensions[0];
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
149 if(array->nd == 2)
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
150 length2 = array->dimensions[1];
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
151
372
88501955fada add initial sndarray
pygame
parents:
diff changeset
152 /*create chunk, we are screwed if SDL_mixer ever does more than malloc/free*/
88501955fada add initial sndarray
pygame
parents:
diff changeset
153 chunk = (Mix_Chunk *)malloc(sizeof(Mix_Chunk));
88501955fada add initial sndarray
pygame
parents:
diff changeset
154 if ( chunk == NULL )
88501955fada add initial sndarray
pygame
parents:
diff changeset
155 return RAISE(PyExc_MemoryError, "Cannot allocate chunk\n");
88501955fada add initial sndarray
pygame
parents:
diff changeset
156 /*let's hope Mix_Chunk never changes also*/
373
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
157 chunk->alen = mixerbytes * length * numchannels;
372
88501955fada add initial sndarray
pygame
parents:
diff changeset
158 chunk->abuf = (Uint8*)malloc(chunk->alen);
88501955fada add initial sndarray
pygame
parents:
diff changeset
159 chunk->allocated = 1;
88501955fada add initial sndarray
pygame
parents:
diff changeset
160 chunk->volume = 128;
373
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
161
372
88501955fada add initial sndarray
pygame
parents:
diff changeset
162 if(array->nd == 1)
88501955fada add initial sndarray
pygame
parents:
diff changeset
163 {
88501955fada add initial sndarray
pygame
parents:
diff changeset
164 step1 = array->strides[0];
88501955fada add initial sndarray
pygame
parents:
diff changeset
165 src = (Uint8*)array->data;
88501955fada add initial sndarray
pygame
parents:
diff changeset
166 dst = (Uint8*)chunk->abuf;
373
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
167 if(mixerbytes == 1)
372
88501955fada add initial sndarray
pygame
parents:
diff changeset
168 {
373
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
169 switch(array->descr->elsize)
372
88501955fada add initial sndarray
pygame
parents:
diff changeset
170 {
373
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
171 case 1:
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
172 for(loop1=0; loop1<length; loop1++, dst+=1, src+=step1)
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
173 *(Uint8*)dst = (Uint8)*((Uint8*)src);
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
174 break;
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
175 case 2:
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
176 for(loop1=0; loop1<length; loop1++, dst+=1, src+=step1)
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
177 *(Uint8*)dst = (Uint8)*((Uint16*)src);
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
178 break;
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
179 case 4:
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
180 for(loop1=0; loop1<length; loop1++, dst+=1, src+=step1)
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
181 *(Uint8*)dst = (Uint8)*((Uint32*)src);
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
182 break;
372
88501955fada add initial sndarray
pygame
parents:
diff changeset
183 }
88501955fada add initial sndarray
pygame
parents:
diff changeset
184 }
88501955fada add initial sndarray
pygame
parents:
diff changeset
185 else
88501955fada add initial sndarray
pygame
parents:
diff changeset
186 {
373
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
187 switch(array->descr->elsize)
372
88501955fada add initial sndarray
pygame
parents:
diff changeset
188 {
373
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
189 case 1:
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
190 for(loop1=0; loop1<length; loop1++, dst+=2, src+=step1)
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
191 *(Uint16*)dst = (Uint16)((*((Uint8*)src))<<8);
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
192 break;
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
193 case 2:
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
194 for(loop1=0; loop1<length; loop1++, dst+=2, src+=step1)
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
195 *(Uint16*)dst = (Uint16)*((Uint16*)src);
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
196 break;
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
197 case 4:
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
198 for(loop1=0; loop1<length; loop1++, dst+=2, src+=step1)
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
199 *(Uint16*)dst = (Uint16)*((Uint32*)src);
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
200 break;
372
88501955fada add initial sndarray
pygame
parents:
diff changeset
201 }
88501955fada add initial sndarray
pygame
parents:
diff changeset
202 }
88501955fada add initial sndarray
pygame
parents:
diff changeset
203 }
88501955fada add initial sndarray
pygame
parents:
diff changeset
204 else
88501955fada add initial sndarray
pygame
parents:
diff changeset
205 {
88501955fada add initial sndarray
pygame
parents:
diff changeset
206 step1 = array->strides[0];
88501955fada add initial sndarray
pygame
parents:
diff changeset
207 step2 = array->strides[1];
88501955fada add initial sndarray
pygame
parents:
diff changeset
208 dst = (Uint8*)chunk->abuf;
373
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
209 if(mixerbytes == 1)
372
88501955fada add initial sndarray
pygame
parents:
diff changeset
210 {
373
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
211 for(loop1=0; loop1<length; loop1++)
372
88501955fada add initial sndarray
pygame
parents:
diff changeset
212 {
88501955fada add initial sndarray
pygame
parents:
diff changeset
213 src = (Uint8*)array->data + loop1*step1;
373
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
214 switch(array->descr->elsize)
372
88501955fada add initial sndarray
pygame
parents:
diff changeset
215 {
373
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
216 case 1:
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
217 for(loop2=0; loop2<length2; loop1++, dst+=1, src+=step2)
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
218 *(Uint8*)dst = (Uint8)*((Uint8*)src);
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
219 break;
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
220 case 2:
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
221 for(loop1=0; loop1<length; loop1++, dst+=1, src+=step2)
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
222 *(Uint8*)dst = (Uint8)*((Uint16*)src);
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
223 break;
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
224 case 4:
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
225 for(loop1=0; loop1<length; loop1++, dst+=1, src+=step2)
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
226 *(Uint8*)dst = (Uint8)*((Uint32*)src);
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
227 break;
372
88501955fada add initial sndarray
pygame
parents:
diff changeset
228 }
88501955fada add initial sndarray
pygame
parents:
diff changeset
229 }
88501955fada add initial sndarray
pygame
parents:
diff changeset
230 }
88501955fada add initial sndarray
pygame
parents:
diff changeset
231 else
88501955fada add initial sndarray
pygame
parents:
diff changeset
232 {
373
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
233 for(loop1 = 0; loop1 < length; loop1++)
372
88501955fada add initial sndarray
pygame
parents:
diff changeset
234 {
88501955fada add initial sndarray
pygame
parents:
diff changeset
235 src = (Uint8*)array->data + loop1*step1;
373
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
236 switch(array->descr->elsize)
372
88501955fada add initial sndarray
pygame
parents:
diff changeset
237 {
373
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
238 case 1:
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
239 for(loop2=0; loop2<length2; loop1++, dst+=1, src+=step2)
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
240 *(Uint16*)dst = (Uint16)(*((Uint8*)src)<<8);
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
241 break;
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
242 case 2:
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
243 for(loop1=0; loop1<length; loop1++, dst+=1, src+=step2)
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
244 *(Uint16*)dst = (Uint16)*((Uint16*)src);
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
245 break;
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
246 case 4:
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
247 for(loop1=0; loop1<length; loop1++, dst+=1, src+=step2)
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
248 *(Uint16*)dst = (Uint16)*((Uint32*)src);
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
249 break;
372
88501955fada add initial sndarray
pygame
parents:
diff changeset
250 }
88501955fada add initial sndarray
pygame
parents:
diff changeset
251 }
88501955fada add initial sndarray
pygame
parents:
diff changeset
252 }
88501955fada add initial sndarray
pygame
parents:
diff changeset
253 }
373
68a41ca8b17c array and sound work
pygame
parents: 372
diff changeset
254
372
88501955fada add initial sndarray
pygame
parents:
diff changeset
255 return PySound_New(chunk);
88501955fada add initial sndarray
pygame
parents:
diff changeset
256 }
88501955fada add initial sndarray
pygame
parents:
diff changeset
257
88501955fada add initial sndarray
pygame
parents:
diff changeset
258
88501955fada add initial sndarray
pygame
parents:
diff changeset
259
88501955fada add initial sndarray
pygame
parents:
diff changeset
260 static PyMethodDef sndarray_builtins[] =
88501955fada add initial sndarray
pygame
parents:
diff changeset
261 {
88501955fada add initial sndarray
pygame
parents:
diff changeset
262 { "samples", sndarray_samples, 1, doc_samples },
88501955fada add initial sndarray
pygame
parents:
diff changeset
263 { "array", sndarray_array, 1, doc_array },
88501955fada add initial sndarray
pygame
parents:
diff changeset
264 { "make_sound", sndarray_make_sound, 1, doc_make_sound },
88501955fada add initial sndarray
pygame
parents:
diff changeset
265
88501955fada add initial sndarray
pygame
parents:
diff changeset
266 { NULL, NULL }
88501955fada add initial sndarray
pygame
parents:
diff changeset
267 };
88501955fada add initial sndarray
pygame
parents:
diff changeset
268
88501955fada add initial sndarray
pygame
parents:
diff changeset
269
88501955fada add initial sndarray
pygame
parents:
diff changeset
270
88501955fada add initial sndarray
pygame
parents:
diff changeset
271
88501955fada add initial sndarray
pygame
parents:
diff changeset
272
88501955fada add initial sndarray
pygame
parents:
diff changeset
273 /*DOC*/ static char doc_pygame_sndarray_MODULE[] =
88501955fada add initial sndarray
pygame
parents:
diff changeset
274 /*DOC*/ "Contains routines for mixing numeric arrays with\n"
88501955fada add initial sndarray
pygame
parents:
diff changeset
275 /*DOC*/ "sounds\n"
88501955fada add initial sndarray
pygame
parents:
diff changeset
276 /*DOC*/ ;
88501955fada add initial sndarray
pygame
parents:
diff changeset
277
88501955fada add initial sndarray
pygame
parents:
diff changeset
278 PYGAME_EXPORT
88501955fada add initial sndarray
pygame
parents:
diff changeset
279 void initsndarray(void)
88501955fada add initial sndarray
pygame
parents:
diff changeset
280 {
88501955fada add initial sndarray
pygame
parents:
diff changeset
281 PyObject *module, *dict;
88501955fada add initial sndarray
pygame
parents:
diff changeset
282
88501955fada add initial sndarray
pygame
parents:
diff changeset
283 /* create the module */
88501955fada add initial sndarray
pygame
parents:
diff changeset
284 module = Py_InitModule3("sndarray", sndarray_builtins, doc_pygame_sndarray_MODULE);
88501955fada add initial sndarray
pygame
parents:
diff changeset
285 dict = PyModule_GetDict(module);
88501955fada add initial sndarray
pygame
parents:
diff changeset
286
88501955fada add initial sndarray
pygame
parents:
diff changeset
287 /*imported needed apis*/
88501955fada add initial sndarray
pygame
parents:
diff changeset
288 import_pygame_base();
88501955fada add initial sndarray
pygame
parents:
diff changeset
289 import_pygame_mixer();
88501955fada add initial sndarray
pygame
parents:
diff changeset
290 import_array();
88501955fada add initial sndarray
pygame
parents:
diff changeset
291 }
88501955fada add initial sndarray
pygame
parents:
diff changeset
292
88501955fada add initial sndarray
pygame
parents:
diff changeset
293
88501955fada add initial sndarray
pygame
parents:
diff changeset
294