dbff70095ad0806ed32dfaea26d380a15b426084
[blender-staging.git] / intern / audaspace / intern / AUD_BufferReader.cpp
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * Copyright 2009-2011 Jörg Hermann Müller
5  *
6  * This file is part of AudaSpace.
7  *
8  * Audaspace is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * AudaSpace is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with Audaspace; if not, write to the Free Software Foundation,
20  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 /** \file audaspace/intern/AUD_BufferReader.cpp
26  *  \ingroup audaspaceintern
27  */
28
29
30 #include "AUD_BufferReader.h"
31 #include "AUD_Buffer.h"
32 #include "AUD_Space.h"
33
34 #include <cstring>
35
36 AUD_BufferReader::AUD_BufferReader(AUD_Reference<AUD_Buffer> buffer,
37                                                                    AUD_Specs specs) :
38         m_position(0), m_buffer(buffer), m_specs(specs)
39 {
40 }
41
42 bool AUD_BufferReader::isSeekable() const
43 {
44         return true;
45 }
46
47 void AUD_BufferReader::seek(int position)
48 {
49         m_position = position;
50 }
51
52 int AUD_BufferReader::getLength() const
53 {
54         return m_buffer->getSize() / AUD_SAMPLE_SIZE(m_specs);
55 }
56
57 int AUD_BufferReader::getPosition() const
58 {
59         return m_position;
60 }
61
62 AUD_Specs AUD_BufferReader::getSpecs() const
63 {
64         return m_specs;
65 }
66
67 void AUD_BufferReader::read(int& length, bool& eos, sample_t* buffer)
68 {
69         eos = false;
70
71         int sample_size = AUD_SAMPLE_SIZE(m_specs);
72
73         sample_t* buf = m_buffer->getBuffer() + m_position * m_specs.channels;
74
75         // in case the end of the buffer is reached
76         if(m_buffer->getSize() < (m_position + length) * sample_size)
77         {
78                 length = m_buffer->getSize() / sample_size - m_position;
79                 eos = true;
80         }
81
82         if(length < 0)
83         {
84                 length = 0;
85                 return;
86         }
87
88         m_position += length;
89         memcpy(buffer, buf, length * sample_size);
90 }