Extra caution to avoid a segfault in the sound system

The earlier commit mostly avoids it, but it was still theoretically possible to segfault
This commit is contained in:
2020-01-26 17:19:06 -05:00
parent d530abe00b
commit 46f1e6ed86

View File

@@ -19,7 +19,27 @@
#include "mathutil.hpp" #include "mathutil.hpp"
#include "prefs.hpp" #include "prefs.hpp"
std::shared_ptr<sf::Sound> chan[4]; struct SoundChannel {
std::shared_ptr<sf::Sound> player;
std::shared_ptr<const sf::SoundBuffer> sound;
void play(const std::shared_ptr<const sf::SoundBuffer> what) {
sound = what;
player->setBuffer(*what);
player->play();
}
bool isPlaying() const {
return player->getStatus() == sf::Sound::Playing;
}
void reset() {
player.reset();
sound.reset();
}
void init() {
player.reset(new sf::Sound);
}
};
SoundChannel chan[4];
const int numchannel = 4; const int numchannel = 4;
int channel; int channel;
short snd_played[4]; short snd_played[4];
@@ -42,7 +62,7 @@ short store_last_sound_played;
bool sound_going(snd_num_t which_s) { bool sound_going(snd_num_t which_s) {
for(short i = 0; i < 4; i++) for(short i = 0; i < 4; i++)
if(snd_played[i] == which_s) if(snd_played[i] == which_s)
return chan[i]->getStatus() == sf::Sound::Playing; return chan[i].isPlaying();
return false; return false;
} }
@@ -58,7 +78,7 @@ static void exit_snd_tool() {
} }
void init_snd_tool(){ void init_snd_tool(){
for(auto& ch : chan) ch.reset(new sf::Sound); for(auto& ch : chan) ch.init();
atexit(exit_snd_tool); atexit(exit_snd_tool);
} }
@@ -89,11 +109,10 @@ void play_sound(snd_num_t which, sf::Time delay) { // if < 0, play asynch
which *= -1; which *= -1;
if(sndhandle) { if(sndhandle) {
chan[channel]->setBuffer(*sndhandle); chan[channel].play(sndhandle);
chan[channel]->play();
if(which > 0) { if(which > 0) {
while(chan[channel]->getStatus() == sf::Sound::Playing); while(chan[channel].isPlaying());
} }
snd_played[channel] = abs(which); snd_played[channel] = abs(which);
} }