mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-10 21:03:31 +00:00
191 lines
4.9 KiB
C++
191 lines
4.9 KiB
C++
/* ScummVM - Graphic Adventure Engine
|
|
*
|
|
* ScummVM is the legal property of its developers, whose names
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
* file distributed with this source distribution.
|
|
*
|
|
* 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
|
|
* 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, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
*/
|
|
|
|
#ifndef TITANIC_MUSIC_ROOM_HANDLER_H
|
|
#define TITANIC_MUSIC_ROOM_HANDLER_H
|
|
|
|
#include "titanic/sound/audio_buffer.h"
|
|
#include "titanic/sound/music_room_instrument.h"
|
|
#include "titanic/sound/music_song.h"
|
|
#include "titanic/sound/wave_file.h"
|
|
|
|
namespace Titanic {
|
|
|
|
class CProjectItem;
|
|
class CSoundManager;
|
|
|
|
enum MusicInstrument { BELLS = 0, SNAKE = 1, PIANO = 2, BASS = 3 };
|
|
|
|
struct MusicRoomInstrument {
|
|
int _pitchControl;
|
|
int _speedControl;
|
|
bool _directionControl;
|
|
bool _inversionControl;
|
|
bool _muteControl;
|
|
MusicRoomInstrument() : _pitchControl(0), _speedControl(0), _directionControl(false),
|
|
_inversionControl(false), _muteControl(false) {}
|
|
};
|
|
|
|
class CMusicRoomHandler {
|
|
private:
|
|
CProjectItem *_project;
|
|
CSoundManager *_soundManager;
|
|
CMusicRoomInstrument *_instruments[4];
|
|
MusicRoomInstrument _array1[4];
|
|
MusicRoomInstrument _array2[4];
|
|
CMusicSong *_songs[4];
|
|
int _startPos[4];
|
|
int _position[4];
|
|
double _animExpiryTime[4];
|
|
|
|
bool _active;
|
|
CWaveFile *_waveFile;
|
|
int _soundHandle;
|
|
int _instrumentsActive;
|
|
CAudioBuffer *_audioBuffer;
|
|
bool _isPlaying;
|
|
uint _soundStartTicks;
|
|
uint _startTicks;
|
|
int _volume;
|
|
private:
|
|
/**
|
|
* Starts music room instruments animation
|
|
*/
|
|
void start();
|
|
|
|
/**
|
|
* Handles updating the raw audio being played for all the instruments
|
|
*/
|
|
void updateAudio();
|
|
|
|
/**
|
|
* Handles updating the instruments themselves, and keeping them animating
|
|
*/
|
|
void updateInstruments();
|
|
|
|
/**
|
|
* Polls a specified instrument for any updates to see if it's still active.
|
|
* @returns Returns true if a given instrument is still active..
|
|
* that is, that there is still more data that can be read from it to play
|
|
*/
|
|
bool pollInstrument(MusicInstrument instrument);
|
|
|
|
/**
|
|
* Gets the duration for a given fragment of an instrument to play
|
|
* out, so that animations of the instruments can be synchronized
|
|
* to the actual music
|
|
*/
|
|
double getAnimDuration(MusicInstrument instrument, int arrIndex);
|
|
|
|
/**
|
|
* Figures out a pitch value (of some sort) for use in determining
|
|
* which wave file the music instruments will use.
|
|
*/
|
|
int getPitch(MusicInstrument instrument, int arrIndex);
|
|
public:
|
|
CMusicRoomHandler(CProjectItem *project, CSoundManager *soundManager);
|
|
~CMusicRoomHandler();
|
|
|
|
/**
|
|
* Creates a new music room instrument class to handle the operation of one
|
|
* of the instruments in the music room.
|
|
* @param instrument Which instrument to create for
|
|
* @param count Number of Wave files the new instance will contain
|
|
*/
|
|
CMusicRoomInstrument *createInstrument(MusicInstrument instrument, int count);
|
|
|
|
/**
|
|
* Main setup for the music room handler
|
|
*/
|
|
void setup(int volume);
|
|
|
|
/**
|
|
* Flags whether the music handler is active
|
|
*/
|
|
void setActive(bool flag) { _active = flag; }
|
|
|
|
/**
|
|
* Stop playing the music
|
|
*/
|
|
void stop();
|
|
|
|
/**
|
|
* Checks the specified instrument to see if it's settings are "correct"
|
|
*/
|
|
bool checkInstrument(MusicInstrument instrument) const;
|
|
|
|
/**
|
|
* Sets the speed control value
|
|
*/
|
|
void setSpeedControl2(MusicInstrument instrument, int value);
|
|
|
|
/**
|
|
* Sets the pitch control value
|
|
*/
|
|
void setPitchControl2(MusicInstrument instrument, int value);
|
|
|
|
/**
|
|
* Sets the inversion control value
|
|
*/
|
|
void setInversionControl2(MusicInstrument instrument, bool value);
|
|
|
|
/**
|
|
* Sets the direction control value
|
|
*/
|
|
void setDirectionControl2(MusicInstrument instrument, bool value);
|
|
|
|
/**
|
|
* Sets the pitch control value
|
|
*/
|
|
void setPitchControl(MusicInstrument instrument, int value);
|
|
|
|
/**
|
|
* Sets the speed control value
|
|
*/
|
|
void setSpeedControl(MusicInstrument instrument, int value);
|
|
|
|
/**
|
|
* Sets the direction control value
|
|
*/
|
|
void setDirectionControl(MusicInstrument instrument, bool value);
|
|
|
|
/**
|
|
* Sets the inversion control value
|
|
*/
|
|
void setInversionControl(MusicInstrument instrument, bool value);
|
|
|
|
/**
|
|
* Sets the mute control value
|
|
*/
|
|
void setMuteControl(MusicInstrument instrument, bool value);
|
|
|
|
/**
|
|
* Handles regular updates
|
|
* @returns True if the music is still playing
|
|
*/
|
|
bool update();
|
|
};
|
|
|
|
} // End of namespace Titanic
|
|
|
|
#endif /* TITANIC_MUSIC_ROOM_HANDLER_H */
|