63178f316b2ffde3026f8ecc81cd4f20d95da485
[blender-staging.git] / intern / audaspace / intern / AUD_ConverterReader.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_ConverterReader.cpp
26  *  \ingroup audaspaceintern
27  */
28
29
30 #include "AUD_ConverterReader.h"
31
32 AUD_ConverterReader::AUD_ConverterReader(AUD_Reference<AUD_IReader> reader,
33                                                                                  AUD_DeviceSpecs specs) :
34         AUD_EffectReader(reader),
35         m_format(specs.format)
36 {
37         switch(m_format)
38         {
39         case AUD_FORMAT_U8:
40                 m_convert = AUD_convert_float_u8;
41                 break;
42         case AUD_FORMAT_S16:
43                 m_convert = AUD_convert_float_s16;
44                 break;
45         case AUD_FORMAT_S24:
46 #ifdef __BIG_ENDIAN__
47                 m_convert = AUD_convert_float_s24_be;
48 #else
49                 m_convert = AUD_convert_float_s24_le;
50 #endif
51                 break;
52         case AUD_FORMAT_S32:
53                 m_convert = AUD_convert_float_s32;
54                 break;
55         case AUD_FORMAT_FLOAT32:
56                 m_convert = AUD_convert_copy<float>;
57                 break;
58         case AUD_FORMAT_FLOAT64:
59                 m_convert = AUD_convert_float_double;
60                 break;
61         default:
62                 break;
63         }
64 }
65
66 void AUD_ConverterReader::read(int& length, bool& eos, sample_t* buffer)
67 {
68         AUD_Specs specs = m_reader->getSpecs();
69         int samplesize = AUD_SAMPLE_SIZE(specs);
70
71         m_buffer.assureSize(length * samplesize);
72
73         m_reader->read(length, eos, m_buffer.getBuffer());
74
75         m_convert((data_t*)buffer, (data_t*)m_buffer.getBuffer(),
76                   length * specs.channels);
77 }