SFML logo
  • Main Page
  • Namespaces
  • Classes
  • Files
  • File List

Sound.cpp

00001 
00002 //
00003 // SFML - Simple and Fast Multimedia Library
00004 // Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com)
00005 //
00006 // This software is provided 'as-is', without any express or implied warranty.
00007 // In no event will the authors be held liable for any damages arising from the use of this software.
00008 //
00009 // Permission is granted to anyone to use this software for any purpose,
00010 // including commercial applications, and to alter it and redistribute it freely,
00011 // subject to the following restrictions:
00012 //
00013 // 1. The origin of this software must not be misrepresented;
00014 //    you must not claim that you wrote the original software.
00015 //    If you use this software in a product, an acknowledgment
00016 //    in the product documentation would be appreciated but is not required.
00017 //
00018 // 2. Altered source versions must be plainly marked as such,
00019 //    and must not be misrepresented as being the original software.
00020 //
00021 // 3. This notice may not be removed or altered from any source distribution.
00022 //
00024 
00026 // Headers
00028 #include <SFML/Audio/Sound.hpp>
00029 #include <SFML/Audio/SoundBuffer.hpp>
00030 #include <SFML/Audio/OpenAL.hpp>
00031 
00032 
00033 namespace sf
00034 {
00038 Sound::Sound()
00039 {
00040     ALCheck(alGenSources(1, &mySource));
00041     ALCheck(alSourcei(mySource, AL_BUFFER, 0));
00042 }
00043 
00044 
00048 Sound::Sound(const SoundBuffer& Buffer, bool Loop, float Pitch, float Volume, const Vector3f& Position) :
00049 myBuffer(&Buffer)
00050 {
00051     ALCheck(alGenSources(1, &mySource));
00052 
00053     ALCheck(alSourcei (mySource, AL_BUFFER,   Buffer.myBuffer));
00054     ALCheck(alSourcei (mySource, AL_LOOPING,  Loop));
00055     ALCheck(alSourcef (mySource, AL_PITCH,    Pitch));
00056     ALCheck(alSourcef (mySource, AL_GAIN,     Volume * 0.01f));
00057     ALCheck(alSource3f(mySource, AL_POSITION, Position.x, Position.y, Position.z));
00058 }
00059 
00060 
00064 Sound::Sound(const Sound& Copy) :
00065 AudioResource(Copy),
00066 myBuffer     (Copy.myBuffer)
00067 {
00068     ALCheck(alGenSources(1, &mySource));
00069 
00070     ALCheck(alSourcei (mySource, AL_BUFFER,   myBuffer ? myBuffer->myBuffer : 0));
00071     ALCheck(alSourcei (mySource, AL_LOOPING,  Copy.GetLoop()));
00072     ALCheck(alSourcef (mySource, AL_PITCH,    Copy.GetPitch()));
00073     ALCheck(alSourcef (mySource, AL_GAIN,     Copy.GetVolume() * 0.01f));
00074     ALCheck(alSource3f(mySource, AL_POSITION, Copy.GetPosition().x, Copy.GetPosition().y, Copy.GetPosition().z));
00075 }
00076 
00077 
00081 Sound::~Sound()
00082 {
00083     if (mySource)
00084     {
00085         if (myBuffer)
00086         {
00087             Stop();
00088             ALCheck(alSourcei(mySource, AL_BUFFER, 0));
00089         }
00090         ALCheck(alDeleteSources(1, &mySource));
00091     }
00092 }
00093 
00094 
00098 void Sound::Play()
00099 {
00100     ALCheck(alSourcePlay(mySource));
00101 }
00102 
00103 
00107 void Sound::Pause()
00108 {
00109     ALCheck(alSourcePause(mySource));
00110 }
00111 
00112 
00116 void Sound::Stop()
00117 {
00118     ALCheck(alSourceStop(mySource));
00119 }
00120 
00121 
00125 void Sound::SetBuffer(const SoundBuffer& Buffer)
00126 {
00127     myBuffer = &Buffer;
00128     ALCheck(alSourcei(mySource, AL_BUFFER, myBuffer ? myBuffer->myBuffer : 0));
00129 }
00130 
00131 
00135 void Sound::SetLoop(bool Loop)
00136 {
00137     ALCheck(alSourcei(mySource, AL_LOOPING, Loop));
00138 }
00139 
00140 
00144 void Sound::SetPitch(float Pitch)
00145 {
00146     ALCheck(alSourcef(mySource, AL_PITCH, Pitch));
00147 }
00148 
00149 
00153 void Sound::SetVolume(float Volume)
00154 {
00155     ALCheck(alSourcef(mySource, AL_GAIN, Volume * 0.01f));
00156 }
00157 
00162 void Sound::SetPosition(float X, float Y, float Z)
00163 {
00164     ALCheck(alSource3f(mySource, AL_POSITION, X, Y, Z));
00165 }
00166 
00167 
00172 void Sound::SetPosition(const Vector3f& Position)
00173 {
00174     SetPosition(Position.x, Position.y, Position.z);
00175 }
00176 
00177 
00183 void Sound::SetRelativeToListener(bool Relative)
00184 {
00185     ALCheck(alSourcei(mySource, AL_SOURCE_RELATIVE, Relative));
00186 }
00187 
00188 
00194 void Sound::SetMinDistance(float MinDistance)
00195 {
00196     ALCheck(alSourcef(mySource, AL_REFERENCE_DISTANCE, MinDistance));
00197 }
00198 
00199 
00205 void Sound::SetAttenuation(float Attenuation)
00206 {
00207     ALCheck(alSourcef(mySource, AL_ROLLOFF_FACTOR, Attenuation));
00208 }
00209 
00210 
00214 void Sound::SetPlayingOffset(float TimeOffset)
00215 {
00216     ALCheck(alSourcef(mySource, AL_SEC_OFFSET, TimeOffset));
00217 }
00218 
00219 
00223 const SoundBuffer* Sound::GetBuffer() const
00224 {
00225     return myBuffer;
00226 }
00227 
00228 
00232 bool Sound::GetLoop() const
00233 {
00234     ALint Loop;
00235     ALCheck(alGetSourcei(mySource, AL_LOOPING, &Loop));
00236 
00237     return Loop != 0;
00238 }
00239 
00240 
00244 float Sound::GetPitch() const
00245 {
00246     ALfloat Pitch;
00247     ALCheck(alGetSourcef(mySource, AL_PITCH, &Pitch));
00248 
00249     return Pitch;
00250 }
00251 
00252 
00256 float Sound::GetVolume() const
00257 {
00258     ALfloat Gain;
00259     ALCheck(alGetSourcef(mySource, AL_GAIN, &Gain));
00260 
00261     return Gain * 100.f;
00262 }
00263 
00264 
00268 Vector3f Sound::GetPosition() const
00269 {
00270     Vector3f Position;
00271     ALCheck(alGetSource3f(mySource, AL_POSITION, &Position.x, &Position.y, &Position.z));
00272 
00273     return Position;
00274 }
00275 
00276 
00281 bool Sound::IsRelativeToListener() const
00282 {
00283     ALint Relative;
00284     ALCheck(alGetSourcei(mySource, AL_SOURCE_RELATIVE, &Relative));
00285 
00286     return Relative != 0;
00287 }
00288 
00289 
00293 float Sound::GetMinDistance() const
00294 {
00295     ALfloat MinDistance;
00296     ALCheck(alGetSourcef(mySource, AL_REFERENCE_DISTANCE, &MinDistance));
00297 
00298     return MinDistance;
00299 }
00300 
00301 
00305 float Sound::GetAttenuation() const
00306 {
00307     ALfloat Attenuation;
00308     ALCheck(alGetSourcef(mySource, AL_ROLLOFF_FACTOR, &Attenuation));
00309 
00310     return Attenuation;
00311 }
00312 
00313 
00317 float Sound::GetPlayingOffset() const
00318 {
00319     ALfloat Seconds = 0.f;
00320     ALCheck(alGetSourcef(mySource, AL_SEC_OFFSET, &Seconds));
00321 
00322     return Seconds;
00323 }
00324 
00325 
00329 Sound::Status Sound::GetStatus() const
00330 {
00331     ALint State;
00332     ALCheck(alGetSourcei(mySource, AL_SOURCE_STATE, &State));
00333 
00334     switch (State)
00335     {
00336         case AL_INITIAL :
00337         case AL_STOPPED : return Stopped;
00338         case AL_PAUSED :  return Paused;
00339         case AL_PLAYING : return Playing;
00340     }
00341 
00342     return Stopped;
00343 }
00344 
00345 
00349 Sound& Sound::operator =(const Sound& Other)
00350 {
00351     Sound Temp(Other);
00352 
00353     std::swap(mySource, Temp.mySource);
00354     std::swap(myBuffer, Temp.myBuffer);
00355 
00356     return *this;
00357 }
00358 
00359 } // namespace sf

 ::  Copyright © 2007-2008 Laurent Gomila, all rights reserved  ::  Documentation generated by doxygen 1.5.2  ::