////////////////////////////////////////////////////////////////////////////////
//    Scorched3D (c) 2000-2003
//
//    This file is part of Scorched3D.
//
//    Scorched3D 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.
//
//    Scorched3D 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 Scorched3D; if not, write to the Free Software
//    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
////////////////////////////////////////////////////////////////////////////////

#include <sound/SoundBufferStaticWav.h>
#include <sound/Sound.h>
#include <AL/al.h>
#include <AL/alut.h>

SoundBufferStaticWavSourceInstance::SoundBufferStaticWavSourceInstance(
	unsigned int source, unsigned int buffer) :
	SoundBufferSourceInstance(source), buffer_(buffer)
{
}

SoundBufferStaticWavSourceInstance::~SoundBufferStaticWavSourceInstance()
{
}

void SoundBufferStaticWavSourceInstance::play(bool repeat)
{
	if (!buffer_) return;

	alSourcei(source_, AL_BUFFER, 0);
    alSourcei(source_, AL_BUFFER, buffer_);
	alSourcei(source_, AL_LOOPING, (repeat?AL_TRUE:AL_FALSE));
	alSourcePlay(source_);
}

void SoundBufferStaticWavSourceInstance::stop()
{
	if (!buffer_) return;
	alSourceStop(source_);
}

void SoundBufferStaticWavSourceInstance::simulate(bool repeat)
{
}

SoundBufferStaticWav::SoundBufferStaticWav(const char *fileName) : 
	SoundBuffer(fileName),
	buffer_(0)
{
	unsigned int error;

	// Create a buffer
	alGetError();
	alGenBuffers(1, &buffer_);
	if ((error = alGetError()) != AL_NO_ERROR)
	{
		return;
	}

	// Load WAV
	void *data;
	ALenum format;
	ALsizei size;
	ALsizei freq;
	ALboolean loop;

#ifdef __DARWIN__
	alutLoadWAVFile((ALbyte*) fileName,&format,&data,&size,&freq);
#else
	alutLoadWAVFile((ALbyte*) fileName,&format,&data,&size,&freq,&loop);
#endif

	if ((error = alGetError()) != AL_NO_ERROR)
	{
		return;
	}

	// Load WAV into buffer
	alBufferData(buffer_,format,data,size,freq);
	if ((error = alGetError()) != AL_NO_ERROR)
	{
		return;
	}

	// Delete WAV memory
	alutUnloadWAV(format,data,size,freq);
	if ((error = alGetError()) != AL_NO_ERROR)
	{
		return;
	}
}

SoundBufferStaticWav::~SoundBufferStaticWav()
{
	if (buffer_) alDeleteBuffers (1, &buffer_);
	buffer_ = 0;
}

SoundBufferSourceInstance *SoundBufferStaticWav::createSourceInstance(unsigned int source)
{
	return new SoundBufferStaticWavSourceInstance(source, buffer_);
}
