/* $Id: audio.hpp,v 1.26 2005/12/19 12:11:53 chfreund Exp $ */ #ifndef _AUDIO_HPP_ #define _AUDIO_HPP_ #include "vector.hpp" #include #include #include #include class Audio { protected: Audio(); ~Audio(); public: //! Disables audio output. static void setQuiet( const bool quiet ) { m_quiet = quiet; } static bool getQuiet( void ) { return m_quiet; } //! get a pointer to the singleton instance static Audio* getInstance( void ) { if ( !m_instance ) { m_instance = new Audio(); } return m_instance; } //! delete the singleton instance static void deleteInstance( void ) { delete m_instance; m_instance = 0x0; } //! Called frequently to do its chores, e.g. jukebox handling. static void update( void ); Mix_Chunk* loadSound( const char* filename ) const; //! Plays sound. void playSound( Mix_Chunk* chunk ); //! Plays sound with respect to the relative audio source position. void playSound( Mix_Chunk* chunk, const int sourcePositionX, const int sourcePositionY ); void playSound( Mix_Chunk* chunk, const Vector& sourcePos ) { playSound( chunk, ROUND( sourcePos.x ), ROUND( sourcePos.y )); } //! Updates the listening position of the player. So far this method is //! only called from within Client::updateGraphics. void setListeningPosition( const int listeningPositionX, const int listeningPositionY ) { m_listeningPositionX = listeningPositionX; m_listeningPositionY = listeningPositionY; } //! Dumps the audio stream to a file if called with a filename. If called //! with NULL it stops dumping. Thanks to gltron on #sdl @ irc.freenode.net bool dumpToFile( const char* filename ); void startRecording( void ); void stopRecording( void ); void nextRecordFrame( void ); void writeRecordToFile( const char* filename ); void setLowPassFilter ( const double val ) const; static bool loadTrack( int track = -1 ); // -1 means random track except menu track static void playTrack( void ); static void stopTrack( void ); static void fadeInTrack( const int time ); static void fadeOutTrack( const int time ); static void setJukeboxMode( const bool inJukeboxMode ); static void toggleJukeboxMode( void ) { setJukeboxMode( ! m_inJukeboxMode ); } static void increaseTrackVolume( void ) { if( Mix_FadingMusic() == MIX_NO_FADING ) Mix_VolumeMusic( Mix_VolumeMusic( -1 ) + 16 ); } static void decreaseTrackVolume() { if( Mix_FadingMusic() == MIX_NO_FADING ) Mix_VolumeMusic( Mix_VolumeMusic( -1 ) - 16 ); } private: static Audio* m_instance; //!< Instance for singleton. static bool m_quiet; //!< \c True if the audio output has been //! disabled or could not be initialized. //! Coordinates of the local player avatar. static int m_listeningPositionX, m_listeningPositionY; static FILE* m_outputFile; int m_chunksize; bool m_isRecording; std::vector*> m_recordVector; std::vector* m_currentRecordFrame; static bool m_lowPassFilterEnabled; // handling for music tracks struct TrackDesc{ std::string trackName; bool playMe; TrackDesc( const std::string& newTrackName ) : trackName( newTrackName ), playMe( true ) {} }; static std::vector m_track; static bool m_playNextTrack, m_inJukeboxMode; static Mix_Music* m_currentTrack; static void addTracksInDir( const int depth, const std::string& dir ); static void trackEnded( void ) { m_instance->m_playNextTrack = true; } }; #endif // _AUDIO_HPP_