From abef5eab53c6c75cd602fdabdec94259d1523858 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sun, 26 Jul 2009 17:55:52 +0000 Subject: [PATCH] Fix some uninitialized variables and memory leaks Add a Jukebox class for playing background music --- source/jukebox.cpp | 113 +++++++++++++++++++++++++++++++++++++++++++++ source/jukebox.h | 50 ++++++++++++++++++++ source/sound.cpp | 7 +-- source/source.cpp | 6 +-- 4 files changed, 170 insertions(+), 6 deletions(-) create mode 100644 source/jukebox.cpp create mode 100644 source/jukebox.h diff --git a/source/jukebox.cpp b/source/jukebox.cpp new file mode 100644 index 0000000..3cd5e08 --- /dev/null +++ b/source/jukebox.cpp @@ -0,0 +1,113 @@ +/* $Id$ + +This file is part of libmspal +Copyright © 2009 Mikko Rasa, Mikkosoft Productions +Distributed under the LGPL +*/ + +#include +#include +#include "jukebox.h" +#include "sound.h" + +using namespace std; + +namespace Msp { +namespace AL { + +Jukebox::Jukebox(): + streamer(source), + sound(0), + shuffle(false) +{ } + +Jukebox::~Jukebox() +{ + streamer.stop(); + delete sound; +} + +void Jukebox::add_track(const string &trk) +{ + bool was_empty=tracks.empty(); + tracks.push_back(trk); + if(was_empty) + current_track=tracks.begin(); +} + +void Jukebox::remove_track(const string &trk) +{ + list::iterator i=find(tracks.begin(), tracks.end(), trk); + if(i!=tracks.end()) + { + if(i==current_track) + next(); + tracks.erase(i); + } +} + +void Jukebox::clear_tracks() +{ + stop(); + tracks.clear(); +} + +void Jukebox::set_shuffle(bool s) +{ + shuffle=s; +} + +void Jukebox::play() +{ + if(tracks.empty() || sound) + return; + + sound=new AL::Sound; + sound->open_file(*current_track); + streamer.play(*sound); +} + +void Jukebox::next() +{ + stop(); + if(tracks.size()>1) + { + if(shuffle) + { + while(1) + { + list::iterator i=tracks.begin(); + advance(i, rand()%tracks.size()); + if(i!=current_track) + { + current_track = i; + break; + } + } + } + else + { + ++current_track; + if(current_track==tracks.end()) + current_track=tracks.begin(); + } + } + play(); +} + +void Jukebox::stop() +{ + streamer.stop(); + delete sound; + sound=0; +} + +void Jukebox::tick() +{ + streamer.tick(); + if(sound && sound->eof()) + next(); +} + +} // namespace AL +} // namespace Msp diff --git a/source/jukebox.h b/source/jukebox.h new file mode 100644 index 0000000..2b4e0cd --- /dev/null +++ b/source/jukebox.h @@ -0,0 +1,50 @@ +/* $Id$ + +This file is part of libmspal +Copyright © 2009 Mikko Rasa, Mikkosoft Productions +Distributed under the LGPL +*/ + +#ifndef MSP_AL_JUKEBOX_H_ +#define MSP_AL_JUKEBOX_H_ + +#include +#include +#include "source.h" +#include "streamer.h" + +namespace Msp { +namespace AL { + +class Sound; + +class Jukebox +{ +private: + Source source; + Streamer streamer; + Sound *sound; + std::list tracks; + std::list::iterator current_track; + bool shuffle; + +public: + Jukebox(); + ~Jukebox(); + + Source &get_source() { return source; } + void add_track(const std::string &); + void remove_track(const std::string &); + void clear_tracks(); + void set_shuffle(bool); + + void play(); + void next(); + void stop(); + void tick(); +}; + +} // namespace AL +} // namespace Msp + +#endif diff --git a/source/sound.cpp b/source/sound.cpp index 8b6af20..1559605 100644 --- a/source/sound.cpp +++ b/source/sound.cpp @@ -1,7 +1,7 @@ /* $Id$ This file is part of libmspal -Copyright © 2008 Mikko Rasa, Mikkosoft Productions +Copyright © 2008-2009 Mikko Rasa, Mikkosoft Productions Distributed under the LGPL */ @@ -46,9 +46,10 @@ int memory_seek(void *src, ogg_int64_t offset, int whence) return memsrc.pos; } -void memory_close(void *src) +int memory_close(void *src) { delete reinterpret_cast(src); + return 0; } long memory_tell(void *src) @@ -61,7 +62,7 @@ ov_callbacks memory_callbacks= { &memory_read, &memory_seek, - 0, + &memory_close, &memory_tell }; diff --git a/source/source.cpp b/source/source.cpp index ff04adf..348b41e 100644 --- a/source/source.cpp +++ b/source/source.cpp @@ -1,7 +1,7 @@ /* $Id$ This file is part of libmspal -Copyright © 2008 Mikko Rasa, Mikkosoft Productions +Copyright © 2008-2009 Mikko Rasa, Mikkosoft Productions Distributed under the LGPL */ @@ -122,14 +122,14 @@ void Source::clear_buffers() unsigned Source::get_buffers_queued() const { - int n; + int n=0; get_attribute(AL_BUFFERS_QUEUED, &n); return n; } unsigned Source::get_buffers_processed() const { - int n; + int n=0; get_attribute(AL_BUFFERS_PROCESSED, &n); return n; } -- 2.45.2