Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/pygame/sndarray.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/pygame/sndarray.py')
-rw-r--r--src/pygame/sndarray.py187
1 files changed, 187 insertions, 0 deletions
diff --git a/src/pygame/sndarray.py b/src/pygame/sndarray.py
new file mode 100644
index 0000000..90a1142
--- /dev/null
+++ b/src/pygame/sndarray.py
@@ -0,0 +1,187 @@
+## pygame - Python Game Library
+## Copyright (C) 2008 Marcus von Appen
+##
+## This library is free software; you can redistribute it and/or
+## modify it under the terms of the GNU Library General Public
+## License as published by the Free Software Foundation; either
+## version 2 of the License, or (at your option) any later version.
+##
+## This library is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## Library General Public License for more details.
+##
+## You should have received a copy of the GNU Library General Public
+## License along with this library; if not, write to the Free
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##
+## Marcus von Appen
+## mva@sysfault.org
+
+"""pygame module for accessing sound sample data
+
+Functions to convert between Numeric or numpy arrays and Sound
+objects. This module will only be available when pygame can use the
+external numpy or Numeric package.
+
+Sound data is made of thousands of samples per second, and each sample
+is the amplitude of the wave at a particular moment in time. For
+example, in 22-kHz format, element number 5 of the array is the
+amplitude of the wave after 5/22000 seconds.
+
+Each sample is an 8-bit or 16-bit integer, depending on the data format.
+A stereo sound file has two values per sample, while a mono sound file
+only has one.
+
+Supported array systems are
+
+ numpy
+ numeric
+
+The default will be numpy, if installed. Otherwise, Numeric will be set
+as default if installed. If neither numpy nor Numeric are installed, the
+module will raise an ImportError.
+
+The array type to use can be changed at runtime using the use_arraytype()
+method, which requires one of the above types as string.
+
+Note: numpy and Numeric are not completely compatible. Certain array
+manipulations, which work for one type, might behave differently or even
+completely break for the other.
+
+Additionally, in contrast to Numeric numpy can use unsigned 16-bit
+integers. Sounds with 16-bit data will be treated as unsigned integers,
+if the sound sample type requests this. Numeric instead always uses
+signed integers for the representation, which is important to keep in
+mind, if you use the module's functions and wonder about the values.
+"""
+
+import pygame
+
+# Global array type setting. See use_arraytype().
+__arraytype = None
+
+# Try to import the necessary modules.
+try:
+ import pygame._numpysndarray as numpysnd
+ __hasnumpy = True
+ __arraytype = "numpy"
+except ImportError:
+ __hasnumpy = False
+
+try:
+ import pygame._numericsndarray as numericsnd
+ __hasnumeric = True
+ if not __hasnumpy:
+ __arraytype = "numeric"
+except ImportError:
+ __hasnumeric = False
+
+if not __hasnumpy and not __hasnumeric:
+ raise ImportError("no module named numpy or Numeric found")
+
+def array (sound):
+ """pygame.sndarray.array(Sound): return array
+
+ Copy Sound samples into an array.
+
+ Creates a new array for the sound data and copies the samples. The
+ array will always be in the format returned from
+ pygame.mixer.get_init().
+ """
+ if __arraytype == "numeric":
+ return numericsnd.array (sound)
+ elif __arraytype == "numpy":
+ return numpysnd.array (sound)
+ raise NotImplementedError("sound arrays are not supported")
+
+def samples (sound):
+ """pygame.sndarray.samples(Sound): return array
+
+ Reference Sound samples into an array.
+
+ Creates a new array that directly references the samples in a Sound
+ object. Modifying the array will change the Sound. The array will
+ always be in the format returned from pygame.mixer.get_init().
+ """
+ if __arraytype == "numeric":
+ return numericsnd.samples (sound)
+ elif __arraytype == "numpy":
+ return numpysnd.samples (sound)
+ raise NotImplementedError("sound arrays are not supported")
+
+def make_sound (array):
+ """pygame.sndarray.make_sound(array): return Sound
+
+ Convert an array into a Sound object.
+
+ Create a new playable Sound object from an array. The mixer module
+ must be initialized and the array format must be similar to the mixer
+ audio format.
+ """
+ if __arraytype == "numeric":
+ return numericsnd.make_sound (array)
+ elif __arraytype == "numpy":
+ return numpysnd.make_sound (array)
+ raise NotImplementedError("sound arrays are not supported")
+
+def use_arraytype (arraytype):
+ """pygame.sndarray.use_arraytype (arraytype): return None
+
+ Sets the array system to be used for sound arrays.
+
+ Uses the requested array type for the module functions.
+ Currently supported array types are:
+
+ numeric
+ numpy
+
+ If the requested type is not available, a ValueError will be raised.
+ """
+ global __arraytype
+
+ arraytype = arraytype.lower ()
+ if arraytype == "numeric":
+ if __hasnumeric:
+ __arraytype = arraytype
+ else:
+ raise ValueError("Numeric arrays are not available")
+
+ elif arraytype == "numpy":
+ if __hasnumpy:
+ __arraytype = arraytype
+ else:
+ raise ValueError("numpy arrays are not available")
+ else:
+ raise ValueError("invalid array type")
+
+def get_arraytype ():
+ """pygame.sndarray.get_arraytype (): return str
+
+ Gets the currently active array type.
+
+ Returns the currently active array type. This will be a value of the
+ get_arraytypes() tuple and indicates which type of array module is
+ used for the array creation.
+ """
+ return __arraytype
+
+def get_arraytypes ():
+ """pygame.sndarray.get_arraytypes (): return tuple
+
+ Gets the array system types currently supported.
+
+ Checks, which array system types are available and returns them as a
+ tuple of strings. The values of the tuple can be used directly in
+ the use_arraytype () method.
+
+ If no supported array system could be found, None will be returned.
+ """
+ vals = []
+ if __hasnumeric:
+ vals.append ("numeric")
+ if __hasnumpy:
+ vals.append ("numpy")
+ if len (vals) == 0:
+ return None
+ return tuple (vals)