doxgyen: audaspace tagged.
[blender.git] / intern / audaspace / sndfile / AUD_SndFileReader.h
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * Copyright 2009-2011 Jörg Hermann Müller
7  *
8  * This file is part of AudaSpace.
9  *
10  * Audaspace is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * AudaSpace 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
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with Audaspace; if not, write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  */
26
27 /** \file audaspace/sndfile/AUD_SndFileReader.h
28  *  \ingroup audsndfile
29  */
30
31
32 #ifndef AUD_SNDFILEREADER
33 #define AUD_SNDFILEREADER
34
35 #include "AUD_IReader.h"
36 #include "AUD_Reference.h"
37 #include "AUD_Buffer.h"
38
39 #include <string>
40 #include <sndfile.h>
41
42 typedef sf_count_t (*sf_read_f)(SNDFILE *sndfile, void *ptr, sf_count_t frames);
43
44 /**
45  * This class reads a sound file via libsndfile.
46  */
47 class AUD_SndFileReader : public AUD_IReader
48 {
49 private:
50         /**
51          * The current position in samples.
52          */
53         int m_position;
54
55         /**
56          * The sample count in the file.
57          */
58         int m_length;
59
60         /**
61          * Whether the file is seekable.
62          */
63         bool m_seekable;
64
65         /**
66          * The specification of the audio data.
67          */
68         AUD_Specs m_specs;
69
70         /**
71          * The playback buffer.
72          */
73         AUD_Buffer m_buffer;
74
75         /**
76          * The sndfile.
77          */
78         SNDFILE* m_sndfile;
79
80         /**
81          * The virtual IO structure for memory file reading.
82          */
83         SF_VIRTUAL_IO m_vio;
84
85         /**
86          * The pointer to the memory file.
87          */
88         AUD_Reference<AUD_Buffer> m_membuffer;
89
90         /**
91          * The current reading pointer of the memory file.
92          */
93         int m_memoffset;
94
95         // Functions for libsndfile virtual IO functionality
96         static sf_count_t vio_get_filelen(void *user_data);
97         static sf_count_t vio_seek(sf_count_t offset, int whence, void *user_data);
98         static sf_count_t vio_read(void *ptr, sf_count_t count, void *user_data);
99         static sf_count_t vio_tell(void *user_data);
100
101         // hide copy constructor and operator=
102         AUD_SndFileReader(const AUD_SndFileReader&);
103         AUD_SndFileReader& operator=(const AUD_SndFileReader&);
104
105 public:
106         /**
107          * Creates a new reader.
108          * \param filename The path to the file to be read.
109          * \exception AUD_Exception Thrown if the file specified does not exist or
110          *            cannot be read with libsndfile.
111          */
112         AUD_SndFileReader(std::string filename);
113
114         /**
115          * Creates a new reader.
116          * \param buffer The buffer to read from.
117          * \exception AUD_Exception Thrown if the buffer specified cannot be read
118          *                          with libsndfile.
119          */
120         AUD_SndFileReader(AUD_Reference<AUD_Buffer> buffer);
121
122         /**
123          * Destroys the reader and closes the file.
124          */
125         virtual ~AUD_SndFileReader();
126
127         virtual bool isSeekable() const;
128         virtual void seek(int position);
129         virtual int getLength() const;
130         virtual int getPosition() const;
131         virtual AUD_Specs getSpecs() const;
132         virtual void read(int & length, sample_t* & buffer);
133 };
134
135 #endif //AUD_SNDFILEREADER