sdl2_impl 0.1.0
Vendor SDL2 2.32 : IGraphic2Module / IAudioModule
Loading...
Searching...
No Matches
SdlMusic.hpp
Go to the documentation of this file.
1
11#ifndef SDLMUSIC_HPP_
12#define SDLMUSIC_HPP_
13
14//Sdl
15#include <SDL_mixer.h>
16
17//Interface
18#include "IMusic.hpp"
19
20#include <iostream>
21#include <string>
22
32class SdlMusic : public audio::IMusic {
33
34 public:
35 SdlMusic(std::string path) {
36 _music = Mix_LoadMUS(path.c_str());
37 if (!_music)
38 std::cerr << "Failed to load music: " << Mix_GetError() << std::endl;
39 }
40
41 ~SdlMusic() override {
42 if (mine())
43 Mix_HaltMusic();
44 if (_music)
45 Mix_FreeMusic(_music);
46 }
47
48 bool isReady() const override { return _music != nullptr; }
49
50 void play() override {
51 if (!_music)
52 return;
53 if (mine() && Mix_PausedMusic()) {
54 Mix_ResumeMusic();
55 return;
56 }
57 Mix_PlayMusic(_music, _loop ? -1 : 0);
58 _current = _music;
59 Mix_VolumeMusic(static_cast<int>(_volume * MIX_MAX_VOLUME));
60 }
61
62 void pause() override {
63 if (mine())
64 Mix_PauseMusic();
65 }
66
67 void stop() override {
68 if (mine()) {
69 Mix_HaltMusic();
70 _current = nullptr;
71 }
72 _elapsed = 0.f;
73 }
74
76 void update() override {}
77
78 void setVolume(float volume) override {
79 _volume = volume;
80 if (mine())
81 Mix_VolumeMusic(static_cast<int>(volume * MIX_MAX_VOLUME));
82 }
83
84 float getVolume() const override { return _volume; }
85
86 /* La boucle se decide au lancement (Mix_PlayMusic prend le nombre de
87 * tours) : la changer en cours de route ne prend effet qu'au
88 * prochain play(). */
89 void setLoop(bool loop) override { _loop = loop; }
90 bool getLoop() const override { return _loop; }
91
92 void setTime(float position) override {
93 if (!mine())
94 return;
95 Mix_RewindMusic();
96 if (Mix_SetMusicPosition(position) == 0)
97 _elapsed = position;
98 }
99
100 /* SDL_mixer ne sait pas dire ou en est la lecture pour tous les
101 * formats : on rend la derniere position DEMANDEE, ce qui est
102 * exact apres un setTime() et vaut 0 depuis le debut. */
103 float getTime() const override { return _elapsed; }
104
105 float getLength() const override {
106 if (!_music)
107 return 0.f;
108
109 const double length = Mix_MusicDuration(_music);
110
111 return (length < 0) ? 0.f : static_cast<float>(length);
112 }
113
114 //aucune spatialisation sur le canal musique : retenu, jamais applique
115 void setPosition(Vector3f position) override { _position = position; }
116 Vector3f getPosition() const override { return _position; }
117
118 void setVelocity(Vector3f velocity) override { _velocity = velocity; }
119 Vector3f getVelocity() const override { return _velocity; }
120
121 private:
123 bool mine() const { return _music != nullptr && _current == _music; }
124
125 Mix_Music *_music = nullptr;
126
128 static inline Mix_Music *_current = nullptr;
129
130 float _volume = 1.f;
131 bool _loop = false;
132 float _elapsed = 0.f;
133 Vector3f _position{0, 0, 0};
134 Vector3f _velocity{0, 0, 0};
135};
136
139#endif /* !SDLMUSIC_HPP_ */
Un flux long, decode au fil de la lecture.
Definition SdlMusic.hpp:32
void update() override
SDL_mixer decode sur son propre fil : rien a pousser par frame.
Definition SdlMusic.hpp:76
float getVolume() const override
Definition SdlMusic.hpp:84
void stop() override
Definition SdlMusic.hpp:67
SdlMusic(std::string path)
Definition SdlMusic.hpp:35
void setVelocity(Vector3f velocity) override
Definition SdlMusic.hpp:118
void pause() override
Definition SdlMusic.hpp:62
~SdlMusic() override
Definition SdlMusic.hpp:41
void play() override
Definition SdlMusic.hpp:50
void setTime(float position) override
Definition SdlMusic.hpp:92
void setPosition(Vector3f position) override
Definition SdlMusic.hpp:115
bool isReady() const override
Definition SdlMusic.hpp:48
Vector3f getPosition() const override
Definition SdlMusic.hpp:116
Vector3f getVelocity() const override
Definition SdlMusic.hpp:119
void setLoop(bool loop) override
Definition SdlMusic.hpp:89
float getLength() const override
Definition SdlMusic.hpp:105
float getTime() const override
Definition SdlMusic.hpp:103
void setVolume(float volume) override
Definition SdlMusic.hpp:78
bool getLoop() const override
Definition SdlMusic.hpp:90