gosu 0.7.11 → 0.7.12
Sign up to get free protection for your applications and to get access to all the features.
- data/Gosu/Audio.hpp +33 -16
- data/Gosu/GraphicsBase.hpp +6 -1
- data/Gosu/Input.hpp +8 -2
- data/Gosu/Platform.hpp +63 -61
- data/Gosu/Window.hpp +11 -0
- data/GosuImpl/AudioFmod.cpp +89 -16
- data/GosuImpl/AudioSDL.cpp +59 -19
- data/GosuImpl/Graphics/BitmapUtils.cpp +3 -0
- data/GosuImpl/Graphics/Common.hpp +8 -3
- data/GosuImpl/Graphics/DrawOp.hpp +70 -7
- data/GosuImpl/Graphics/Graphics.cpp +34 -2
- data/GosuImpl/Graphics/TexChunk.cpp +7 -1
- data/GosuImpl/Graphics/Texture.cpp +31 -9
- data/GosuImpl/Iconv.hpp +3 -0
- data/GosuImpl/InputMac.mm +31 -10
- data/GosuImpl/InputWin.cpp +8 -0
- data/GosuImpl/InputX.cpp +64 -45
- data/GosuImpl/Math.cpp +1 -1
- data/GosuImpl/RubyGosu.swg +27 -7
- data/GosuImpl/RubyGosu_wrap.cxx +338 -205
- data/GosuImpl/Utility.cpp +1 -0
- data/GosuImpl/WindowMac.mm +29 -3
- data/GosuImpl/WindowWin.cpp +16 -5
- data/GosuImpl/WindowX.cpp +3 -3
- data/README.txt +7 -3
- data/Rakefile +2 -1
- data/mac/Gosu.icns +0 -0
- data/mac/Gosu.xcodeproj/jlnr.mode1v3 +74 -75
- data/mac/Gosu.xcodeproj/jlnr.pbxuser +731 -257
- data/mac/Gosu.xcodeproj/jlnr.perspectivev3 +1531 -0
- data/reference/Async_8hpp-source.html +1 -1
- data/reference/Audio_8hpp-source.html +68 -58
- data/reference/Audio_8hpp.html +1 -1
- data/reference/AutoLink_8hpp-source.html +1 -1
- data/reference/AutoLink_8hpp.html +1 -1
- data/reference/Bitmap_8hpp-source.html +1 -1
- data/reference/Bitmap_8hpp.html +1 -1
- data/reference/ButtonsMac_8hpp-source.html +1 -1
- data/reference/ButtonsWin_8hpp-source.html +1 -1
- data/reference/ButtonsX_8hpp-source.html +1 -1
- data/reference/Color_8hpp-source.html +1 -1
- data/reference/Color_8hpp.html +1 -1
- data/reference/Directories_8hpp-source.html +1 -1
- data/reference/Directories_8hpp.html +1 -1
- data/reference/Font_8hpp-source.html +1 -1
- data/reference/Font_8hpp.html +1 -1
- data/reference/Fwd_8hpp-source.html +1 -1
- data/reference/Fwd_8hpp.html +1 -1
- data/reference/Gosu_8hpp-source.html +1 -1
- data/reference/Gosu_8hpp.html +1 -1
- data/reference/GraphicsBase_8hpp-source.html +28 -26
- data/reference/GraphicsBase_8hpp.html +4 -1
- data/reference/Graphics_8hpp-source.html +1 -1
- data/reference/Graphics_8hpp.html +1 -1
- data/reference/IO_8hpp-source.html +1 -1
- data/reference/IO_8hpp.html +1 -1
- data/reference/ImageData_8hpp-source.html +1 -1
- data/reference/ImageData_8hpp.html +1 -1
- data/reference/Image_8hpp-source.html +1 -1
- data/reference/Image_8hpp.html +1 -1
- data/reference/Input_8hpp-source.html +19 -16
- data/reference/Input_8hpp.html +1 -1
- data/reference/Math_8hpp-source.html +1 -1
- data/reference/Math_8hpp.html +1 -1
- data/reference/Platform_8hpp-source.html +22 -20
- data/reference/Platform_8hpp.html +1 -1
- data/reference/RotFlip_8hpp-source.html +1 -1
- data/reference/RotFlip_8hpp.html +1 -1
- data/reference/Sockets_8hpp-source.html +1 -1
- data/reference/Sockets_8hpp.html +1 -1
- data/reference/TextInput_8hpp-source.html +1 -1
- data/reference/TextInput_8hpp.html +1 -1
- data/reference/Text_8hpp-source.html +1 -1
- data/reference/Text_8hpp.html +1 -1
- data/reference/Timing_8hpp-source.html +1 -1
- data/reference/Timing_8hpp.html +1 -1
- data/reference/Utility_8hpp-source.html +1 -1
- data/reference/Utility_8hpp.html +1 -1
- data/reference/WinUtility_8hpp-source.html +1 -1
- data/reference/WinUtility_8hpp.html +1 -1
- data/reference/Window_8hpp-source.html +67 -56
- data/reference/Window_8hpp.html +1 -1
- data/reference/annotated.html +1 -1
- data/reference/classGosu_1_1Audio-members.html +1 -1
- data/reference/classGosu_1_1Audio.html +1 -1
- data/reference/classGosu_1_1Bitmap-members.html +1 -1
- data/reference/classGosu_1_1Bitmap.html +1 -1
- data/reference/classGosu_1_1Buffer-members.html +1 -1
- data/reference/classGosu_1_1Buffer.html +1 -1
- data/reference/classGosu_1_1Button-members.html +1 -1
- data/reference/classGosu_1_1Button.html +1 -1
- data/reference/classGosu_1_1Color-members.html +1 -1
- data/reference/classGosu_1_1Color.html +1 -1
- data/reference/classGosu_1_1File-members.html +1 -1
- data/reference/classGosu_1_1File.html +1 -1
- data/reference/classGosu_1_1Font-members.html +1 -1
- data/reference/classGosu_1_1Font.html +1 -1
- data/reference/classGosu_1_1Graphics-members.html +1 -1
- data/reference/classGosu_1_1Graphics.html +1 -1
- data/reference/classGosu_1_1Image-members.html +1 -1
- data/reference/classGosu_1_1Image.html +1 -1
- data/reference/classGosu_1_1ImageData-members.html +1 -1
- data/reference/classGosu_1_1ImageData.html +1 -1
- data/reference/classGosu_1_1Input-members.html +2 -1
- data/reference/classGosu_1_1Input.html +34 -1
- data/reference/classGosu_1_1MessageSocket-members.html +1 -1
- data/reference/classGosu_1_1MessageSocket.html +1 -1
- data/reference/classGosu_1_1Resource-members.html +1 -1
- data/reference/classGosu_1_1Resource.html +1 -1
- data/reference/classGosu_1_1Sample-members.html +3 -3
- data/reference/classGosu_1_1Sample.html +23 -11
- data/reference/classGosu_1_1SampleInstance-members.html +4 -1
- data/reference/classGosu_1_1SampleInstance.html +11 -2
- data/reference/classGosu_1_1Song-members.html +5 -2
- data/reference/classGosu_1_1Song.html +78 -7
- data/reference/classGosu_1_1TextInput-members.html +1 -1
- data/reference/classGosu_1_1TextInput.html +1 -1
- data/reference/classGosu_1_1Window-members.html +1 -1
- data/reference/classGosu_1_1Window.html +1 -1
- data/reference/files.html +1 -1
- data/reference/functions.html +14 -6
- data/reference/functions_enum.html +1 -1
- data/reference/functions_func.html +14 -6
- data/reference/functions_vars.html +1 -1
- data/reference/hierarchy.html +1 -1
- data/reference/index.html +1 -1
- data/reference/namespaceGosu.html +20 -1
- data/reference/namespaceGosu_1_1Colors.html +1 -1
- data/reference/namespaceGosu_1_1Win.html +1 -1
- data/reference/namespacemembers.html +3 -1
- data/reference/namespacemembers_enum.html +1 -1
- data/reference/namespacemembers_eval.html +1 -1
- data/reference/namespacemembers_func.html +1 -1
- data/reference/namespacemembers_type.html +1 -1
- data/reference/namespacemembers_vars.html +3 -1
- data/reference/namespaces.html +1 -1
- data/windows/Gosu.sln +2 -2
- data/windows/Gosu.vcproj +8 -7
- data/windows/RubyGosu.vcproj +5 -5
- metadata +4 -3
- data/GosuImpl/Utility.cpp~RF6c566.TMP +0 -95
data/Gosu/Audio.hpp
CHANGED
@@ -40,12 +40,16 @@ namespace Gosu
|
|
40
40
|
class SampleInstance
|
41
41
|
{
|
42
42
|
int handle, extra;
|
43
|
-
|
43
|
+
bool alive() const;
|
44
|
+
|
44
45
|
public:
|
45
46
|
//! Called by Sample, do not use.
|
46
47
|
SampleInstance(int handle, int extra);
|
47
48
|
|
48
49
|
bool playing() const;
|
50
|
+
bool paused() const;
|
51
|
+
void pause();
|
52
|
+
void resume();
|
49
53
|
void stop();
|
50
54
|
|
51
55
|
//! \param volume Can be anything from 0.0 (silence) to 1.0 (full
|
@@ -54,14 +58,14 @@ namespace Gosu
|
|
54
58
|
//! \param pan Can be anything from -1.0 (left) to 1.0 (right).
|
55
59
|
void changePan(double pan);
|
56
60
|
//! \param speed Playback speed is only limited by FMOD's
|
57
|
-
//!
|
61
|
+
//! capabilities and can accept very high or low values. Use 1.0 for
|
58
62
|
//! normal playback speed.
|
59
63
|
void changeSpeed(double speed);
|
60
64
|
};
|
61
65
|
|
62
66
|
//! A sample is a short sound that is completely loaded in memory, can be
|
63
67
|
//! played multiple times at once and offers very flexible playback
|
64
|
-
//! parameters.
|
68
|
+
//! parameters. Use samples for everything that's not music.
|
65
69
|
class Sample
|
66
70
|
{
|
67
71
|
struct SampleData;
|
@@ -82,20 +86,22 @@ namespace Gosu
|
|
82
86
|
//! \param volume Can be anything from 0.0 (silence) to 1.0 (full
|
83
87
|
//! volume).
|
84
88
|
//! \param speed Playback speed is only limited by FMOD's
|
85
|
-
//!
|
89
|
+
//! capabilities and can accept very high or low values. Use 1.0 for
|
86
90
|
//! normal playback speed.
|
87
|
-
SampleInstance play(double volume = 1, double speed = 1
|
91
|
+
SampleInstance play(double volume = 1, double speed = 1,
|
92
|
+
bool looping = false) const;
|
88
93
|
|
89
94
|
//! Plays the sample with panning. Even if pan is 0.0, the sample will
|
90
95
|
//! not be as loud as if it were played by calling play() due to the
|
91
|
-
//! way
|
96
|
+
//! way the panning works.
|
92
97
|
//! \param pan Can be anything from -1.0 (left) to 1.0 (right).
|
93
98
|
//! \param volume Can be anything from 0.0 (silence) to 1.0 (full
|
94
99
|
//! volume).
|
95
|
-
//! \param speed Playback speed is only limited by FMOD's
|
96
|
-
//!
|
97
|
-
//! normal playback speed.
|
98
|
-
SampleInstance playPan(double pan, double volume = 1, double speed = 1
|
100
|
+
//! \param speed Playback speed is only limited by FMOD's (or
|
101
|
+
//! SDL_mixer's, respectively) capabilities and can accept very high
|
102
|
+
//! or low values. Use 1.0 for normal playback speed.
|
103
|
+
SampleInstance playPan(double pan, double volume = 1, double speed = 1,
|
104
|
+
bool looping = false) const;
|
99
105
|
};
|
100
106
|
|
101
107
|
//! Songs are less flexible than samples in that they can only be played
|
@@ -126,12 +132,23 @@ namespace Gosu
|
|
126
132
|
Song(Audio&, Type type, Reader reader);
|
127
133
|
|
128
134
|
~Song();
|
129
|
-
|
130
|
-
//!
|
131
|
-
//!
|
132
|
-
//!
|
133
|
-
|
134
|
-
|
135
|
+
|
136
|
+
//! Returns the song currently being played or paused, or 0 if
|
137
|
+
//! no song has been played yet or the last song has finished
|
138
|
+
//! playing.
|
139
|
+
static Song* currentSong();
|
140
|
+
|
141
|
+
//! Starts or resumes playback of the song. This will stop all other
|
142
|
+
//! songs and set the current song to this object.
|
143
|
+
void play(bool looping = false);
|
144
|
+
//! Pauses playback of the song. It is not considered being played.
|
145
|
+
//! currentSong will stay the same.
|
146
|
+
void pause();
|
147
|
+
//! Returns true if the song is the current song, but in paused
|
148
|
+
//! mode.
|
149
|
+
bool paused() const;
|
150
|
+
//! Stops playback of this song if it is currently played or paused.
|
151
|
+
//! Afterwards, currentSong will return 0.
|
135
152
|
void stop();
|
136
153
|
//! Returns if the song is currently playing.
|
137
154
|
bool playing() const;
|
data/Gosu/GraphicsBase.hpp
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
#ifndef GOSU_GRAPHICSBASE_HPP
|
5
5
|
#define GOSU_GRAPHICSBASE_HPP
|
6
6
|
|
7
|
-
#include <
|
7
|
+
#include <limits>
|
8
8
|
|
9
9
|
namespace Gosu
|
10
10
|
{
|
@@ -12,6 +12,11 @@ namespace Gosu
|
|
12
12
|
//! system. Draw calls with higher ZPos values will cover those with a
|
13
13
|
//! lower ZPos value, that is, they are performed last.
|
14
14
|
typedef double ZPos;
|
15
|
+
|
16
|
+
//! The lowest possible Z position. By using this, you tell Gosu that
|
17
|
+
//! your drawing operation does not need Z ordering and can be performed
|
18
|
+
//! immediately.
|
19
|
+
const double zImmediate = -std::numeric_limits<double>::infinity();
|
15
20
|
|
16
21
|
//! Determines the way colors are combined when one is drawn onto
|
17
22
|
//! another.
|
data/Gosu/Input.hpp
CHANGED
@@ -76,8 +76,8 @@ namespace Gosu
|
|
76
76
|
#endif
|
77
77
|
|
78
78
|
#ifdef GOSU_IS_X
|
79
|
-
Input(::Display*
|
80
|
-
bool feedXEvent(::XEvent& event
|
79
|
+
Input(::Display* display, ::Window window);
|
80
|
+
bool feedXEvent(::XEvent& event);
|
81
81
|
#endif
|
82
82
|
|
83
83
|
~Input();
|
@@ -96,6 +96,12 @@ namespace Gosu
|
|
96
96
|
double mouseX() const;
|
97
97
|
//! See mouseX.
|
98
98
|
double mouseY() const;
|
99
|
+
|
100
|
+
//! Immediately moves the mouse as far towards the desired position
|
101
|
+
//! as possible. x and y are relativ to the window just as in the mouse
|
102
|
+
//! position accessors.
|
103
|
+
void setMousePosition(double x, double y);
|
104
|
+
|
99
105
|
// Undocumented for the moment.
|
100
106
|
void setMouseFactors(double factorX, double factorY);
|
101
107
|
|
data/Gosu/Platform.hpp
CHANGED
@@ -1,61 +1,63 @@
|
|
1
|
-
//! \file Platform.hpp
|
2
|
-
//! Macros and utility functions to facilitate programming on all of Gosu's supported platforms.
|
3
|
-
|
4
|
-
#ifndef GOSU_PLATFORM_HPP
|
5
|
-
#define GOSU_PLATFORM_HPP
|
6
|
-
|
7
|
-
#ifdef __BIG_ENDIAN__
|
8
|
-
#define IDENTITY_FUN bigToNative
|
9
|
-
#define IDENTITY_FUN2 nativeToBig
|
10
|
-
#define CONV_FUN littleToNative
|
11
|
-
#define CONV_FUN2 nativeToLittle
|
12
|
-
#else
|
13
|
-
#define IDENTITY_FUN littleToNative
|
14
|
-
#define IDENTITY_FUN2 nativeToLittle
|
15
|
-
#define CONV_FUN bigToNative
|
16
|
-
#define CONV_FUN2 nativeToBig
|
17
|
-
#endif
|
18
|
-
|
19
|
-
#include <algorithm>
|
20
|
-
|
21
|
-
namespace Gosu
|
22
|
-
{
|
23
|
-
template<typename T> T IDENTITY_FUN(T t) { return t; }
|
24
|
-
template<typename T> T IDENTITY_FUN2(T t) { return t; }
|
25
|
-
|
26
|
-
template<typename T>
|
27
|
-
T CONV_FUN(T t)
|
28
|
-
{
|
29
|
-
char* begin = reinterpret_cast<char*>(&t);
|
30
|
-
std::reverse(begin, begin + sizeof t);
|
31
|
-
return t;
|
32
|
-
}
|
33
|
-
|
34
|
-
template<typename T> T CONV_FUN2(T t) { return CONV_FUN(t); }
|
35
|
-
}
|
36
|
-
|
37
|
-
#undef IDENTITY_FUN
|
38
|
-
#undef IDENTITY_FUN2
|
39
|
-
#undef CONV_FUN
|
40
|
-
#undef CONV_FUN2
|
41
|
-
|
42
|
-
#
|
43
|
-
#define GOSU_NORETURN __declspec(noreturn)
|
44
|
-
#
|
45
|
-
|
46
|
-
#
|
47
|
-
|
48
|
-
#
|
49
|
-
|
50
|
-
#
|
51
|
-
# define
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
# define
|
56
|
-
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#endif
|
60
|
-
|
61
|
-
#endif
|
1
|
+
//! \file Platform.hpp
|
2
|
+
//! Macros and utility functions to facilitate programming on all of Gosu's supported platforms.
|
3
|
+
|
4
|
+
#ifndef GOSU_PLATFORM_HPP
|
5
|
+
#define GOSU_PLATFORM_HPP
|
6
|
+
|
7
|
+
#ifdef __BIG_ENDIAN__
|
8
|
+
#define IDENTITY_FUN bigToNative
|
9
|
+
#define IDENTITY_FUN2 nativeToBig
|
10
|
+
#define CONV_FUN littleToNative
|
11
|
+
#define CONV_FUN2 nativeToLittle
|
12
|
+
#else
|
13
|
+
#define IDENTITY_FUN littleToNative
|
14
|
+
#define IDENTITY_FUN2 nativeToLittle
|
15
|
+
#define CONV_FUN bigToNative
|
16
|
+
#define CONV_FUN2 nativeToBig
|
17
|
+
#endif
|
18
|
+
|
19
|
+
#include <algorithm>
|
20
|
+
|
21
|
+
namespace Gosu
|
22
|
+
{
|
23
|
+
template<typename T> T IDENTITY_FUN(T t) { return t; }
|
24
|
+
template<typename T> T IDENTITY_FUN2(T t) { return t; }
|
25
|
+
|
26
|
+
template<typename T>
|
27
|
+
T CONV_FUN(T t)
|
28
|
+
{
|
29
|
+
char* begin = reinterpret_cast<char*>(&t);
|
30
|
+
std::reverse(begin, begin + sizeof t);
|
31
|
+
return t;
|
32
|
+
}
|
33
|
+
|
34
|
+
template<typename T> T CONV_FUN2(T t) { return CONV_FUN(t); }
|
35
|
+
}
|
36
|
+
|
37
|
+
#undef IDENTITY_FUN
|
38
|
+
#undef IDENTITY_FUN2
|
39
|
+
#undef CONV_FUN
|
40
|
+
#undef CONV_FUN2
|
41
|
+
|
42
|
+
#if defined(_MSC_VER)
|
43
|
+
#define GOSU_NORETURN __declspec(noreturn)
|
44
|
+
#elif defined(__GNUC__)
|
45
|
+
#define GOSU_NORETURN __attribute__ ((noreturn))
|
46
|
+
#endif
|
47
|
+
|
48
|
+
#if defined(WIN32)
|
49
|
+
# define GOSU_IS_WIN
|
50
|
+
#else
|
51
|
+
# define GOSU_IS_UNIX
|
52
|
+
# if defined(__linux) || defined(__FreeBSD__)
|
53
|
+
# define GOSU_IS_X
|
54
|
+
# else
|
55
|
+
# define GOSU_IS_MAC
|
56
|
+
# include <TargetConditionals.h>
|
57
|
+
# if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
|
58
|
+
# define GOSU_IS_IPHONE
|
59
|
+
# endif
|
60
|
+
# endif
|
61
|
+
#endif
|
62
|
+
|
63
|
+
#endif
|
data/Gosu/Window.hpp
CHANGED
@@ -11,6 +11,7 @@
|
|
11
11
|
#include <boost/shared_ptr.hpp>
|
12
12
|
#include <boost/function.hpp>
|
13
13
|
#include <string>
|
14
|
+
#include <vector>
|
14
15
|
|
15
16
|
#ifdef GOSU_IS_WIN
|
16
17
|
#include <windows.h>
|
@@ -18,6 +19,11 @@
|
|
18
19
|
|
19
20
|
namespace Gosu
|
20
21
|
{
|
22
|
+
#ifdef GOSU_IS_IPHONE
|
23
|
+
struct Touch { double x, y; };
|
24
|
+
typedef std::vector<Touch> Touches;
|
25
|
+
#endif
|
26
|
+
|
21
27
|
//! Convenient all-in-one class that serves as the foundation of a standard
|
22
28
|
//! Gosu application. Manages initialization of all of Gosu's core components
|
23
29
|
//! and provides timing functionality.
|
@@ -76,6 +82,11 @@ namespace Gosu
|
|
76
82
|
typedef boost::shared_ptr<boost::function<void()> > SharedContext;
|
77
83
|
SharedContext createSharedContext();
|
78
84
|
#endif
|
85
|
+
#ifdef GOSU_IS_IPHONE
|
86
|
+
virtual void touchesBegan(const Touches& touches) {}
|
87
|
+
virtual void touchesMoved(const Touches& touches) {}
|
88
|
+
virtual void touchesEnded(const Touches& touches) {}
|
89
|
+
#endif
|
79
90
|
|
80
91
|
#endif
|
81
92
|
};
|
data/GosuImpl/AudioFmod.cpp
CHANGED
@@ -96,6 +96,21 @@ bool Gosu::SampleInstance::playing() const
|
|
96
96
|
return FSOUND_IsPlaying(handle);
|
97
97
|
}
|
98
98
|
|
99
|
+
bool Gosu::SampleInstance::paused() const
|
100
|
+
{
|
101
|
+
return FSOUND_GetPaused(handle);
|
102
|
+
}
|
103
|
+
|
104
|
+
void Gosu::SampleInstance::pause()
|
105
|
+
{
|
106
|
+
FSOUND_SetPaused(handle, 1);
|
107
|
+
}
|
108
|
+
|
109
|
+
void Gosu::SampleInstance::resume()
|
110
|
+
{
|
111
|
+
FSOUND_SetPaused(handle, 0);
|
112
|
+
}
|
113
|
+
|
99
114
|
void Gosu::SampleInstance::stop()
|
100
115
|
{
|
101
116
|
FSOUND_StopSound(handle);
|
@@ -164,12 +179,15 @@ Gosu::Sample::~Sample()
|
|
164
179
|
{
|
165
180
|
}
|
166
181
|
|
167
|
-
Gosu::SampleInstance Gosu::Sample::play(double volume, double speed
|
182
|
+
Gosu::SampleInstance Gosu::Sample::play(double volume, double speed,
|
183
|
+
bool looping) const
|
168
184
|
{
|
169
185
|
int handle = FSOUND_PlaySound(FSOUND_FREE, data->rep);
|
170
186
|
int freq;
|
171
187
|
if (handle > 0)
|
172
188
|
{
|
189
|
+
if (looping)
|
190
|
+
FSOUND_SetLoopMode(handle, FSOUND_LOOP_NORMAL);
|
173
191
|
freq = FSOUND_GetFrequency(handle);
|
174
192
|
FSOUND_SetPan(handle, FSOUND_STEREOPAN);
|
175
193
|
}
|
@@ -180,12 +198,15 @@ Gosu::SampleInstance Gosu::Sample::play(double volume, double speed) const
|
|
180
198
|
return result;
|
181
199
|
}
|
182
200
|
|
183
|
-
Gosu::SampleInstance Gosu::Sample::playPan(double pan, double volume,
|
201
|
+
Gosu::SampleInstance Gosu::Sample::playPan(double pan, double volume,
|
202
|
+
double speed, bool looping) const
|
184
203
|
{
|
185
204
|
int handle = FSOUND_PlaySound(FSOUND_FREE, data->rep);
|
186
205
|
int freq;
|
187
206
|
if (handle > 0)
|
188
207
|
{
|
208
|
+
if (looping)
|
209
|
+
FSOUND_SetLoopMode(handle, FSOUND_LOOP_NORMAL);
|
189
210
|
freq = FSOUND_GetFrequency(handle);
|
190
211
|
}
|
191
212
|
|
@@ -207,7 +228,9 @@ protected:
|
|
207
228
|
public:
|
208
229
|
virtual ~BaseData() {}
|
209
230
|
|
210
|
-
virtual void play() = 0;
|
231
|
+
virtual void play(bool looping) = 0;
|
232
|
+
virtual void pause() = 0;
|
233
|
+
virtual bool paused() const = 0;
|
211
234
|
virtual void stop() = 0;
|
212
235
|
|
213
236
|
double volume() const
|
@@ -254,8 +277,8 @@ public:
|
|
254
277
|
}
|
255
278
|
#endif
|
256
279
|
|
257
|
-
stream = FSOUND_Stream_Open(&buffer[0], FSOUND_LOADMEMORY
|
258
|
-
buffer.size());
|
280
|
+
stream = FSOUND_Stream_Open(&buffer[0], FSOUND_LOADMEMORY | FSOUND_LOOP_NORMAL,
|
281
|
+
0, buffer.size());
|
259
282
|
if (stream == 0)
|
260
283
|
throwLastFMODError();
|
261
284
|
|
@@ -274,15 +297,33 @@ public:
|
|
274
297
|
FSOUND_Stream_Close(stream);
|
275
298
|
}
|
276
299
|
|
277
|
-
void play()
|
300
|
+
void play(bool looping)
|
278
301
|
{
|
279
|
-
handle
|
302
|
+
if (handle == -1)
|
303
|
+
{
|
304
|
+
handle = FSOUND_Stream_Play(FSOUND_FREE, stream);
|
305
|
+
FSOUND_Stream_SetLoopCount(stream, looping ? -1 : 0);
|
306
|
+
}
|
307
|
+
else if (paused())
|
308
|
+
FSOUND_SetPaused(handle, 0);
|
280
309
|
applyVolume();
|
281
310
|
}
|
282
311
|
|
312
|
+
void pause()
|
313
|
+
{
|
314
|
+
if (handle != -1)
|
315
|
+
FSOUND_SetPaused(handle, 1);
|
316
|
+
}
|
317
|
+
|
318
|
+
bool paused() const
|
319
|
+
{
|
320
|
+
return handle != -1 && FSOUND_GetPaused(handle);
|
321
|
+
}
|
322
|
+
|
283
323
|
void stop()
|
284
324
|
{
|
285
325
|
fmodCheck(FSOUND_Stream_Stop(stream));
|
326
|
+
handle = -1; // The end callback is NOT being called!
|
286
327
|
}
|
287
328
|
|
288
329
|
void applyVolume()
|
@@ -321,15 +362,30 @@ public:
|
|
321
362
|
FMUSIC_FreeSong(module_);
|
322
363
|
}
|
323
364
|
|
324
|
-
void play()
|
365
|
+
void play(bool looping)
|
325
366
|
{
|
326
|
-
|
367
|
+
if (paused())
|
368
|
+
FMUSIC_SetPaused(module_, 0);
|
369
|
+
else
|
370
|
+
FMUSIC_PlaySong(module_);
|
371
|
+
FMUSIC_SetLooping(module_, looping);
|
327
372
|
applyVolume();
|
328
373
|
}
|
374
|
+
|
375
|
+
void pause()
|
376
|
+
{
|
377
|
+
FMUSIC_SetPaused(module_, 1);
|
378
|
+
}
|
379
|
+
|
380
|
+
bool paused() const
|
381
|
+
{
|
382
|
+
return FMUSIC_GetPaused(module_);
|
383
|
+
}
|
329
384
|
|
330
385
|
void stop()
|
331
386
|
{
|
332
387
|
fmodCheck(FMUSIC_StopSong(module_));
|
388
|
+
FMUSIC_SetPaused(module_, false);
|
333
389
|
}
|
334
390
|
|
335
391
|
void applyVolume()
|
@@ -381,20 +437,37 @@ Gosu::Song::~Song()
|
|
381
437
|
stop();
|
382
438
|
}
|
383
439
|
|
384
|
-
|
440
|
+
Gosu::Song* Gosu::Song::currentSong()
|
385
441
|
{
|
386
|
-
|
442
|
+
return curSong;
|
443
|
+
}
|
444
|
+
|
445
|
+
void Gosu::Song::play(bool looping)
|
446
|
+
{
|
447
|
+
if (curSong && curSong != this)
|
448
|
+
{
|
387
449
|
curSong->stop();
|
450
|
+
assert(curSong == 0);
|
451
|
+
}
|
452
|
+
|
453
|
+
data->play(looping);
|
454
|
+
curSong = this; // may be redundant
|
455
|
+
}
|
388
456
|
|
389
|
-
|
457
|
+
void Gosu::Song::pause()
|
458
|
+
{
|
459
|
+
if (curSong == this)
|
460
|
+
data->pause(); // may be redundant
|
461
|
+
}
|
390
462
|
|
391
|
-
|
392
|
-
|
463
|
+
bool Gosu::Song::paused() const
|
464
|
+
{
|
465
|
+
return curSong == this && data->paused();
|
393
466
|
}
|
394
467
|
|
395
468
|
void Gosu::Song::stop()
|
396
469
|
{
|
397
|
-
if (
|
470
|
+
if (curSong == this)
|
398
471
|
{
|
399
472
|
data->stop();
|
400
473
|
curSong = 0;
|
@@ -403,7 +476,7 @@ void Gosu::Song::stop()
|
|
403
476
|
|
404
477
|
bool Gosu::Song::playing() const
|
405
478
|
{
|
406
|
-
return curSong == this;
|
479
|
+
return curSong == this && !data->paused();
|
407
480
|
}
|
408
481
|
|
409
482
|
double Gosu::Song::volume() const
|