1 /* === S Y N F I G ========================================================= */
2 /*!	\file audiocontainer.h
3 **	\brief Sound info header
4 **
5 **	$Id$
6 **
7 **	\legal
8 **	Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
9 **
10 **	This package is free software; you can redistribute it and/or
11 **	modify it under the terms of the GNU General Public License as
12 **	published by the Free Software Foundation; either version 2 of
13 **	the License, or (at your option) any later version.
14 **
15 **	This package is distributed in the hope that it will be useful,
16 **	but WITHOUT ANY WARRANTY; without even the implied warranty of
17 **	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 **	General Public License for more details.
19 **	\endlegal
20 */
21 /* ========================================================================= */
22 
23 /* === S T A R T =========================================================== */
24 
25 #ifndef __SYNFIG_AUDIOCONTAINER_H
26 #define __SYNFIG_AUDIOCONTAINER_H
27 
28 /* === H E A D E R S ======================================================= */
29 #include <sigc++/sigc++.h>
30 
31 #include <ETL/handle>
32 
33 #include <vector>
34 #include <string>
35 
36 #include <synfig/time.h>
37 
38 /* === M A C R O S ========================================================= */
39 const float DEF_DISPLAYSAMPLERATE = 400;
40 /* === T Y P E D E F S ===================================================== */
41 
42 /* === C L A S S E S & S T R U C T S ======================================= */
43 
44 namespace studio {
45 
46 class AudioContainer;
47 
48 //Note: Might want to abstract something to share data between profile and parent
49 class AudioProfile : public etl::shared_object
50 {
51 public:
52 	typedef std::vector<char>	SampleProfile;
53 
54 private:
55 	SampleProfile	samples;
56 	double			samplerate; //samples / second of the profile
57 
58 	//reference our parent for any native sound info
59 	etl::loose_handle<AudioContainer>	parent;
60 
61 public:	//samples interface
62 
begin()63 	SampleProfile::const_iterator	begin() const 	{return samples.begin();}
end()64 	SampleProfile::const_iterator	end() const 	{return samples.end();}
65 
66 	void clear();
size()67 	unsigned int size() const {return samples.size();}
68 
69 	char operator[](int i) const
70 	{
71 		if(i >= 0 && i < (int)samples.size()) return samples[i];
72 		else return 0;
73 	}
74 
75 public: //
76 
get_samplerate()77 	double get_samplerate() const {return samplerate;}
set_samplerate(double f)78 	void set_samplerate(double f) {samplerate = f;}
79 
80 	double get_offset() const;
81 
82 	etl::handle<AudioContainer>	get_parent() const;
83 	void set_parent(etl::handle<AudioContainer> i);
84 	friend class AudioContainer;
85 };
86 
87 /*	Audio container actually implements all the cool stuff
88 	Note: May be a bit too monolithic...
89 */
90 class AudioContainer : public sigc::trackable, public etl::shared_object
91 {
92 	etl::handle<AudioProfile>	prof;
93 
94 	struct	AudioImp;
95 	AudioImp *imp;
96 
97 	bool	profilevalid; //this is only half useful
98 		//it makes it so we don't always have to realloc memory when the file switches...
99 
100 public: //structors
101 
102 	AudioContainer();
103 	~AudioContainer();
104 
105 public: //accessor interface
106 	void set_offset(const double &s);
107 	double get_offset() const;
108 
109 public: //info gather interface
110 	etl::handle<AudioProfile>	get_profile(float samplerate = DEF_DISPLAYSAMPLERATE);
111 	bool get_current_time(double &out);
112 
113 public: //operational interface
114 	bool load(const std::string &filename, const std::string &filedirectory = "");
115 	void clear();
116 
117 	//play functions...
118 	void play(double t);
119 	void stop();
120 	//Note: this refers to the wrapper concept of the audio, the actual sound may or may not be playing...
121 	bool is_playing() const;
122 
123 	//scrubbing functions...
124 	void start_scrubbing(double t);
125 	void stop_scrubbing();
126 	void scrub(double t); //!< if we are not currently scrubbing this will not work
127 	bool is_scrubbing() const;
128 
129 	double scrub_time() const;
130 
131 	bool isRunning() const;
132 	bool isPaused() const;
133 };
134 
135 } // END of namespace studio
136 
137 /* === E N D =============================================================== */
138 
139 #endif
140