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