Source code for pyunity.audio

"""
Classes to manage the playback of audio.
It uses the pygame.mixer library, and if
it cannot be initialized, then dummy
classes are made to prevent stop of program.
A variable in the ``config`` module called
``audio`` will be set to ``False`` if this
happens.

"""

from . import config
from .core import *
from .errors import *
__all__ = ["AudioClip", "AudioSource"]

import pygame
import os
import warnings
try:
    pygame.mixer.init()
except pygame.error:
    warnings.warn("Cannot load pygame mixer", PyUnityWarning)
    config.audio = False
    class AudioClip:
        def __init__(self, *args, **kwargs):
            warnings.warn(
                "Cannot use AudioClip: pygame.mixer cannot be loaded", PyUnityWarning)

        def __getattr__(self, item):
            warnings.warn(
                "Cannot use AudioClip: pygame.mixer cannot be loaded", PyUnityWarning)

        def __setattr__(self, item, value):
            warnings.warn(
                "Cannot use AudioClip: pygame.mixer cannot be loaded", PyUnityWarning)

    class AudioSource(Component):
        def __init__(self, *args, **kwargs):
            super(AudioSource, self).__init__()
            warnings.warn(
                "Cannot use AudioSource: pygame.mixer cannot be loaded", PyUnityWarning)

        def __getattr__(self, item):
            warnings.warn(
                "Cannot use AudioSource: pygame.mixer cannot be loaded", PyUnityWarning)

        def __setattr__(self, item, value):
            warnings.warn(
                "Cannot use AudioSource: pygame.mixer cannot be loaded", PyUnityWarning)
else:

[docs] class AudioClip: """ Class to store information about an audio file. Attributes ---------- file : str Name of the file sound : pygame.mixer.Sound Sound file that can be played with a ``pygame.mixer.Channel``. Only set when the AudioClip is in an ``AudioSource`` n a running scene. """ def __init__(self, file): self.SetSound(file)
[docs] def SetSound(self, file): """ Changes the audio file. Parameters ---------- file : str Name of the audio file Must be a .ogg file, which can work on any platform. Raises ------ PyUnityException If the provided file is not an OGG audio file TypeError If the provided file is not of type str """ if isinstance(file, str): if os.path.exists(file): if file.endswith(".ogg"): self.file = file if hasattr(self, "sound"): self.sound = pygame.mixer.Sound(self.file) else: raise PyUnityException( "Cannot use an audio file that is not of type OGG") else: raise PyUnityException("Cannot find file: " + file) else: raise TypeError("Argument 1: Expected str, got %r" % type(file).__name__)
[docs] class AudioSource(Component): """ Manages playback on an AudioSource. Attributes ---------- clip : AudioClip Clip to play. Best way to set the clip is to use the ``SetClip`` function. PlayOnStart : bool Whether it plays on start or not. Loop : bool Whether it loops or not. This is not fully supported. """ def __init__(self): super(AudioSource, self).__init__() self.clip = None self.PlayOnStart = True self.Loop = False
[docs] def SetClip(self, clip): """ Sets the clip to play. Parameters ---------- clip : AudioClip Clip to set Raises ------ TypeError If the provided clip is not of type AudioClip """ if not isinstance(clip, AudioClip): raise TypeError( "Argument 1: Expected AudioClip, got %r" % type(clip).__name__) self.clip = clip
[docs] def Play(self): """Plays the current clip.""" if self.clip is None: warnings.warn("AudioSource has no clip", PyUnityWarning) else: self.channel.play(self.clip.sound)
[docs] def Pause(self): """Pauses the current clip.""" if self.clip is None: warnings.warn("AudioSource has no clip", PyUnityWarning) else: self.channel.pause()
[docs] def UnPause(self): """Unpauses the current clip.""" if self.clip is None: warnings.warn("AudioSource has no clip", PyUnityWarning) else: self.channel.unpause()
[docs] def Stop(self): """Stop the current clip.""" if self.clip is None: warnings.warn("AudioSource has no clip", PyUnityWarning) else: self.channel.stop()