Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/lib/sound/sound_source.cc @ 7906

Last change on this file since 7906 was 7810, checked in by bensch, 18 years ago

orxonox/trunk: merged the Weather effects back here

File size: 7.1 KB
RevLine 
[4744]1/*
[1853]2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
[1855]10
11   ### File Specific:
[5386]12   main-programmer: Benjamin Grauer
[1855]13   co-programmer: ...
[1853]14*/
15
[5386]16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_SOUND
[1853]17
[5386]18#include "sound_source.h"
19#include "sound_engine.h"
[5917]20
[5386]21#include "alincl.h"
22#include "compiler.h"
[1853]23
[7460]24namespace OrxSound
[5386]25{
[7460]26  /**
27   * @brief creates a SoundSource at position sourceNode with the SoundBuffer buffer
28   */
29  SoundSource::SoundSource(const PNode* sourceNode, const SoundBuffer* buffer)
30  {
31    this->setClassID(CL_SOUND_SOURCE, "SoundSource");
[1856]32
[7460]33    // adding the Source to the SourcesList of the SoundEngine
34    this->buffer = buffer;
35    this->sourceNode = sourceNode;
36    this->resident = false;
[5386]37
[7460]38    this->sourceID = 0;
39    this->bPlay = false;
40  }
[5386]41
[7317]42
[7460]43  /**
44   * @brief construct a SoundSource out of the another soundSource
45   * @param source the Source to create this source from.
46   *
47   * Copies the buffer from source to this Source.
48   * Acquires a new SourceID if source is Playing.
49   */
50  SoundSource::SoundSource(const SoundSource& source)
51  {
52    this->setClassID(CL_SOUND_SOURCE, "SoundSource");
[7299]53
[7460]54    // adding the Source to the SourcesList of the SoundEngine
55    this->buffer = source.buffer;
56    this->sourceNode = source.sourceNode;
57    this->resident = source.resident;
[7299]58
[7460]59    this->sourceID = 0;
60    if (source.bPlay == true)
61    {
62      this->bPlay = true;
63      SoundEngine::getInstance()->popALSource(this->sourceID);
64    }
65    else
66      this->bPlay = false;
[7299]67  }
68
[7317]69
[7460]70  /**
71   * @brief paste a copy of the source into this Source.
72   * @param source the SoundSource to paste into this one.
73   * @returns a Reference to this Source.
74   *
75   */
76  SoundSource& SoundSource::operator=(const SoundSource& source)
77  {
78    this->buffer = source.buffer;
79    this->sourceNode = sourceNode;
80    this->resident = source.resident;
[7299]81
[7460]82    if (source.bPlay)
83      this->play();
84    else
85      this->stop();
86  }
[7299]87
[7317]88
[7460]89  /**
90   * @brief compares two Sources with each other.
91   * @param source the Source to compare against this One.
92   * Two Sources are the same, if the PNodes match, and the Sound Played are the same.
93   * The alSource must not match, because no two Sources can have the same alSource.
94   */
95  bool SoundSource::operator==(const SoundSource& source)
96  {
97    return (this->buffer == source.buffer &&
98            this->bPlay == source.bPlay &&
99            this->sourceNode == source.sourceNode);
100  }
[7299]101
[7317]102
[7460]103  /**
104   * @brief deletes a SoundSource
105   */
106  SoundSource::~SoundSource()
107  {
108    this->stop();
109    if (this->sourceID != 0)
110      SoundEngine::getInstance()->pushALSource(this->sourceID);
111  }
[4320]112
[7317]113
[7460]114  /**
115   * @brief Plays back a SoundSource
116   */
117  void SoundSource::play()
[7317]118  {
[7460]119    if (this->buffer && this->retrieveSource())
120    {
121      if (this->bPlay)
122        alSourceStop(this->sourceID);
123      alSourcei (this->sourceID, AL_BUFFER, this->buffer->getID());
[7810]124    alSourcei (this->sourceID, AL_LOOPING,  AL_FALSE  );
125    alSourcePlay(this->sourceID);
[7318]126
[7729]127      if (DEBUG_LEVEL >= 3)
[7460]128        SoundEngine::checkError("Play Source", __LINE__);
129      this->bPlay = true;
130    }
[7317]131  }
[4320]132
[7317]133
[7460]134  /**
135   * @brief Plays back buffer on this Source
136   * @param buffer the buffer to play back on this Source
137   */
138  void SoundSource::play(const SoundBuffer* buffer)
[7291]139  {
[7460]140    if (!this->retrieveSource())
141    {
142      PRINTF(3)("No more Free sources (You might consider raising the Source-Count).\n");
143      return;
144    }
[5930]145
[7810]146  alSourceStop(this->sourceID);
147  alSourcei (this->sourceID, AL_BUFFER, buffer->getID());
148  alSourcei (this->sourceID, AL_LOOPING,  AL_FALSE  );
149  alSourcePlay(this->sourceID);
[5386]150
[7460]151    if (unlikely(this->buffer != NULL))
152      alSourcei (this->sourceID, AL_BUFFER, this->buffer->getID());
153    this->bPlay = true;
[7290]154
[7729]155    if (DEBUG_LEVEL >= 3)
[7460]156      SoundEngine::checkError("Play Source", __LINE__);
157  }
[1853]158
[7317]159
[7810]160/**
161 * @brief Plays and loops buffer on this Source
162 * @param buffer the buffer to play back on this Source
163 */
164void SoundSource::loop(const SoundBuffer* buffer)
165{
166  if (this->buffer && this->retrieveSource())
[7291]167  {
[7810]168    if (this->bPlay)
169      alSourceStop(this->sourceID);
170
171    alSourcei (this->sourceID, AL_BUFFER, this->buffer->getID());
172    alSourcei (this->sourceID, AL_LOOPING,  AL_TRUE  );
173    alSourcePlay(this->sourceID);
174
175    if (DEBUG_LEVEL >= 3)
176      SoundEngine::checkError("Play LoopSource", __LINE__);
177    this->bPlay = true;
178  }
179}
180
181
182/**
183 * @brief Stops playback of a SoundSource
184 */
185void SoundSource::stop()
186{
187  this->bPlay = false;
188  if (this->sourceID != 0)
189  {
[7460]190    this->bPlay = false;
191    if (this->sourceID != 0)
192    {
193      alSourceStop(this->sourceID);
[7729]194      if (DEBUG_LEVEL >= 3)
[7460]195        SoundEngine::checkError("StopSource", __LINE__);
196      alSourcei(this->sourceID, AL_BUFFER, 0);
197      if (!this->resident)
198        SoundEngine::getInstance()->pushALSource(this->sourceID);
199      this->sourceID = 0;
200    }
[7291]201  }
[7810]202}
[1853]203
[7460]204  /**
205   * @brief Pauses Playback of a SoundSource
206   */
207  void SoundSource::pause()
208  {
209    alSourcePause(this->sourceID);
[7729]210    if (DEBUG_LEVEL >= 3)
[7460]211      SoundEngine::checkError("Pause Source", __LINE__);
212  }
[5386]213
[7317]214
[7460]215  /**
216   * @brief Rewinds Playback of a SoundSource
217   */
218  void SoundSource::rewind()
219  {
220    alSourceRewind(this->sourceID);
[7290]221
[7729]222    if (DEBUG_LEVEL >= 3)
[7460]223      SoundEngine::checkError("Rewind Source", __LINE__);
224  }
[5386]225
[7317]226
[7460]227  /**
228   * @brief sets the RolloffFactor of the Sound emitted from the SoundSource
229   * @param rolloffFactor The Factor described
230   *
231   * this tells openAL how fast the Sounds decay outward from the Source
232   */
233  void SoundSource::setRolloffFactor(ALfloat rolloffFactor)
234  {
235    alSourcef(this->sourceID, AL_ROLLOFF_FACTOR, rolloffFactor);
[7290]236
[7729]237    if (DEBUG_LEVEL >= 3)
[7460]238      SoundEngine::checkError("Set Source Rolloff-factor", __LINE__);
239  }
[5386]240
[7317]241
[7460]242  /**
243   * @brief sets the Positional this Source should be attached to.
244   * @param sourceNode the Source this is attached to.
245   * If sourceNode == NULL then the Source will be centered, and Audio will be played on all channels.
246   */
247  void SoundSource::setSourceNode(const PNode* sourceNode)
248  {
249    this->sourceNode = sourceNode;
250  }
[7317]251
[7460]252  /**
253   * @brief retrieve a Source.
254   */
255  bool SoundSource::retrieveSource()
[7317]256  {
257    if (this->sourceID != 0)
[7460]258      return true;
259    else
[7317]260    {
[7460]261      SoundEngine::getInstance()->popALSource(this->sourceID);
262      if (this->sourceID != 0)
263      {
264        if (unlikely(this->sourceNode == NULL))
265          resetSource(this->sourceID);
266        return true;
267      }
[7317]268    }
[7460]269    return false;
[7317]270  }
271
272
[7460]273  /**
274   * @brief reset an alSource to its default Values.
275   */
276  void SoundSource::resetSource(ALuint sourceID)
277  {
278    alSource3f(sourceID, AL_POSITION,        0.0, 0.0, 0.0);
279    alSource3f(sourceID, AL_VELOCITY,        0.0, 0.0, 0.0);
280    alSource3f(sourceID, AL_DIRECTION,       0.0, 0.0, 0.0);
281    alSourcef (sourceID, AL_ROLLOFF_FACTOR,  0.0          );
282    //alSourcei (sourceID, AL_SOURCE_RELATIVE, AL_TRUE      );
283    alSourcef (sourceID, AL_GAIN,            SoundEngine::getInstance()->getEffectsVolume());
284  }
[7317]285}
Note: See TracBrowser for help on using the repository browser.