/* ScummVM - Scumm Interpreter
 * Copyright (C) 2003-2004 The ScummVM project
 *
 * 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * $Header: /cvsroot/scummvm/scummvm/sword1/sound.h,v 1.13 2004/01/11 15:47:41 eriktorbjorn Exp $
 *
 */

#ifndef BSSOUND_H
#define BSSOUND_H

#include "object.h"
#include "sworddefs.h"
#include "common/file.h"
#include "sound/mixer.h"
#include "common/util.h"

class SoundMixer;

namespace Sword1 {

#define	TOTAL_FX_PER_ROOM	7		// total loop & random fx per room (see fx_list.c)
#define	MAX_ROOMS_PER_FX	7		// max no. of rooms in the fx's room,vol list
#define	MAX_FXQ_LENGTH		32		// max length of sound queue - ie. max number of fx that can be stored up/playing together

#define FX_SPOT 1
#define FX_LOOP 2
#define FX_RANDOM 3

struct QueueElement {
	uint32 id, delay;
	PlayingSoundHandle handle;
};

struct RoomVol {
	int32 roomNo, leftVol, rightVol;
};

struct FxDef {
	uint32 sampleId, type, delay;
	RoomVol roomVolList[MAX_ROOMS_PER_FX];
};

class ResMan;
#define WAVE_VOL_TAB_LENGTH 480
#define WAVE_VOL_THRESHOLD 190000 //120000

class Sound {
public:
	Sound(const char *searchPath, SoundMixer *mixer, ResMan *pResMan);
	~Sound(void);
	void setSpeechVol(uint8 volL, uint8 volR) { _speechVolL = volL; _speechVolR = volR; };
	void setSfxVol(uint8 volL, uint8 volR) { _sfxVolL = volL; _sfxVolR = volR; };
	void giveSpeechVol(uint8 *volL, uint8 *volR) { *volL = _speechVolL; *volR = _speechVolR; };
	void giveSfxVol(uint8 *volL, uint8 *volR) { *volL = _sfxVolL; *volR = _sfxVolR; };
	void newScreen(uint32 screen);
	void quitScreen(void);
	void closeCowSystem(void);

	bool startSpeech(uint16 roomNo, uint16 localNo);
	bool speechFinished(void);
	void stopSpeech();
	bool amISpeaking(void);

	void fnStopFx(int32 fxNo);
	int addToQueue(int32 fxNo);

	void engine(void);

private:
	uint8 _sfxVolL, _sfxVolR, _speechVolL, _speechVolR;
	void playSample(QueueElement *elem);
	void initCowSystem(void);

	int16 *uncompressSpeech(uint32 index, uint32 cSize, uint32 *size);
	void calcWaveVolume(int16 *data, uint32 length);
	bool _waveVolume[WAVE_VOL_TAB_LENGTH];
	uint16 _waveVolPos;
	File		 _cowFile;
	uint32		 *_cowHeader;
	uint32		 _cowHeaderSize;
	uint8		 _currentCowFile;
	PlayingSoundHandle _speechHandle, _fxHandle;
	Common::RandomSource _rnd;
	
	QueueElement _fxQueue[MAX_FXQ_LENGTH];
	uint8		 _endOfQueue;
	SoundMixer *_mixer;
	ResMan *_resMan;
	char _filePath[100];
	static const char _musicList[270];
	static const uint16 _roomsFixedFx[TOTAL_ROOMS][TOTAL_FX_PER_ROOM];
	static const FxDef _fxList[312];
};

} // End of namespace Sword1 

#endif //BSSOUND_H
