X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Faudio%2Fsound_manager.hpp;h=7056b0dc5a34e9b8fbce2cb9597bd9d5479c090b;hb=8e52a5b000d732e96b1cc461163c4778b434dc27;hp=f385f49c77f76083c198169fad4b4d047c10a98c;hpb=44f45ae77b5c6602909ff7a872121b607c521da6;p=supertux.git diff --git a/src/audio/sound_manager.hpp b/src/audio/sound_manager.hpp index f385f49c7..7056b0dc5 100644 --- a/src/audio/sound_manager.hpp +++ b/src/audio/sound_manager.hpp @@ -1,21 +1,39 @@ -#ifndef __SOUND_MANAGER_H__ -#define __SOUND_MANAGER_H__ +// SuperTux +// Copyright (C) 2006 Matthias Braun +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#ifndef HEADER_SUPERTUX_AUDIO_SOUND_MANAGER_HPP +#define HEADER_SUPERTUX_AUDIO_SOUND_MANAGER_HPP -#include "math/vector.hpp" +#include +#include #include #include -#include -#include -#include +#include +#include -typedef void* SoundHandle; +#include "math/vector.hpp" +#include "util/currenton.hpp" class SoundFile; class SoundSource; class StreamSoundSource; +class OpenALSoundSource; -class SoundManager +class SoundManager : public Currenton { public: SoundManager(); @@ -26,29 +44,56 @@ public: * Creates a new sound source object which plays the specified soundfile. * You are responsible for deleting the sound source later (this will stop the * sound). - * This function might throw exceptions. It returns 0 if no audio device is - * available. + * This function never throws exceptions, but might return a DummySoundSource */ - SoundSource* create_sound_source(const std::string& filename); + std::unique_ptr create_sound_source(const std::string& filename); /** * Convenience function to simply play a sound at a given position. */ void play(const std::string& name, const Vector& pos = Vector(-1, -1)); + /** + * Adds the source to the list of managed sources (= the source gets deleted + * when it finished playing) + */ + void manage_source(std::unique_ptr source); + /// preloads a sound, so that you don't get a lag later when playing it + void preload(const std::string& name); - void set_listener_position(Vector position); - void set_listener_velocity(Vector velocity); + void set_listener_position(const Vector& position); + void set_listener_velocity(const Vector& velocity); void enable_music(bool music_enabled); - void play_music(const std::string& filename); + void play_music(const std::string& filename, bool fade = false); + void pause_music(float fadetime = 0); + void resume_music(float fadetime = 0); + void stop_music(float fadetime = 0); + + bool is_music_enabled() { return music_enabled; } + bool is_sound_enabled() { return sound_enabled; } + + bool is_audio_enabled() { + return device != 0 && context != 0; + } void update(); + /* + * Tell soundmanager to call update() for stream_sound_source. + */ + void register_for_update( StreamSoundSource* sss ); + /* + * Unsubscribe from updates for stream_sound_source. + */ + void remove_from_update( StreamSoundSource* sss ); + private: - friend class SoundSource; + friend class OpenALSoundSource; friend class StreamSoundSource; - static ALuint load_file_into_buffer(const std::string& filename); - static ALenum get_sample_format(SoundFile* file); + /** creates a new sound source, might throw exceptions, never returns NULL */ + std::unique_ptr intern_create_sound_source(const std::string& filename); + static ALuint load_file_into_buffer(SoundFile& file); + static ALenum get_sample_format(const SoundFile& file); void print_openal_version(); void check_alc_error(const char* message); @@ -60,14 +105,22 @@ private: typedef std::map SoundBuffers; SoundBuffers buffers; - typedef std::vector SoundSources; + typedef std::vector > SoundSources; SoundSources sources; - StreamSoundSource* music_source; + typedef std::vector StreamSoundSources; + StreamSoundSources update_list; + + std::unique_ptr music_source; bool music_enabled; std::string current_music; + +private: + SoundManager(const SoundManager&); + SoundManager& operator=(const SoundManager&); }; #endif +/* EOF */