# Soundstreams for Audiere package Audio::Audiere::Stream; # (C) by Tels use strict; require Exporter; use vars qw/@ISA $VERSION/; @ISA = qw/Exporter/; $VERSION = '0.02'; use Audio::Audiere::Error; ############################################################################## # protected vars # each 3D sound stream will get a unique ID { my $id = 1; sub ID { return $id++;} } ############################################################################## # constructors sub _check_file { my ($self, $file) = @_; if (!-e $file) { return Audio::Audiere::Error->new( "Could not create stream from '$_[1]': No such file."); } if (!-f $file) { return Audio::Audiere::Error->new( "Could not create stream from '$_[1]': Not a file."); } undef; # okay } sub new { # create a new audio stream from file or memory my $class = shift; my ($dev, $file, $buffering) = @_; my $self = bless { }, $class; my $rc = $self->_check_file($file); return $rc if $rc; # error? so return it! $self->{_dev} = $dev; $self->{_stream} = _open($dev->_device(), $file, $buffering); if (!$self->{_stream}) { return Audio::Audiere::Error->new( "Unknown error. Could not create stream from '$_[1]'."); } $self->{_id} = ID(); # get a new ID $self->{_muted} = 0; # unmuted $self->{_vol} = 1; $self->{_master} = $dev->getMasterVolume(); $self->setVolume($self->{_vol}); # force master volume update $self; } sub tone { # create a new audio stream of a tone with a certain frequenzy my $class = shift; my ($dev,$freq) = @_; my $self = bless { }, $class; $self->{_dev} = $dev; $self->{_stream} = _tone($dev->_device(),$freq); if (!$self->{_stream}) { return Audio::Audiere::Error->new( "Unknown error. Could not create stream with tone of frequenzy '$_[0]'."); } $self->{_id} = ID(); # get a new ID $self->{_muted} = 0; # unmuted $self->{_vol} = 1; $self->{_master} = $dev->getMasterVolume(); $self->setVolume($self->{_vol}); # force master volume update $self; } sub square_wave { # create a new audio stream of a square_wave tone with a certain frequenzy my $class = shift; my ($dev,$freq) = @_; my $self = bless { }, $class; $self->{_dev} = $dev; $self->{_stream} = _square_wave($dev->_device(),$freq); if (!$self->{_stream}) { return Audio::Audiere::Error->new( "Unknown error. Could not create stream with square wave with frequenzy '$_[0]'."); } $self->{_id} = ID(); # get a new ID $self->{_muted} = 0; # unmuted $self->{_vol} = 1; $self->{_master} = $dev->getMasterVolume(); $self->setVolume($self->{_vol}); # force master volume update $self; } sub white_noise { # create a new audio stream playing white noise my ($class,$dev) = @_; my $self = bless { }, $class; $self->{_dev} = $dev; $self->{_stream} = _white_noise($dev->_device()); if (!$self->{_stream}) { return Audio::Audiere::Error->new( "Unknown error. Could not create stream with white noise."); } $self->{_muted} = 0; # unmuted $self->{_id} = ID(); # get a new ID $self->{_vol} = 1; $self->{_master} = $dev->getMasterVolume(); $self->setVolume($self->{_vol}); # force master volume update $self; } sub pink_noise { # create a new audio stream playing pink noise (which is noise with an # equal power distribution among octaves (logarithmic), not frequencies. my ($class,$dev) = @_; my $self = bless { }, $class; $self->{_dev} = $dev; $self->{_stream} = _pink_noise($dev->_device()); if (!$self->{_stream}) { return Audio::Audiere::Error->new( "Unknown error. Could not create stream with pink noise."); } $self->{_id} = ID(); # get a new ID $self->{_muted} = 0; # unmuted $self->{_vol} = 1; $self->{_master} = $dev->getMasterVolume(); $self->setVolume($self->{_stream},$self->{_vol}); # force master vol update $self; } sub _set_master { my $self = shift; $self->{_master} = abs($_[0] || 0); if (!$self->{_muted}) { _setVolume($self->{_stream},$self->{_vol} * $self->{_master}); } } sub error { undef; } sub DESTROY { my $self = shift; _free_stream($self->{_stream}) if $self->{_stream}; } sub play { my $self = shift; _play($self->{_stream}); } sub stop { my $self = shift; _stop($self->{_stream}); } ############################################################################## # get methods sub getPan { my $self = shift; _getPan($self->{_stream}); } sub getRepeat { my $self = shift; _getRepeat($self->{_stream}); } sub getVolume { my $self = shift; $self->{_vol}; } sub setMuted { my $self = shift; $self->{_muted} = $_[0] ? 1 : 0; if ($self->{_muted}) { _setVolume($self->{_stream},0); # mute the stream } else { # restore volume _setVolume($self->{_stream},$self->{_vol} * $self->{_master}); } } sub getPosition { my $self = shift; _getPosition($self->{_stream}); } sub getPitchShift { my $self = shift; _getPitch($self->{_stream}); } sub getLength { my $self = shift; _getLength($self->{_stream}); } ############################################################################## # is... methods sub isPlaying { my $self = shift; _isPlaying($self->{_stream}); } sub isSeekable { my $self = shift; _isSeekable($self->{_stream}); } sub isMuted { my $self = shift; $self->{_muted}; } ############################################################################## # set methods sub setPan { my $self = shift; _setPan($self->{_stream},$_[0] || 0); } sub setRepeat { my $self = shift; _setRepeat($self->{_stream},$_[0] ? 1 : 0); } sub setVolume { my $self = shift; $self->{_vol} = abs($_[0] || 0); $self->{_vol} = 1 if $self->{_vol} > 1; if (!$self->{_muted}) { _setVolume($self->{_stream},$self->{_vol} * $self->{_master}); } $self->{_vol}; } sub setPosition { my $self = shift; _setPosition($self->{_stream},$_[0] || 0); } sub setPitchShift { my $self = shift; _setPitch($self->{_stream},$_[0] || 0); } sub id { my $self = shift; $self->{_id}; } 1; # eof __END__ =pod =head1 NAME Audio::Audiere::Stream - a sound (stream) in Audio::Audiere =head1 SYNOPSIS See Audio::Audiere for usage. =head1 EXPORTS Exports nothing. =head1 DESCRIPTION This package provides you with individual sound streams. It should not be used on it's own, but via Audio::Audiere. =head1 METHODS =over 2 =item error if ($stream->error()) { print "Fatal error: ", $stream->error(),"\n"; } Return the last error message, or undef for no error. =item play Start playing the stream. =item stop Stop playing the stream. =item getLength =item isSeekable $stream->setPosition(100) if $stream->isSeekable(); Returns whether the stream is seekable or not. =item isMuted if ($stream->isMuted()) { ... } Returns true if the stream is currently muted. =item isPlaying while ($stream->isPlaying()) { ... } Returns true if the stream is still playing. =item getPosition Returns the current position in the stream. =item setPosition Set the current position in the stream. =item getFormat =item getSamples =item getVolume Returns the volume of the stream as a value between 0 and 1. =item setVolume Set the volume of the stream as a value between 0 and 1. =item getRepeat Returns true if the stream is repeating (aka looping). =item setRepeat $stream->setRepeat(1); # loop $stream->setRepeat(0); # don't loop If true, the stream will repeat (aka loop). =item setPan $stream->setPan ( -1.0 ); # -1.0 = left, 0 = center, 1.0 = right Set the panning of the sound from -1.0 to +1.0. =item getPan Returns the current panning of the sound from -1.0 to +1.0. See L. =item setMuted $stream->setMuted (1); # mute the stream ... $stream->setMuted (0); # unmute the stream again Sets the stream to muted or unmuted. The stream will continue to play inaudible and also remembers it's volume, which will be restored on unmute. =back =head1 AUTHORS (c) 2004 Tels =head1 SEE ALSO L, L, L, L. =cut