diff options
Diffstat (limited to 'extern/audaspace/include/respec')
-rw-r--r-- | extern/audaspace/include/respec/ChannelMapper.h | 51 | ||||
-rw-r--r-- | extern/audaspace/include/respec/ChannelMapperReader.h | 151 | ||||
-rw-r--r-- | extern/audaspace/include/respec/Converter.h | 51 | ||||
-rw-r--r-- | extern/audaspace/include/respec/ConverterFunctions.h | 377 | ||||
-rw-r--r-- | extern/audaspace/include/respec/ConverterReader.h | 67 | ||||
-rw-r--r-- | extern/audaspace/include/respec/JOSResample.h | 50 | ||||
-rw-r--r-- | extern/audaspace/include/respec/JOSResampleReader.h | 129 | ||||
-rw-r--r-- | extern/audaspace/include/respec/LinearResample.h | 50 | ||||
-rw-r--r-- | extern/audaspace/include/respec/LinearResampleReader.h | 80 | ||||
-rw-r--r-- | extern/audaspace/include/respec/Mixer.h | 123 | ||||
-rw-r--r-- | extern/audaspace/include/respec/ResampleReader.h | 61 | ||||
-rw-r--r-- | extern/audaspace/include/respec/Specification.h | 138 | ||||
-rw-r--r-- | extern/audaspace/include/respec/SpecsChanger.h | 74 |
13 files changed, 1402 insertions, 0 deletions
diff --git a/extern/audaspace/include/respec/ChannelMapper.h b/extern/audaspace/include/respec/ChannelMapper.h new file mode 100644 index 00000000000..5481a42c433 --- /dev/null +++ b/extern/audaspace/include/respec/ChannelMapper.h @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright 2009-2016 Jörg Müller + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ + +#pragma once + +/** + * @file ChannelMapper.h + * @ingroup respec + * The ChannelMapper class. + */ + +#include "respec/SpecsChanger.h" + +AUD_NAMESPACE_BEGIN + +/** + * This sound creates a reader that maps a sound source's channels to a + * specific output channel count. + */ +class AUD_API ChannelMapper : public SpecsChanger +{ +private: + // delete copy constructor and operator= + ChannelMapper(const ChannelMapper&) = delete; + ChannelMapper& operator=(const ChannelMapper&) = delete; + +public: + /** + * Creates a new sound. + * \param sound The input sound. + * \param specs The target specifications. + */ + ChannelMapper(std::shared_ptr<ISound> sound, DeviceSpecs specs); + + virtual std::shared_ptr<IReader> createReader(); +}; + +AUD_NAMESPACE_END diff --git a/extern/audaspace/include/respec/ChannelMapperReader.h b/extern/audaspace/include/respec/ChannelMapperReader.h new file mode 100644 index 00000000000..00739ee995f --- /dev/null +++ b/extern/audaspace/include/respec/ChannelMapperReader.h @@ -0,0 +1,151 @@ +/******************************************************************************* + * Copyright 2009-2016 Jörg Müller + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ + +#pragma once + +/** + * @file ChannelMapperReader.h + * @ingroup respec + * The ChannelMapperReader class. + */ + +#include "fx/EffectReader.h" +#include "util/Buffer.h" + +AUD_NAMESPACE_BEGIN + +/** + * This class maps a sound source's channels to a specific output channel count. + * \note The input sample format must be float. + */ +class AUD_API ChannelMapperReader : public EffectReader +{ +private: + /** + * The sound reading buffer. + */ + Buffer m_buffer; + + /** + * The output specification. + */ + Channels m_target_channels; + + /** + * The channel count of the reader. + */ + Channels m_source_channels; + + /** + * The mapping specification. + */ + float* m_mapping; + + /** + * The size of the mapping. + */ + int m_map_size; + + /** + * The mono source angle. + */ + float m_mono_angle; + + static const Channel MONO_MAP[]; + static const Channel STEREO_MAP[]; + static const Channel STEREO_LFE_MAP[]; + static const Channel SURROUND4_MAP[]; + static const Channel SURROUND5_MAP[]; + static const Channel SURROUND51_MAP[]; + static const Channel SURROUND61_MAP[]; + static const Channel SURROUND71_MAP[]; + static const Channel* CHANNEL_MAPS[]; + + static const float MONO_ANGLES[]; + static const float STEREO_ANGLES[]; + static const float STEREO_LFE_ANGLES[]; + static const float SURROUND4_ANGLES[]; + static const float SURROUND5_ANGLES[]; + static const float SURROUND51_ANGLES[]; + static const float SURROUND61_ANGLES[]; + static const float SURROUND71_ANGLES[]; + static const float* CHANNEL_ANGLES[]; + + // delete copy constructor and operator= + ChannelMapperReader(const ChannelMapperReader&) = delete; + ChannelMapperReader& operator=(const ChannelMapperReader&) = delete; + + /** + * Calculates the mapping matrix. + */ + void AUD_LOCAL calculateMapping(); + + /** + * Calculates the distance between two angles. + */ + float AUD_LOCAL angleDistance(float alpha, float beta); + +public: + /** + * Creates a channel mapper reader. + * \param reader The reader to map. + * \param channels The target channel count this reader should map to. + */ + ChannelMapperReader(std::shared_ptr<IReader> reader, Channels channels); + + /** + * Destroys the reader. + */ + ~ChannelMapperReader(); + + /** + * Returns the channel configuration of the source reader. + * @return The channel configuration of the reader. + */ + Channels getSourceChannels() const; + + /** + * Returns the target channel configuration. + * Equals getSpecs().channels. + * @return The target channel configuration. + */ + Channels getChannels() const; + + /** + * Sets the requested channel output count. + * \param channels The channel output count. + */ + void setChannels(Channels channels); + + /** + * Returns the mapping of the source channel to the target channel. + * @param source The number of the source channel. Should be in the range [0, source channels). + * @param target The number of the target channel. Should be in the range [0, target channels). + * @return The mapping value which should be between 0.0 and 1.0. If source or target are out of range, NaN is returned. + */ + float getMapping(int source, int target); + + /** + * Sets the angle for mono sources. + * \param angle The angle for mono sources. + */ + void setMonoAngle(float angle); + + virtual Specs getSpecs() const; + virtual void read(int& length, bool& eos, sample_t* buffer); +}; + +AUD_NAMESPACE_END diff --git a/extern/audaspace/include/respec/Converter.h b/extern/audaspace/include/respec/Converter.h new file mode 100644 index 00000000000..35664b28025 --- /dev/null +++ b/extern/audaspace/include/respec/Converter.h @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright 2009-2016 Jörg Müller + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ + +#pragma once + +/** + * @file Converter.h + * @ingroup respec + * The Converter class. + */ + +#include "respec/SpecsChanger.h" + +AUD_NAMESPACE_BEGIN + +/** + * This sound creates a converter reader that is able to convert from one + * audio format to another. + */ +class AUD_API Converter : public SpecsChanger +{ +private: + // delete copy constructor and operator= + Converter(const Converter&) = delete; + Converter& operator=(const Converter&) = delete; + +public: + /** + * Creates a new sound. + * \param sound The input sound. + * \param specs The target specifications. + */ + Converter(std::shared_ptr<ISound> sound, DeviceSpecs specs); + + virtual std::shared_ptr<IReader> createReader(); +}; + +AUD_NAMESPACE_END diff --git a/extern/audaspace/include/respec/ConverterFunctions.h b/extern/audaspace/include/respec/ConverterFunctions.h new file mode 100644 index 00000000000..3cc4a713cc9 --- /dev/null +++ b/extern/audaspace/include/respec/ConverterFunctions.h @@ -0,0 +1,377 @@ +/******************************************************************************* + * Copyright 2009-2016 Jörg Müller + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ + +#pragma once + +/** + * @file ConverterFunctions.h + * @ingroup respec + * Defines several conversion functions between different sample formats. + */ + +#include "Audaspace.h" + +#include <cstring> + +AUD_NAMESPACE_BEGIN + +/** + * The function template for functions converting from one sample format + * to another, having the same parameter order as std::memcpy. + */ +typedef void (*convert_f)(data_t* target, data_t* source, int length); + +/** + * The copy conversion function simply calls std::memcpy. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +template <class T> +void convert_copy(data_t* target, data_t* source, int length) +{ + std::memcpy(target, source, length*sizeof(T)); +} + +/** + * @brief Converts from FORMAT_U8 to FORMAT_S16. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_u8_s16(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_U8 to FORMAT_S24 big endian. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_u8_s24_be(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_U8 to FORMAT_S24 little endian. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_u8_s24_le(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_U8 to FORMAT_S32. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_u8_s32(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_U8 to FORMAT_FLOAT32. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_u8_float(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_U8 to FORMAT_FLOAT64. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_u8_double(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S16 to FORMAT_U8. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s16_u8(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S16 to FORMAT_S24 big endian. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s16_s24_be(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S16 to FORMAT_S24 little endian. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s16_s24_le(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S16 to FORMAT_S32. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s16_s32(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S16 to FORMAT_FLOAT32. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s16_float(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S16 to FORMAT_FLOAT64. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s16_double(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S24 big endian to FORMAT_U8. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s24_u8_be(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S24 little endian to FORMAT_U8. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s24_u8_le(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S24 big endian to FORMAT_S16. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s24_s16_be(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S24 little endian to FORMAT_S16. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s24_s16_le(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S24 to FORMAT_S24 simply using std::memcpy. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s24_s24(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S24 big endian to FORMAT_S32. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s24_s32_be(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S24 little endian to FORMAT_S32. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s24_s32_le(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S24 big endian to FORMAT_FLOAT32. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s24_float_be(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S24 little endian to FORMAT_FLOAT32. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s24_float_le(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S24 big endian to FORMAT_FLOAT64. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s24_double_be(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S24 little endian to FORMAT_FLOAT64. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s24_double_le(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S32 to FORMAT_U8. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s32_u8(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S32 to FORMAT_S16. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s32_s16(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S32 to FORMAT_S24 big endian. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s32_s24_be(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S32 to FORMAT_S24 little endian. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s32_s24_le(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S32 to FORMAT_FLOAT32. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s32_float(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_S32 to FORMAT_FLOAT64. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_s32_double(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_FLOAT32 to FORMAT_U8. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_float_u8(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_FLOAT32 to FORMAT_S16. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_float_s16(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_FLOAT32 to FORMAT_S24 big endian. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_float_s24_be(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_FLOAT32 to FORMAT_S24 little endian. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_float_s24_le(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_FLOAT32 to FORMAT_S32. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_float_s32(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_FLOAT32 to FORMAT_FLOAT64. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_float_double(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_FLOAT64 to FORMAT_U8. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_double_u8(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_FLOAT64 to FORMAT_S16. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_double_s16(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_FLOAT64 to FORMAT_S24 big endian. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_double_s24_be(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_FLOAT64 to FORMAT_S24 little endian. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_double_s24_le(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_FLOAT64 to FORMAT_S32. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_double_s32(data_t* target, data_t* source, int length); + +/** + * @brief Converts from FORMAT_FLOAT64 to FORMAT_FLOAT32. + * @param target The target buffer. + * @param source The source buffer. + * @param length The amount of samples to be converted. + */ +void AUD_API convert_double_float(data_t* target, data_t* source, int length); + +AUD_NAMESPACE_END diff --git a/extern/audaspace/include/respec/ConverterReader.h b/extern/audaspace/include/respec/ConverterReader.h new file mode 100644 index 00000000000..c5ff6ded9ad --- /dev/null +++ b/extern/audaspace/include/respec/ConverterReader.h @@ -0,0 +1,67 @@ +/******************************************************************************* + * Copyright 2009-2016 Jörg Müller + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ + +#pragma once + +/** + * @file ConverterReader.h + * @ingroup respec + * The ConverterReader class. + */ + +#include "fx/EffectReader.h" +#include "respec/ConverterFunctions.h" +#include "util/Buffer.h" + +AUD_NAMESPACE_BEGIN + +/** + * This class converts a sound source from one to another format. + */ +class AUD_API ConverterReader : public EffectReader +{ +private: + /** + * The sound output buffer. + */ + Buffer m_buffer; + + /** + * The target specification. + */ + SampleFormat m_format; + + /** + * Converter function. + */ + convert_f m_convert; + + // delete copy constructor and operator= + ConverterReader(const ConverterReader&) = delete; + ConverterReader& operator=(const ConverterReader&) = delete; + +public: + /** + * Creates a converter reader. + * \param reader The reader to convert. + * \param specs The target specification. + */ + ConverterReader(std::shared_ptr<IReader> reader, DeviceSpecs specs); + + virtual void read(int& length, bool& eos, sample_t* buffer); +}; + +AUD_NAMESPACE_END diff --git a/extern/audaspace/include/respec/JOSResample.h b/extern/audaspace/include/respec/JOSResample.h new file mode 100644 index 00000000000..b1f4d757c3c --- /dev/null +++ b/extern/audaspace/include/respec/JOSResample.h @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright 2009-2016 Jörg Müller + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ + +#pragma once + +/** + * @file JOSResample.h + * @ingroup respec + * The JOSResample class. + */ + +#include "respec/SpecsChanger.h" + +AUD_NAMESPACE_BEGIN + +/** + * This sound creates a resampling reader that does Julius O. Smith's resampling algorithm. + */ +class AUD_API JOSResample : public SpecsChanger +{ +private: + // delete copy constructor and operator= + JOSResample(const JOSResample&) = delete; + JOSResample& operator=(const JOSResample&) = delete; + +public: + /** + * Creates a new sound. + * \param sound The input sound. + * \param specs The target specifications. + */ + JOSResample(std::shared_ptr<ISound> sound, DeviceSpecs specs); + + virtual std::shared_ptr<IReader> createReader(); +}; + +AUD_NAMESPACE_END diff --git a/extern/audaspace/include/respec/JOSResampleReader.h b/extern/audaspace/include/respec/JOSResampleReader.h new file mode 100644 index 00000000000..e9dd3b4220b --- /dev/null +++ b/extern/audaspace/include/respec/JOSResampleReader.h @@ -0,0 +1,129 @@ +/******************************************************************************* + * Copyright 2009-2016 Jörg Müller + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ + +#pragma once + +/** + * @file JOSResampleReader.h + * @ingroup respec + * The JOSResampleReader class. + */ + +#include "respec/ResampleReader.h" +#include "util/Buffer.h" + +AUD_NAMESPACE_BEGIN + +/** + * This resampling reader uses Julius O. Smith's resampling algorithm. + */ +class AUD_API JOSResampleReader : public ResampleReader +{ +private: + typedef void (JOSResampleReader::*resample_f)(double target_factor, int length, sample_t* buffer); + + /** + * The half filter length. + */ + static const int m_len; + + /** + * The sample step size for the filter. + */ + static const int m_L; + + /** + * The filter coefficients. + */ + static const float m_coeff[]; + + /** + * The reader channels. + */ + Channels m_channels; + + /** + * The sample position in the cache. + */ + unsigned int m_n; + + /** + * The subsample position in the cache. + */ + double m_P; + + /** + * The input data buffer. + */ + Buffer m_buffer; + + /** + * Double buffer for the sums. + */ + Buffer m_sums; + + /** + * How many samples in the cache are valid. + */ + int m_cache_valid; + + /** + * Resample function. + */ + resample_f m_resample; + + /** + * Last resampling factor. + */ + double m_last_factor; + + // delete copy constructor and operator= + JOSResampleReader(const JOSResampleReader&) = delete; + JOSResampleReader& operator=(const JOSResampleReader&) = delete; + + /** + * Resets the resampler to its initial state. + */ + void AUD_LOCAL reset(); + + /** + * Updates the buffer to be as small as possible for the coming reading. + * \param size The size of samples to be read. + * \param factor The next resampling factor. + * \param samplesize The size of a sample. + */ + void AUD_LOCAL updateBuffer(int size, double factor, int samplesize); + + void AUD_LOCAL resample(double target_factor, int length, sample_t* buffer); + void AUD_LOCAL resample_mono(double target_factor, int length, sample_t* buffer); + void AUD_LOCAL resample_stereo(double target_factor, int length, sample_t* buffer); + +public: + /** + * Creates a resampling reader. + * \param reader The reader to mix. + * \param rate The target sampling rate. + */ + JOSResampleReader(std::shared_ptr<IReader> reader, SampleRate rate); + + virtual void seek(int position); + virtual int getLength() const; + virtual int getPosition() const; + virtual Specs getSpecs() const; + virtual void read(int& length, bool& eos, sample_t* buffer); +}; + +AUD_NAMESPACE_END diff --git a/extern/audaspace/include/respec/LinearResample.h b/extern/audaspace/include/respec/LinearResample.h new file mode 100644 index 00000000000..207cf2a6548 --- /dev/null +++ b/extern/audaspace/include/respec/LinearResample.h @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright 2009-2016 Jörg Müller + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ + +#pragma once + +/** + * @file LinearResample.h + * @ingroup respec + * The LinearResample class. + */ + +#include "respec/SpecsChanger.h" + +AUD_NAMESPACE_BEGIN + +/** + * This sound creates a resampling reader that does simple linear resampling. + */ +class AUD_API LinearResample : public SpecsChanger +{ +private: + // delete copy constructor and operator= + LinearResample(const LinearResample&) = delete; + LinearResample& operator=(const LinearResample&) = delete; + +public: + /** + * Creates a new sound. + * \param sound The input sound. + * \param specs The target specifications. + */ + LinearResample(std::shared_ptr<ISound> sound, DeviceSpecs specs); + + virtual std::shared_ptr<IReader> createReader(); +}; + +AUD_NAMESPACE_END diff --git a/extern/audaspace/include/respec/LinearResampleReader.h b/extern/audaspace/include/respec/LinearResampleReader.h new file mode 100644 index 00000000000..aaf95672e55 --- /dev/null +++ b/extern/audaspace/include/respec/LinearResampleReader.h @@ -0,0 +1,80 @@ +/******************************************************************************* + * Copyright 2009-2016 Jörg Müller + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ + +#pragma once + +/** + * @file LinearResampleReader.h + * @ingroup respec + * The LinearResampleReader class. + */ + +#include "respec/ResampleReader.h" +#include "util/Buffer.h" + +AUD_NAMESPACE_BEGIN + +/** + * This resampling reader does simple first-order hold resampling. + */ +class AUD_API LinearResampleReader : public ResampleReader +{ +private: + /** + * The reader channels. + */ + Channels m_channels; + + /** + * The position in the cache. + */ + float m_cache_pos; + + /** + * The sound output buffer. + */ + Buffer m_buffer; + + /** + * The input caching buffer. + */ + Buffer m_cache; + + /** + * Whether the cache contains valid data. + */ + bool m_cache_ok; + + // delete copy constructor and operator= + LinearResampleReader(const LinearResampleReader&) = delete; + LinearResampleReader& operator=(const LinearResampleReader&) = delete; + +public: + /** + * Creates a resampling reader. + * \param reader The reader to mix. + * \param rate The target sampling rate. + */ + LinearResampleReader(std::shared_ptr<IReader> reader, SampleRate rate); + + virtual void seek(int position); + virtual int getLength() const; + virtual int getPosition() const; + virtual Specs getSpecs() const; + virtual void read(int& length, bool& eos, sample_t* buffer); +}; + +AUD_NAMESPACE_END diff --git a/extern/audaspace/include/respec/Mixer.h b/extern/audaspace/include/respec/Mixer.h new file mode 100644 index 00000000000..600467826cd --- /dev/null +++ b/extern/audaspace/include/respec/Mixer.h @@ -0,0 +1,123 @@ +/******************************************************************************* + * Copyright 2009-2016 Jörg Müller + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ + +#pragma once + +/** + * @file Mixer.h + * @ingroup respec + * The Mixer class. + */ + +#include "respec/Specification.h" +#include "respec/ConverterFunctions.h" +#include "util/Buffer.h" + +#include <memory> + +AUD_NAMESPACE_BEGIN + +class IReader; + +/** + * This abstract class is able to mix audiosignals with same channel count + * and sample rate and convert it to a specific output format. + */ +class AUD_API Mixer +{ +private: + // delete copy constructor and operator= + Mixer(const Mixer&) = delete; + Mixer& operator=(const Mixer&) = delete; + +protected: + /** + * The output specification. + */ + DeviceSpecs m_specs; + + /** + * The length of the mixing buffer. + */ + int m_length; + + /** + * The mixing buffer. + */ + Buffer m_buffer; + + /** + * Converter function. + */ + convert_f m_convert; + +public: + /** + * Creates the mixer. + */ + Mixer(DeviceSpecs specs); + + /** + * Destroys the mixer. + */ + virtual ~Mixer() {} + + /** + * Returns the target specification for superposing. + * \return The target specification. + */ + DeviceSpecs getSpecs() const; + + /** + * Sets the target specification for superposing. + * \param specs The target specification. + */ + void setSpecs(Specs specs); + + /** + * Mixes a buffer. + * \param buffer The buffer to superpose. + * \param start The start sample of the buffer. + * \param length The length of the buffer in samples. + * \param volume The mixing volume. Must be a value between 0.0 and 1.0. + */ + void mix(sample_t* buffer, int start, int length, float volume); + + /** + * Mixes a buffer with linear volume interpolation. + * \param buffer The buffer to superpose. + * \param start The start sample of the buffer. + * \param length The length of the buffer in samples. + * \param volume_to The target mixing volume. Must be a value between 0.0 and 1.0. + * \param volume_from The start mixing volume. Must be a value between 0.0 and 1.0. + */ + void mix(sample_t* buffer, int start, int length, float volume_to, float volume_from); + + /** + * Writes the mixing buffer into an output buffer. + * \param buffer The target buffer for superposing. + * \param volume The mixing volume. Must be a value between 0.0 and 1.0. + */ + void read(data_t* buffer, float volume); + + /** + * Clears the mixing buffer. + * \param length The length of the buffer in samples. + */ + void clear(int length); +}; + +AUD_NAMESPACE_END diff --git a/extern/audaspace/include/respec/ResampleReader.h b/extern/audaspace/include/respec/ResampleReader.h new file mode 100644 index 00000000000..b38a8d5eb18 --- /dev/null +++ b/extern/audaspace/include/respec/ResampleReader.h @@ -0,0 +1,61 @@ +/******************************************************************************* + * Copyright 2009-2016 Jörg Müller + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ + +#pragma once + +/** + * @file ResampleReader.h + * @ingroup respec + * The ResampleReader class. + */ + +#include "fx/EffectReader.h" + +AUD_NAMESPACE_BEGIN + +/** + * This is the base class for all resampling readers. + */ +class AUD_API ResampleReader : public EffectReader +{ +protected: + /** + * The target sampling rate. + */ + SampleRate m_rate; + + /** + * Creates a resampling reader. + * \param reader The reader to mix. + * \param rate The target sampling rate. + */ + ResampleReader(std::shared_ptr<IReader> reader, SampleRate rate); + +public: + /** + * Sets the sample rate. + * \param rate The target sampling rate. + */ + virtual void setRate(SampleRate rate); + + /** + * Retrieves the sample rate. + * \return The target sampling rate. + */ + virtual SampleRate getRate(); +}; + +AUD_NAMESPACE_END diff --git a/extern/audaspace/include/respec/Specification.h b/extern/audaspace/include/respec/Specification.h new file mode 100644 index 00000000000..efcbb4cabce --- /dev/null +++ b/extern/audaspace/include/respec/Specification.h @@ -0,0 +1,138 @@ +/******************************************************************************* + * Copyright 2009-2016 Jörg Müller + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ + +#pragma once + +/** + * @file Specification.h + * @ingroup respec + * Defines all important macros and basic data structures for stream format descriptions. + */ + +#include "Audaspace.h" + +/// The size of a format in bytes. +#define AUD_FORMAT_SIZE(format) (format & 0x0F) +/// The size of a sample in the specified device format in bytes. +#define AUD_DEVICE_SAMPLE_SIZE(specs) (specs.channels * (specs.format & 0x0F)) +/// The size of a sample in the specified format in bytes. +#define AUD_SAMPLE_SIZE(specs) (specs.channels * sizeof(sample_t)) + +/// Compares two audio data specifications. +#define AUD_COMPARE_SPECS(s1, s2) ((s1.rate == s2.rate) && (s1.channels == s2.channels)) + +/// Returns the bit for a channel mask. +#define AUD_CHANNEL_BIT(channel) (0x01 << channel) + +AUD_NAMESPACE_BEGIN + +/** + * The format of a sample. + * The last 4 bit save the byte count of the format. + */ +enum SampleFormat +{ + FORMAT_INVALID = 0x00, /// Invalid sample format. + FORMAT_U8 = 0x01, /// 1 byte unsigned byte. + FORMAT_S16 = 0x12, /// 2 byte signed integer. + FORMAT_S24 = 0x13, /// 3 byte signed integer. + FORMAT_S32 = 0x14, /// 4 byte signed integer. + FORMAT_FLOAT32 = 0x24, /// 4 byte float. + FORMAT_FLOAT64 = 0x28 /// 8 byte float. +}; + +/// The channel count. +enum Channels +{ + CHANNELS_INVALID = 0, /// Invalid channel count. + CHANNELS_MONO = 1, /// Mono. + CHANNELS_STEREO = 2, /// Stereo. + CHANNELS_STEREO_LFE = 3, /// Stereo with LFE channel. + CHANNELS_SURROUND4 = 4, /// 4 channel surround sound. + CHANNELS_SURROUND5 = 5, /// 5 channel surround sound. + CHANNELS_SURROUND51 = 6, /// 5.1 surround sound. + CHANNELS_SURROUND61 = 7, /// 6.1 surround sound. + CHANNELS_SURROUND71 = 8 /// 7.1 surround sound. +}; + +/// The channel names. +enum Channel +{ + CHANNEL_FRONT_LEFT = 0, + CHANNEL_FRONT_RIGHT, + CHANNEL_FRONT_CENTER, + CHANNEL_LFE, + CHANNEL_REAR_LEFT, + CHANNEL_REAR_RIGHT, + CHANNEL_REAR_CENTER, + CHANNEL_SIDE_LEFT, + CHANNEL_SIDE_RIGHT, + CHANNEL_MAX +}; + +/** + * The sample rate tells how many samples are played back within one second. + * Some exotic formats may use other sample rates than provided here. + */ +enum DefaultSampleRate +{ + RATE_INVALID = 0, /// Invalid sample rate. + RATE_8000 = 8000, /// 8000 Hz. + RATE_16000 = 16000, /// 16000 Hz. + RATE_11025 = 11025, /// 11025 Hz. + RATE_22050 = 22050, /// 22050 Hz. + RATE_32000 = 32000, /// 32000 Hz. + RATE_44100 = 44100, /// 44100 Hz. + RATE_48000 = 48000, /// 48000 Hz. + RATE_88200 = 88200, /// 88200 Hz. + RATE_96000 = 96000, /// 96000 Hz. + RATE_192000 = 192000 /// 192000 Hz. +}; + +/// Sample rate type. +typedef double SampleRate; + +/// Specification of a sound source. +struct Specs +{ + /// Sample rate in Hz. + SampleRate rate; + + /// Channel count. + Channels channels; +}; + +/// Specification of a sound device. +struct DeviceSpecs +{ + /// Sample format. + SampleFormat format; + + union + { + struct + { + /// Sample rate in Hz. + SampleRate rate; + + /// Channel count. + Channels channels; + }; + Specs specs; + }; +}; + +AUD_NAMESPACE_END diff --git a/extern/audaspace/include/respec/SpecsChanger.h b/extern/audaspace/include/respec/SpecsChanger.h new file mode 100644 index 00000000000..2eb9f369497 --- /dev/null +++ b/extern/audaspace/include/respec/SpecsChanger.h @@ -0,0 +1,74 @@ +/******************************************************************************* + * Copyright 2009-2016 Jörg Müller + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ + +#pragma once + +/** + * @file SpecsChanger.h + * @ingroup respec + * The SpecsChanger class. + */ + +#include "ISound.h" +#include "respec/Specification.h" + +AUD_NAMESPACE_BEGIN + +/** + * This sound is a base class for all mixer factories. + */ +class AUD_API SpecsChanger : public ISound +{ +protected: + /** + * The target specification for resampling. + */ + const DeviceSpecs m_specs; + + /** + * If there is no reader it is created out of this sound. + */ + std::shared_ptr<ISound> m_sound; + + /** + * Returns the reader created out of the sound. + * This method can be used for the createReader function of the implementing + * classes. + * \return The reader to mix. + */ + std::shared_ptr<IReader> getReader() const; + +public: + /** + * Creates a new sound. + * \param sound The sound to create the readers to mix out of. + * \param specs The target specification. + */ + SpecsChanger(std::shared_ptr<ISound> sound, DeviceSpecs specs); + + /** + * Returns the target specification for resampling. + */ + DeviceSpecs getSpecs() const; + + /** + * Returns the saved sound. + * \return The sound. + */ + std::shared_ptr<ISound> getSound() const; +}; + +AUD_NAMESPACE_END |