def set_format(self, sample_rate, channels, channel_mask, bits_per_sample): """sets the output stream to the given format if the stream hasn't been initialized, this method initializes it if the stream has been initialized to a different format, this method closes and reopens the stream to the new format if the stream has been initialized to the same format, this method does nothing""" if self.__pulseaudio__ is None: # output hasn't been initialized from audiotools.output import PulseAudio AudioOutput.set_format(self, sample_rate, channels, channel_mask, bits_per_sample) self.__pulseaudio__ = PulseAudio(sample_rate, channels, bits_per_sample, "Python Audio Tools") self.__converter__ = { 8: lambda f: f.to_bytes(True, False), 16: lambda f: f.to_bytes(False, True), 24: lambda f: f.to_bytes(False, True), }[self.bits_per_sample] elif not self.compatible( sample_rate=sample_rate, channels=channels, channel_mask=channel_mask, bits_per_sample=bits_per_sample ): # output has been initialized to a different format self.close() self.set_format( sample_rate=sample_rate, channels=channels, channel_mask=channel_mask, bits_per_sample=bits_per_sample )
def set_format(self, sample_rate, channels, channel_mask, bits_per_sample): """sets the output stream to the given format if the stream hasn't been initialized, this method initializes it if the stream has been initialized to a different format, this method closes and reopens the stream to the new format if the stream has been initialized to the same format, this method does nothing""" if (self.__pulseaudio__ is None): # output hasn't been initialized from audiotools.output import PulseAudio AudioOutput.set_format(self, sample_rate, channels, channel_mask, bits_per_sample) self.__pulseaudio__ = PulseAudio(sample_rate, channels, bits_per_sample, "Python Audio Tools") self.__converter__ = { 8: lambda f: f.to_bytes(True, False), 16: lambda f: f.to_bytes(False, True), 24: lambda f: f.to_bytes(False, True) }[self.bits_per_sample] elif (not self.compatible(sample_rate=sample_rate, channels=channels, channel_mask=channel_mask, bits_per_sample=bits_per_sample)): # output has been initialized to a different format self.close() self.set_format(sample_rate=sample_rate, channels=channels, channel_mask=channel_mask, bits_per_sample=bits_per_sample)
class PulseAudioOutput(AudioOutput): """an AudioOutput subclass for PulseAudio output""" NAME = "PulseAudio" def __init__(self): self.__pulseaudio__ = None AudioOutput.__init__(self) def __getstate__(self): """gets internal state for use by Pickle module""" return "PulseAudio" def __setstate__(self, name): """sets internal state for use by Pickle module""" AudioOutput.__setstate__(self, name) self.__pulseaudio__ = None def description(self): """returns user-facing name of output device as unicode""" # FIXME - pull this from device description return u"Pulse Audio" def set_format(self, sample_rate, channels, channel_mask, bits_per_sample): """sets the output stream to the given format if the stream hasn't been initialized, this method initializes it if the stream has been initialized to a different format, this method closes and reopens the stream to the new format if the stream has been initialized to the same format, this method does nothing""" if self.__pulseaudio__ is None: # output hasn't been initialized from audiotools.output import PulseAudio AudioOutput.set_format(self, sample_rate, channels, channel_mask, bits_per_sample) self.__pulseaudio__ = PulseAudio(sample_rate, channels, bits_per_sample, "Python Audio Tools") self.__converter__ = { 8: lambda f: f.to_bytes(True, False), 16: lambda f: f.to_bytes(False, True), 24: lambda f: f.to_bytes(False, True), }[self.bits_per_sample] elif not self.compatible( sample_rate=sample_rate, channels=channels, channel_mask=channel_mask, bits_per_sample=bits_per_sample ): # output has been initialized to a different format self.close() self.set_format( sample_rate=sample_rate, channels=channels, channel_mask=channel_mask, bits_per_sample=bits_per_sample ) def play(self, framelist): """plays a FrameList""" self.__pulseaudio__.play(self.__converter__(framelist)) def pause(self): """pauses audio output, with the expectation it will be resumed""" if self.__pulseaudio__ is not None: self.__pulseaudio__.pause() def resume(self): """resumes playing paused audio output""" if self.__pulseaudio__ is not None: self.__pulseaudio__.resume() def get_volume(self): """returns a floating-point volume value between 0.0 and 1.0""" if self.__pulseaudio__ is None: self.set_format(*DEFAULT_FORMAT) return self.__pulseaudio__.get_volume() def set_volume(self, volume): """sets the output volume to a floating point value between 0.0 and 1.0""" if (volume >= 0) and (volume <= 1.0): if self.__pulseaudio__ is None: self.set_format(*DEFAULT_FORMAT) self.__pulseaudio__.set_volume(volume) else: raise ValueError("volume must be between 0.0 and 1.0") def close(self): """closes the output stream""" AudioOutput.close(self) if self.__pulseaudio__ is not None: self.__pulseaudio__.flush() self.__pulseaudio__.close() self.__pulseaudio__ = None @classmethod def available(cls): """returns True if PulseAudio is available and running on the system""" try: from audiotools.output import PulseAudio return True except ImportError: return False
class PulseAudioOutput(AudioOutput): """an AudioOutput subclass for PulseAudio output""" NAME = "PulseAudio" def __init__(self): self.__pulseaudio__ = None AudioOutput.__init__(self) def __getstate__(self): """gets internal state for use by Pickle module""" return "PulseAudio" def __setstate__(self, name): """sets internal state for use by Pickle module""" AudioOutput.__setstate__(self, name) self.__pulseaudio__ = None def description(self): """returns user-facing name of output device as unicode""" # FIXME - pull this from device description return u"Pulse Audio" def set_format(self, sample_rate, channels, channel_mask, bits_per_sample): """sets the output stream to the given format if the stream hasn't been initialized, this method initializes it if the stream has been initialized to a different format, this method closes and reopens the stream to the new format if the stream has been initialized to the same format, this method does nothing""" if (self.__pulseaudio__ is None): # output hasn't been initialized from audiotools.output import PulseAudio AudioOutput.set_format(self, sample_rate, channels, channel_mask, bits_per_sample) self.__pulseaudio__ = PulseAudio(sample_rate, channels, bits_per_sample, "Python Audio Tools") self.__converter__ = { 8: lambda f: f.to_bytes(True, False), 16: lambda f: f.to_bytes(False, True), 24: lambda f: f.to_bytes(False, True) }[self.bits_per_sample] elif (not self.compatible(sample_rate=sample_rate, channels=channels, channel_mask=channel_mask, bits_per_sample=bits_per_sample)): # output has been initialized to a different format self.close() self.set_format(sample_rate=sample_rate, channels=channels, channel_mask=channel_mask, bits_per_sample=bits_per_sample) def play(self, framelist): """plays a FrameList""" self.__pulseaudio__.play(self.__converter__(framelist)) def pause(self): """pauses audio output, with the expectation it will be resumed""" if (self.__pulseaudio__ is not None): self.__pulseaudio__.pause() def resume(self): """resumes playing paused audio output""" if (self.__pulseaudio__ is not None): self.__pulseaudio__.resume() def get_volume(self): """returns a floating-point volume value between 0.0 and 1.0""" if (self.__pulseaudio__ is None): self.set_format(*DEFAULT_FORMAT) return self.__pulseaudio__.get_volume() def set_volume(self, volume): """sets the output volume to a floating point value between 0.0 and 1.0""" if ((volume >= 0) and (volume <= 1.0)): if (self.__pulseaudio__ is None): self.set_format(*DEFAULT_FORMAT) self.__pulseaudio__.set_volume(volume) else: raise ValueError("volume must be between 0.0 and 1.0") def close(self): """closes the output stream""" AudioOutput.close(self) if (self.__pulseaudio__ is not None): self.__pulseaudio__.flush() self.__pulseaudio__.close() self.__pulseaudio__ = None @classmethod def available(cls): """returns True if PulseAudio is available and running on the system""" try: from audiotools.output import PulseAudio return True except ImportError: return False