Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 7549 was 7460, checked in by bensch, 19 years ago

orxonox/trunk: Namespaces for sound

File size: 6.4 KB
Line 
1/*
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.
10
11   ### File Specific:
12   main-programmer: Benjamin Grauer
13   co-programmer: ...
14*/
15
16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_SOUND
17
18#include "sound_source.h"
19#include "sound_engine.h"
20
21#include "alincl.h"
22#include "compiler.h"
23
24namespace OrxSound
25{
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");
32
33    // adding the Source to the SourcesList of the SoundEngine
34    this->buffer = buffer;
35    this->sourceNode = sourceNode;
36    this->resident = false;
37
38    this->sourceID = 0;
39    this->bPlay = false;
40  }
41
42
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");
53
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;
58
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;
67  }
68
69
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;
81
82    if (source.bPlay)
83      this->play();
84    else
85      this->stop();
86  }
87
88
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  }
101
102
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  }
112
113
114  /**
115   * @brief Plays back a SoundSource
116   */
117  void SoundSource::play()
118  {
119    if (this->buffer && this->retrieveSource())
120    {
121      if (this->bPlay)
122        alSourceStop(this->sourceID);
123      alSourcei (this->sourceID, AL_BUFFER, this->buffer->getID());
124      alSourcePlay(this->sourceID);
125
126      if (DEBUG >= 3)
127        SoundEngine::checkError("Play Source", __LINE__);
128      this->bPlay = true;
129    }
130  }
131
132
133  /**
134   * @brief Plays back buffer on this Source
135   * @param buffer the buffer to play back on this Source
136   */
137  void SoundSource::play(const SoundBuffer* buffer)
138  {
139    if (!this->retrieveSource())
140    {
141      PRINTF(3)("No more Free sources (You might consider raising the Source-Count).\n");
142      return;
143    }
144
145    alSourceStop(this->sourceID);
146    alSourcei (this->sourceID, AL_BUFFER, buffer->getID());
147    alSourcePlay(this->sourceID);
148
149    if (unlikely(this->buffer != NULL))
150      alSourcei (this->sourceID, AL_BUFFER, this->buffer->getID());
151    this->bPlay = true;
152
153    if (DEBUG >= 3)
154      SoundEngine::checkError("Play Source", __LINE__);
155  }
156
157
158  /**
159   * @brief Stops playback of a SoundSource
160   */
161  void SoundSource::stop()
162  {
163    this->bPlay = false;
164    if (this->sourceID != 0)
165    {
166      alSourceStop(this->sourceID);
167      if (DEBUG >= 3)
168        SoundEngine::checkError("StopSource", __LINE__);
169      alSourcei(this->sourceID, AL_BUFFER, 0);
170      if (!this->resident)
171        SoundEngine::getInstance()->pushALSource(this->sourceID);
172      this->sourceID = 0;
173    }
174  }
175
176
177  /**
178   * @brief Pauses Playback of a SoundSource
179   */
180  void SoundSource::pause()
181  {
182    alSourcePause(this->sourceID);
183    if (DEBUG >= 3)
184      SoundEngine::checkError("Pause Source", __LINE__);
185  }
186
187
188  /**
189   * @brief Rewinds Playback of a SoundSource
190   */
191  void SoundSource::rewind()
192  {
193    alSourceRewind(this->sourceID);
194
195    if (DEBUG >= 3)
196      SoundEngine::checkError("Rewind Source", __LINE__);
197  }
198
199
200  /**
201   * @brief sets the RolloffFactor of the Sound emitted from the SoundSource
202   * @param rolloffFactor The Factor described
203   *
204   * this tells openAL how fast the Sounds decay outward from the Source
205   */
206  void SoundSource::setRolloffFactor(ALfloat rolloffFactor)
207  {
208    alSourcef(this->sourceID, AL_ROLLOFF_FACTOR, rolloffFactor);
209
210    if (DEBUG >= 3)
211      SoundEngine::checkError("Set Source Rolloff-factor", __LINE__);
212  }
213
214
215  /**
216   * @brief sets the Positional this Source should be attached to.
217   * @param sourceNode the Source this is attached to.
218   * If sourceNode == NULL then the Source will be centered, and Audio will be played on all channels.
219   */
220  void SoundSource::setSourceNode(const PNode* sourceNode)
221  {
222    this->sourceNode = sourceNode;
223  }
224
225  /**
226   * @brief retrieve a Source.
227   */
228  bool SoundSource::retrieveSource()
229  {
230    if (this->sourceID != 0)
231      return true;
232    else
233    {
234      SoundEngine::getInstance()->popALSource(this->sourceID);
235      if (this->sourceID != 0)
236      {
237        if (unlikely(this->sourceNode == NULL))
238          resetSource(this->sourceID);
239        return true;
240      }
241    }
242    return false;
243  }
244
245
246  /**
247   * @brief reset an alSource to its default Values.
248   */
249  void SoundSource::resetSource(ALuint sourceID)
250  {
251    alSource3f(sourceID, AL_POSITION,        0.0, 0.0, 0.0);
252    alSource3f(sourceID, AL_VELOCITY,        0.0, 0.0, 0.0);
253    alSource3f(sourceID, AL_DIRECTION,       0.0, 0.0, 0.0);
254    alSourcef (sourceID, AL_ROLLOFF_FACTOR,  0.0          );
255    //alSourcei (sourceID, AL_SOURCE_RELATIVE, AL_TRUE      );
256    alSourcef (sourceID, AL_GAIN,            SoundEngine::getInstance()->getEffectsVolume());
257  }
258}
Note: See TracBrowser for help on using the repository browser.