Changeset View
Changeset View
Standalone View
Standalone View
extern/audaspace/src/fx/LimiterReader.cpp
- This file was moved from intern/audaspace/FX/AUD_LimiterReader.cpp.
| /* | /******************************************************************************* | ||||
| * ***** BEGIN GPL LICENSE BLOCK ***** | * Copyright 2009-2016 Jörg Müller | ||||
| * | * | ||||
| * Copyright 2009-2011 Jörg Hermann 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 | |||||
| * | * | ||||
| * This file is part of AudaSpace. | * http://www.apache.org/licenses/LICENSE-2.0 | ||||
| * | * | ||||
| * Audaspace is free software; you can redistribute it and/or modify | * Unless required by applicable law or agreed to in writing, software | ||||
| * it under the terms of the GNU General Public License as published by | * distributed under the License is distributed on an "AS IS" BASIS, | ||||
| * the Free Software Foundation; either version 2 of the License, or | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| * (at your option) any later version. | * See the License for the specific language governing permissions and | ||||
| * | * limitations under the License. | ||||
| * AudaSpace is distributed in the hope that it will be useful, | ******************************************************************************/ | ||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU General Public License | |||||
| * along with Audaspace; if not, write to the Free Software Foundation, | |||||
| * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
| * | |||||
| * ***** END GPL LICENSE BLOCK ***** | |||||
| */ | |||||
| /** \file audaspace/FX/AUD_LimiterReader.cpp | #include "fx/LimiterReader.h" | ||||
| * \ingroup audfx | #include "util/Buffer.h" | ||||
| */ | |||||
| #include <algorithm> | |||||
| #include "AUD_LimiterReader.h" | AUD_NAMESPACE_BEGIN | ||||
| #include "AUD_Buffer.h" | |||||
| AUD_LimiterReader::AUD_LimiterReader(boost::shared_ptr<AUD_IReader> reader, | LimiterReader::LimiterReader(std::shared_ptr<IReader> reader, float start, float end) : | ||||
| float start, float end) : | EffectReader(reader), | ||||
| AUD_EffectReader(reader), | |||||
| m_start(start), | m_start(start), | ||||
| m_end(end) | m_end(end) | ||||
| { | { | ||||
| if(m_start > 0) | if(m_start > 0) | ||||
| { | { | ||||
| AUD_Specs specs = m_reader->getSpecs(); | Specs specs = m_reader->getSpecs(); | ||||
| AUD_Specs specs2; | Specs specs2; | ||||
| if(m_reader->isSeekable()) | if(m_reader->isSeekable()) | ||||
| m_reader->seek(m_start * specs.rate); | m_reader->seek(m_start * specs.rate); | ||||
| Context not available. | |||||
| { | { | ||||
| // skip first m_start samples by reading them | // skip first m_start samples by reading them | ||||
| int length = AUD_DEFAULT_BUFFER_SIZE; | int length = AUD_DEFAULT_BUFFER_SIZE; | ||||
| AUD_Buffer buffer(AUD_DEFAULT_BUFFER_SIZE * AUD_SAMPLE_SIZE(specs)); | Buffer buffer(AUD_DEFAULT_BUFFER_SIZE * AUD_SAMPLE_SIZE(specs)); | ||||
| bool eos = false; | bool eos = false; | ||||
| for(int len = m_start * specs.rate; | for(int len = m_start * specs.rate; | ||||
| length > 0 && !eos; | length > 0 && !eos; | ||||
| Context not available. | |||||
| } | } | ||||
| } | } | ||||
| void AUD_LimiterReader::seek(int position) | void LimiterReader::seek(int position) | ||||
| { | { | ||||
| m_reader->seek(position + m_start * m_reader->getSpecs().rate); | m_reader->seek(position + m_start * m_reader->getSpecs().rate); | ||||
| } | } | ||||
| int AUD_LimiterReader::getLength() const | int LimiterReader::getLength() const | ||||
| { | { | ||||
| int len = m_reader->getLength(); | int len = m_reader->getLength(); | ||||
| AUD_SampleRate rate = m_reader->getSpecs().rate; | SampleRate rate = m_reader->getSpecs().rate; | ||||
| if(len < 0 || (len > m_end * rate && m_end >= 0)) | if(len < 0 || (len > m_end * rate && m_end >= 0)) | ||||
| len = m_end * rate; | len = m_end * rate; | ||||
| return len - m_start * rate; | return len - m_start * rate; | ||||
| } | } | ||||
| int AUD_LimiterReader::getPosition() const | int LimiterReader::getPosition() const | ||||
| { | { | ||||
| int pos = m_reader->getPosition(); | int pos = m_reader->getPosition(); | ||||
| AUD_SampleRate rate = m_reader->getSpecs().rate; | SampleRate rate = m_reader->getSpecs().rate; | ||||
| return AUD_MIN(pos, m_end * rate) - m_start * rate; | return std::min(pos, int(m_end * rate)) - m_start * rate; | ||||
| } | } | ||||
| void AUD_LimiterReader::read(int& length, bool& eos, sample_t* buffer) | void LimiterReader::read(int& length, bool& eos, sample_t* buffer) | ||||
| { | { | ||||
| eos = false; | eos = false; | ||||
| if(m_end >= 0) | if(m_end >= 0) | ||||
| { | { | ||||
| int position = m_reader->getPosition(); | int position = m_reader->getPosition(); | ||||
| AUD_SampleRate rate = m_reader->getSpecs().rate; | SampleRate rate = m_reader->getSpecs().rate; | ||||
| if(position + length > m_end * rate) | if(position + length > m_end * rate) | ||||
| { | { | ||||
| Context not available. | |||||
| else | else | ||||
| m_reader->read(length, eos, buffer); | m_reader->read(length, eos, buffer); | ||||
| } | } | ||||
| AUD_NAMESPACE_END | |||||
| Context not available. | |||||