--- /dev/null
+/* === 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++/signal.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 to 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