4ece91ca899695ade900bf0add69174e4f31f110
[blender.git] / intern / audaspace / FX / AUD_FaderReader.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/FX/AUD_FaderReader.cpp
26  *  \ingroup audfx
27  */
28
29
30 #include "AUD_FaderReader.h"
31
32 #include <cstring>
33
34 AUD_FaderReader::AUD_FaderReader(AUD_Reference<AUD_IReader> reader, AUD_FadeType type,
35                                                                  float start,float length) :
36                 AUD_EffectReader(reader),
37                 m_type(type),
38                 m_start(start),
39                 m_length(length)
40 {
41 }
42
43 void AUD_FaderReader::read(int& length, bool& eos, sample_t* buffer)
44 {
45         int position = m_reader->getPosition();
46         AUD_Specs specs = m_reader->getSpecs();
47         int samplesize = AUD_SAMPLE_SIZE(specs);
48
49         m_reader->read(length, eos, buffer);
50
51         if((position + length) / (float)specs.rate <= m_start)
52         {
53                 if(m_type != AUD_FADE_OUT)
54                 {
55                         memset(buffer, 0, length * samplesize);
56                 }
57         }
58         else if(position / (float)specs.rate >= m_start+m_length)
59         {
60                 if(m_type == AUD_FADE_OUT)
61                 {
62                         memset(buffer, 0, length * samplesize);
63                 }
64         }
65         else
66         {
67                 float volume = 1.0f;
68
69                 for(int i = 0; i < length * specs.channels; i++)
70                 {
71                         if(i % specs.channels == 0)
72                         {
73                                 volume = (((position+i)/(float)specs.rate)-m_start) / m_length;
74                                 if(volume > 1.0f)
75                                         volume = 1.0f;
76                                 else if(volume < 0.0f)
77                                         volume = 0.0f;
78
79                                 if(m_type == AUD_FADE_OUT)
80                                         volume = 1.0f - volume;
81                         }
82
83                         buffer[i] = buffer[i] * volume;
84                 }
85         }
86 }