1 /*
2  * Copyright 2011-2012 Arx Libertatis Team (see the AUTHORS file)
3  *
4  * This file is part of Arx Libertatis.
5  *
6  * Arx Libertatis 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 3 of the License, or
9  * (at your option) any later version.
10  *
11  * Arx Libertatis is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Arx Libertatis.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 /* Based on:
20 ===========================================================================
21 ARX FATALIS GPL Source Code
22 Copyright (C) 1999-2010 Arkane Studios SA, a ZeniMax Media company.
23 
24 This file is part of the Arx Fatalis GPL Source Code ('Arx Fatalis Source Code').
25 
26 Arx Fatalis Source Code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public
27 License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
28 
29 Arx Fatalis Source Code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
30 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
31 
32 You should have received a copy of the GNU General Public License along with Arx Fatalis Source Code.  If not, see
33 <http://www.gnu.org/licenses/>.
34 
35 In addition, the Arx Fatalis Source Code is also subject to certain additional terms. You should have received a copy of these
36 additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Arx
37 Fatalis Source Code. If not, please request a copy in writing from Arkane Studios at the address below.
38 
39 If you have questions concerning this license or the applicable additional terms, you may contact in writing Arkane Studios, c/o
40 ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
41 ===========================================================================
42 */
43 
44 #ifndef ARX_AUDIO_DSOUND_DSOUNDSOURCE_H
45 #define ARX_AUDIO_DSOUND_DSOUNDSOURCE_H
46 
47 #include "audio/dsound/dsoundfwd.h"
48 
49 #include "audio/AudioTypes.h"
50 #include "audio/AudioSource.h"
51 
52 namespace audio {
53 
54 class Stream;
55 class Sample;
56 class DSoundBackend;
57 
58 class DSoundSource : public Source {
59 
60 public:
61 
62 	DSoundSource(Sample * Sample, DSoundBackend * backend);
63 	~DSoundSource();
64 
65 	aalError init(SourceId _id, const Channel & channel);
66 	aalError init(SourceId _id, DSoundSource * instance, const Channel & channel);
67 
68 	aalError setPitch(float pitch);
69 	aalError setPan(float pan);
70 
71 	aalError setPosition(const Vec3f & position);
72 	aalError setVelocity(const Vec3f & velocity);
73 	aalError setDirection(const Vec3f & direction);
74 	aalError setCone(const SourceCone & cone);
75 	aalError setFalloff(const SourceFalloff & falloff);
76 
77 	// Control
78 	aalError play(unsigned playCount = 1);
79 	aalError stop();
80 	aalError pause();
81 	aalError resume();
82 
83 	aalError updateVolume();
84 
85 protected:
86 
87 	bool updateCulling();
88 
89 	aalError updateBuffers();
90 
91 private:
92 
93 	aalError init();
94 	void updateStreaming();
95 	aalError clean();
96 	bool checkPlaying();
97 
98 	bool tooFar;
99 	unsigned loop; // Remaining loop count
100 	Stream * stream;
101 	size_t read, write; // Streaming status
102 	size_t size; // Buffer size
103 	LPDIRECTSOUNDBUFFER lpdsb;
104 	LPDIRECTSOUND3DBUFFER lpds3db;
105 	LPKSPROPERTYSET lpeax;
106 
107 	DSoundBackend * backend;
108 
109 };
110 
111 } // namespace audio
112 
113 #endif // ARX_AUDIO_DSOUND_DSOUNDSOURCE_H
114