/* orxonox - the future of 3D-vertical-scrollers Copyright (C) 2004 orx 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 2, or (at your option) any later version. ### File Specific: main-programmer: Simon Hofmann co-programmer: */ #include "Sound_control.h" #include #include "SDL_mixer.h" using namespace std; /** \brief standard constructor This constructor builds a SoundControl Object, which waits for callers calling its functions to output sound. All sound output is handles by this object, which must only be constructed once. */ SoundControl::SoundControl () { //setup parameters int audio_rate = MIX_DEFAULT_FREQUENCY, audio_channels = MIX_DEFAULT_CHANNELS, audio_buffers = 8192, bits = 0; Uint16 audio_format = MIX_DEFAULT_FORMAT; Mix_Music* music = NULL; //initializing sound and calling Mix_OpenAudio if(SDL_Init(SDL_INIT_AUDIO)<0){ printf("SDL_Init:\n"); exit(1); } if(Mix_OpenAudio(audio_rate, audio_format, audio_channels, audio_buffers)){ printf("Mix_OpenAudio:\n"); exit(1); } postConstruction(); } /** \brief standard destructor */ SoundControl::~SoundControl () { } /** \brief Is called by SoundControl object to initiate all values */ void SoundControl::postConstruction () { // Print some info Mix_QuerySpec(&audio_rate, &audio_format, &audio_channels); bits=audio_format&0xFF; printf("Opened audio at %d Hz %d bit %s, %d bytes audio buffer\n", audio_rate, bits, audio_channels > 1 ? "stereo" : "mono", audio_buffers ); int volume = SDL_MIX_MAXVOLUME; Mix_VolumeMusic(volume); int track_number = 1; int done = 0; int free = 1; } /** \brief Returns false if a sound_control object has been made */ void SoundControl::isFree () { return free; } /** \brief Sets the number of output Channels */ void SoundControl::setNumberOfChannels (int number_of_channels) { Mix_AllocateChannels(number_of_channels); } /** \brief May be called from any WorldEntity to play a .xm file \param filename: self-explanatory */ void SoundControl::playMod (char* fileName) { } /** \brief May be called from any WorldEntity to play a .wav file \param filename: self-explanatory */ void SoundControl::playWav (char* fileName) { Mix_Chunk* chunk = NULL; chunk = Mix_LoadWAV(fileName); if(Mix_PlayChannel(-1, chunk, 0) == -1) { printf("Mix_PlayChannel: %s\n", Mix_GetError()); } } /** \brief May be called from any WorldEntity to play a .ogg file \param filename: self-explanatory */ void SoundControl::playOgg (char* fileName) { Mix_Music* music = NULL; music = Mix_LoadMUS(fileName); if(Mix_PlayMusic(music, 1) == -1){ printf("Mix_PlayMusic: %s\n",Mix_GetError()); } Mix_HookMusicFinished(musicDone); } /** \brief Heightens the overall volume of output */ void SoundControl::volumeUp () { volume = (volume + 1) << 1; if(volume > SDL_MIX_MAXVOLUME) volume = SDL_MIX_MAXVOLUME; Mix_VolumeMusic(volume); } /** \brief Lowers the overall volume of output */ void SoundControl::volumeDown () { volume >>= 1; Mix_VolumeMusic(volume); } /** \brief Rewinds music to the beginning */ void SoundControl::trackRewind () { Mix_RewindMusic(); } /** \brief Rewinds the music 5 seconds */ void SoundControl::forwardMusic () { Mix_SetMusicPosition(+5); } /** \brief Forwards the music 5 seconds */ void SoundControl::rewindMusic () { Mix_SetMusicPosition(-5); } /** \brief Pauses music output */ void SoundControl::pauseMusic () { Mix_PauseMusic() } /** \brief this function pauses music output */ void SoundControl::resumeMusic () { Mix_ResumeMusic() } /** \brief Selects the track of all orxonox tracks */ void SoundControl::trackSelect () { switch (track_number) { case 1: music = Mix_LoadMUS("luke_grey_orxonox1.ogg"); break; case 2: music = Mix_LoadMUS("luke_grey_orxonox2.ogg"); break; case 3: music = Mix_LoadMUS("luke_grey_orxonox3.ogg"); break; case 4: music = Mix_LoadMUS("luke_grey_and aquarius_orxonox.ogg"); break; case 5: music = Mix_LoadMUS("nomenes_orxonox.ogg"); break; } } /** \brief Called by playOgg */ void SoundControl::musicDone () { track_number++; }