![]() |
pl-nk v0.4.5
Plonk|Plink|Plank are a set of cross-platform C/C++ frameworks for audio software development
|
00001 /* 00002 ------------------------------------------------------------------------------- 00003 This file is part of the Plink, Plonk, Plank libraries 00004 by Martin Robinson 00005 00006 http://code.google.com/p/pl-nk/ 00007 00008 Copyright University of the West of England, Bristol 2011-14 00009 All rights reserved. 00010 00011 Redistribution and use in source and binary forms, with or without 00012 modification, are permitted provided that the following conditions are met: 00013 00014 * Redistributions of source code must retain the above copyright 00015 notice, this list of conditions and the following disclaimer. 00016 * Redistributions in binary form must reproduce the above copyright 00017 notice, this list of conditions and the following disclaimer in the 00018 documentation and/or other materials provided with the distribution. 00019 * Neither the name of University of the West of England, Bristol nor 00020 the names of its contributors may be used to endorse or promote products 00021 derived from this software without specific prior written permission. 00022 00023 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 00024 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 00025 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00026 DISCLAIMED. IN NO EVENT SHALL UNIVERSITY OF THE WEST OF ENGLAND, BRISTOL BE 00027 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00028 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 00029 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00030 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00031 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 00032 OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00033 00034 This software makes use of third party libraries. For more information see: 00035 doc/license.txt included in the distribution. 00036 ------------------------------------------------------------------------------- 00037 */ 00038 00039 #ifndef PLONK_ATOMICVARIABLECHANNEL_H 00040 #define PLONK_ATOMICVARIABLECHANNEL_H 00041 00042 #include "../channel/plonk_ChannelInternalCore.h" 00043 #include "../plonk_GraphForwardDeclarations.h" 00044 00046 template<class SampleType> 00047 class AtomicVariableChannelInternal 00048 : public ChannelInternal<SampleType, ChannelInternalCore::Data> 00049 { 00050 public: 00051 typedef ChannelInternalCore::Data Data; 00052 typedef ChannelBase<SampleType> ChannelType; 00053 typedef AtomicVariableChannelInternal<SampleType> AtomicVariableChannelInternalType; 00054 typedef ChannelInternal<SampleType,Data> Internal; 00055 typedef ChannelInternalBase<SampleType> InternalBase; 00056 typedef UnitBase<SampleType> UnitType; 00057 typedef InputDictionary Inputs; 00058 typedef NumericalArray<SampleType> Buffer; 00059 typedef AtomicValue<SampleType> AtomicType; 00060 typedef Variable<AtomicType&> AtomicVariableType; 00061 00062 AtomicVariableChannelInternal (Inputs const& inputs, 00063 Data const& data, 00064 BlockSize const& blockSize, 00065 SampleRate const& sampleRate) throw() 00066 : Internal (inputs, data, blockSize, sampleRate) 00067 { 00068 } 00069 00070 Text getName() const throw() 00071 { 00072 return "Atomic Variable"; 00073 } 00074 00075 IntArray getInputKeys() const throw() 00076 { 00077 const IntArray keys (IOKey::AtomicVariable); 00078 return keys; 00079 } 00080 00081 InternalBase* getChannel (const int /*index*/) throw() 00082 { 00083 return this; 00084 } 00085 00086 void initChannel (const int /*channel*/) throw() 00087 { 00088 AtomicVariableType& atomicVariable = ChannelInternalCore::getInputAs<AtomicVariableType> (IOKey::AtomicVariable); 00089 AtomicType& atomicValue = atomicVariable.getValue(); 00090 00091 this->initValue (atomicValue.getValue()); 00092 } 00093 00094 void process (ProcessInfo& /*info*/, const int /*channel*/) throw() 00095 { 00096 AtomicVariableType& atomicVariable = ChannelInternalCore::getInputAs<AtomicVariableType> (IOKey::AtomicVariable); 00097 AtomicType& atomicValue = atomicVariable.getValue(); 00098 00099 SampleType* const outputSamples = this->getOutputSamples(); 00100 const int outputBufferLength = this->getOutputBuffer().length(); 00101 00102 for (int i = 0; i < outputBufferLength; ++i) 00103 outputSamples[i] = atomicValue.getValue(); 00104 } 00105 00106 private: 00107 }; 00108 00109 00110 00111 //------------------------------------------------------------------------------ 00112 00124 template<class SampleType> 00125 class AtomicVariableUnit 00126 { 00127 public: 00128 typedef AtomicVariableChannelInternal<SampleType> AtomicVariableChannelInternalType; 00129 typedef typename AtomicVariableChannelInternalType::Data Data; 00130 typedef ChannelBase<SampleType> ChannelType; 00131 typedef ChannelInternal<SampleType,Data> Internal; 00132 typedef ChannelInternalBase<SampleType> InternaBase; 00133 typedef UnitBase<SampleType> UnitType; 00134 typedef InputDictionary Inputs; 00135 typedef NumericalArray<SampleType> Buffer; 00136 typedef AtomicValue<SampleType> AtomicType; 00137 typedef Variable<AtomicType&> AtomicVariableType; 00138 00139 static inline UnitInfos getInfo() throw() 00140 { 00141 const double blockSize = (double)BlockSize::getDefault().getValue(); 00142 // const double sampleRate = SampleRate::getDefault().getValue(); 00143 00144 return UnitInfo ("Atomic Variable", "An atomic variable value.", 00145 00146 // output 00147 1, 00148 IOKey::Generic, Measure::None, IOInfo::NoDefault, IOLimit::None, 00149 IOKey::End, 00150 00151 // inputs 00152 IOKey::AtomicVariable, Measure::None, 0.0, IOLimit::None, 00153 IOKey::BlockSize, Measure::Samples, blockSize, IOLimit::Minimum, Measure::Samples, 1.0, 00154 IOKey::End); 00155 } 00156 00158 static UnitType ar (AtomicVariableType const& atomicVariable = SampleType (0), 00159 BlockSize const& preferredBlockSize = BlockSize::getDefault()) throw() 00160 { 00161 Inputs inputs; 00162 inputs.put (IOKey::AtomicVariable, atomicVariable); 00163 00164 Data data = { -1.0, -1.0 }; 00165 00166 const SampleRate preferredSampleRate = (preferredBlockSize == BlockSize::getDefault()) ? 00167 SampleRate::getDefault() : 00168 (SampleRate::getDefault() / BlockSize::getDefault()) * preferredBlockSize; 00169 00170 return UnitType::template createFromInputs<AtomicVariableChannelInternalType> (inputs, 00171 data, 00172 preferredBlockSize, 00173 preferredSampleRate); 00174 } 00175 00176 static UnitType kr (AtomicVariableType const& atomicVariable = SampleType (0)) throw() 00177 { 00178 Inputs inputs; 00179 inputs.put (IOKey::AtomicVariable, atomicVariable); 00180 00181 Data data = { -1.0, -1.0 }; 00182 00183 return UnitType::template createFromInputs<AtomicVariableChannelInternalType> (inputs, 00184 data, 00185 BlockSize::getControlRateBlockSize(), 00186 SampleRate::getControlRate()); 00187 } 00188 }; 00189 00190 // can't have a default typedef yet just in case the user uses a default type that can't be atomic. 00191 00192 00193 #endif // PLONK_ATOMICVARIABLECHANNEL_H 00194 00195