rna polygon access to loop vertex indicies.
[blender-staging.git] / intern / audaspace / FX / AUD_LimiterReader.cpp
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/FX/AUD_LimiterReader.cpp
28  *  \ingroup audfx
29  */
30
31
32 #include "AUD_LimiterReader.h"
33 #include "AUD_Buffer.h"
34
35 #include <iostream>
36
37 AUD_LimiterReader::AUD_LimiterReader(AUD_IReader* reader,
38                                                                          float start, float end) :
39                 AUD_EffectReader(reader),
40                 m_start(int(start * reader->getSpecs().rate)),
41                 m_end(int(end * reader->getSpecs().rate))
42 {
43         if(m_start > 0)
44         {
45                 if(m_reader->isSeekable())
46                         m_reader->seek(m_start);
47                 else
48                 {
49                         // skip first m_start samples by reading them
50                         int length = AUD_DEFAULT_BUFFER_SIZE;
51                         sample_t* buffer;
52                         for(int len = m_start;
53                                 length == AUD_DEFAULT_BUFFER_SIZE;
54                                 len -= AUD_DEFAULT_BUFFER_SIZE)
55                         {
56                                 if(len < AUD_DEFAULT_BUFFER_SIZE)
57                                         length = len;
58                                 m_reader->read(length, buffer);
59                         }
60                 }
61         }
62 }
63
64 void AUD_LimiterReader::seek(int position)
65 {
66         m_reader->seek(position + m_start);
67 }
68
69 int AUD_LimiterReader::getLength() const
70 {
71         int len = m_reader->getLength();
72         if(len < 0 || (len > m_end && m_end >= 0))
73                 len = m_end;
74         return len - m_start;
75 }
76
77 int AUD_LimiterReader::getPosition() const
78 {
79         int pos = m_reader->getPosition();
80         return AUD_MIN(pos, m_end) - m_start;
81 }
82
83 void AUD_LimiterReader::read(int & length, sample_t* & buffer)
84 {
85         if(m_end >= 0)
86         {
87                 int position = m_reader->getPosition();
88                 if(position + length > m_end)
89                         length = m_end - position;
90                 if(length < 0)
91                 {
92                         length = 0;
93                         return;
94                 }
95         }
96         m_reader->read(length, buffer);
97 }