#include "StreamDescriptor.h"

using namespace SoundSystem;


StreamDescriptor::StreamDescriptor(void) : SoundDescriptor()
{
	stream = NULL;
	loaded = false;
}

StreamDescriptor::~StreamDescriptor(void)
{
	if (isLoaded())
	{
		free();
	}
}

void StreamDescriptor::load(bool loop)
{
	if (isLoaded())
	{
		free();
	}
	// par defaut, on charge les sons en 16 bits, hardware 3D, on force le mono (sinon les son hardware ne peuvent
	// par etre joué en 3D), sans looping et on a absolument pas besoin des tags...
	int flags = FSOUND_16BITS|FSOUND_HW3D|FSOUND_FORCEMONO|FSOUND_IGNORETAGS;
	if (loop)
	{
		flags |= FSOUND_LOOP_NORMAL;
		printf("loop\n");
	}
	else
	{
		printf("non loop\n");
		flags |= FSOUND_LOOP_OFF;
	}
	stream = FSOUND_Stream_Open(path.c_str(),flags,0,0);
	// on verifie que le son soit bien chargé.
	loaded = (stream != NULL);
}

void StreamDescriptor::free()
{
	FSOUND_Stream_Close(stream);
	stream = NULL;
	loaded = false;
}

int StreamDescriptor::play()
{
	if (!canPlay()) return -1;
	// si le son n'est pas chargé en memoire, c'est peut etre que load n'a pas été appelé avant.
	if (!isLoaded())
	{
		// on essaie donc de la charger
		load(false);
		// si il n'est toujours pas chargé, c'est que le nom du fichier est probablement mauvais
		if (!isLoaded())
		{
			fprintf(stderr,"StreamDescriptor::play() : impossible de charger le son %s\n",path.c_str());
			fflush (stderr);
			return -1;
		}
	}
	channel = FSOUND_Stream_Play(FSOUND_FREE,stream);
	return channel;
}

bool StreamDescriptor::canPlay()
{
	return !FSOUND_IsPlaying(channel);
}

