/* === S Y N F I G ========================================================= */
/*!	\file audiocontainer.h
**	\brief Sound info header
**
**	$Id$
**
**	\legal
**	Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
**
**	This package 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 package 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.
**	\endlegal
*/
/* ========================================================================= */

/* === S T A R T =========================================================== */

#ifndef __SYNFIG_AUDIOCONTAINER_H
#define __SYNFIG_AUDIOCONTAINER_H

/* === H E A D E R S ======================================================= */
#include <sigc++/sigc++.h>

#include <ETL/handle>

#include <vector>
#include <string>

#include <synfig/time.h>

/* === M A C R O S ========================================================= */
const float DEF_DISPLAYSAMPLERATE = 400;
/* === T Y P E D E F S ===================================================== */

/* === C L A S S E S & S T R U C T S ======================================= */

namespace studio {

class AudioContainer;

//Note: Might want to abstract something to share data between profile and parent
class AudioProfile : public etl::shared_object
{
public:
	typedef std::vector<char>	SampleProfile;

private:
	SampleProfile	samples;
	double			samplerate; //samples / second of the profile

	//reference our parent for any native sound info
	etl::loose_handle<AudioContainer>	parent;

public:	//samples interface

	SampleProfile::const_iterator	begin() const 	{return samples.begin();}
	SampleProfile::const_iterator	end() const 	{return samples.end();}

	void clear();
	unsigned int size() const {return samples.size();}

	char operator[](int i) const
	{
		if(i >= 0 && i < (int)samples.size()) return samples[i];
		else return 0;
	}

public: //

	double get_samplerate() const {return samplerate;}
	void set_samplerate(double f) {samplerate = f;}

	double get_offset() const;

	etl::handle<AudioContainer>	get_parent() const;
	void set_parent(etl::handle<AudioContainer> i);
	friend class AudioContainer;
};

/*	Audio container actually implements all the cool stuff
	Note: May be a bit too monolithic...
*/
class AudioContainer : public sigc::trackable, public etl::shared_object
{
	etl::handle<AudioProfile>	prof;

	struct	AudioImp;
	AudioImp *imp;

	bool	profilevalid; //this is only half useful
		//it makes it so we don't always have to realloc memory when the file switches...

public: //structors

	AudioContainer();
	~AudioContainer();

public: //accessor interface
	void set_offset(const double &s);
	double get_offset() const;

public: //info gather interface
	etl::handle<AudioProfile>	get_profile(float samplerate = DEF_DISPLAYSAMPLERATE);
	bool get_current_time(double &out);

public: //operational interface
	bool load(const std::string &filename, const std::string &filedirectory = "");
	void clear();

	//play functions...
	void play(double t);
	void stop();
	//Note: this refers to the wrapper concept of the audio, the actual sound may or may not be playing...
	bool is_playing() const;

	//scrubbing functions...
	void start_scrubbing(double t);
	void stop_scrubbing();
	void scrub(double t); //!< if we are not currently scrubbing this will not work
	bool is_scrubbing() const;

	double scrub_time() const;

	bool isRunning() const;
	bool isPaused() const;
};

} // END of namespace studio

/* === E N D =============================================================== */

#endif
