1 /*
2   libSDL2pp - C++11 bindings/wrapper for SDL2
3   Copyright (C) 2015-2017 Dmitry Marakasov <amdmi3@amdmi3.ru>
4 
5   This software is provided 'as-is', without any express or implied
6   warranty.  In no event will the authors be held liable for any damages
7   arising from the use of this software.
8 
9   Permission is granted to anyone to use this software for any purpose,
10   including commercial applications, and to alter it and redistribute it
11   freely, subject to the following restrictions:
12 
13   1. The origin of this software must not be misrepresented; you must not
14      claim that you wrote the original software. If you use this software
15      in a product, an acknowledgment in the product documentation would be
16      appreciated but is not required.
17   2. Altered source versions must be plainly marked as such, and must not be
18      misrepresented as being the original software.
19   3. This notice may not be removed or altered from any source distribution.
20 */
21 
22 #ifndef SDL2PP_MUSIC_HH
23 #define SDL2PP_MUSIC_HH
24 
25 #include <string>
26 
27 #include <SDL_mixer.h>
28 
29 #include <SDL2pp/Export.hh>
30 
31 namespace SDL2pp {
32 
33 class RWops;
34 
35 ////////////////////////////////////////////////////////////
36 /// \brief %Music data
37 ///
38 /// \ingroup mixer
39 ///
40 /// \headerfile SDL2pp/Music.hh
41 ///
42 ////////////////////////////////////////////////////////////
43 class SDL2PP_EXPORT Music {
44 private:
45 	Mix_Music* music_;    ///< Managed Mix_Music object
46 
47 public:
48 	////////////////////////////////////////////////////////////
49 	/// \brief Construct from existing Mix_Music pointer
50 	///
51 	/// \param[in] music Existing Mix_Music to manage
52 	///
53 	////////////////////////////////////////////////////////////
54 	explicit Music(Mix_Music* music);
55 
56 	////////////////////////////////////////////////////////////
57 	/// \brief Load music file
58 	///
59 	/// \param[in] file Name of music file to use
60 	///
61 	/// \throws SDL2pp::Exception
62 	///
63 	/// \see https://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer.html#SEC55
64 	///
65 	////////////////////////////////////////////////////////////
66 	explicit Music(const std::string& file);
67 
68 	////////////////////////////////////////////////////////////
69 	/// \brief Load music using RWops
70 	///
71 	/// This uses undocumented SDL_Mixer function. Comment
72 	/// in SDL_mixer.h suggests it's only indended to work with
73 	/// Ogg and MikMod.
74 	///
75 	/// \param[in] rwops SDL2pp::RWops used to access music data
76 	///
77 	/// \throws SDL2pp::Exception
78 	///
79 	////////////////////////////////////////////////////////////
80 	explicit Music(RWops& rwops);
81 
82 	////////////////////////////////////////////////////////////
83 	/// \brief Load music using RWops
84 	///
85 	/// This uses undocumented SDL_Mixer function.
86 	///
87 	/// \param[in] rwops SDL2pp::RWops used to access music data
88 	/// \param[in] type Music type to load
89 	///
90 	/// \throws SDL2pp::Exception
91 	///
92 	////////////////////////////////////////////////////////////
93 	Music(RWops& rwops, Mix_MusicType type);
94 
95 	////////////////////////////////////////////////////////////
96 	/// \brief Destructor
97 	///
98 	/// \see https://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer.html#SEC56
99 	///
100 	////////////////////////////////////////////////////////////
101 	~Music();
102 
103 	////////////////////////////////////////////////////////////
104 	/// \brief Move constructor
105 	///
106 	/// \param[in] other SDL2pp::Music object to move data from
107 	///
108 	////////////////////////////////////////////////////////////
109 	Music(Music&& other) noexcept;
110 
111 	////////////////////////////////////////////////////////////
112 	/// \brief Move assignment operator
113 	///
114 	/// \param[in] other SDL2pp::Music object to move data from
115 	///
116 	/// \returns Reference to self
117 	///
118 	////////////////////////////////////////////////////////////
119 	Music& operator=(Music&& other) noexcept;
120 
121 	////////////////////////////////////////////////////////////
122 	/// \brief Deleted copy constructor
123 	///
124 	/// This class is not copyable
125 	///
126 	////////////////////////////////////////////////////////////
127 	Music(const Music& other) = delete;
128 
129 	////////////////////////////////////////////////////////////
130 	/// \brief Deleted assignment operator
131 	///
132 	/// This class is not copyable
133 	///
134 	////////////////////////////////////////////////////////////
135 	Music& operator=(const Music& other) = delete;
136 
137 	////////////////////////////////////////////////////////////
138 	/// \brief Get pointer to managed Mix_Music
139 	///
140 	/// \returns Pointer to managed Mix_Music
141 	///
142 	////////////////////////////////////////////////////////////
143 	Mix_Music* Get() const;
144 
145 	////////////////////////////////////////////////////////////
146 	/// \brief Get the music encoding type
147 	///
148 	/// \returns The type of music
149 	///
150 	////////////////////////////////////////////////////////////
151 	Mix_MusicType GetType() const;
152 };
153 
154 }
155 
156 #endif
157