00001 /*************************************************************************** 00002 * Copyright (C) 2003 by Gav Wood * 00003 * gav@cs.york.ac.uk * 00004 * * 00005 * This program is free software; you can redistribute it and/or modify * 00006 * it under the terms of the GNU Library General Public License as * 00007 * published by the Free Software Foundation; either version 2 of the * 00008 * License, or (at your option) any later version. * 00009 ***************************************************************************/ 00010 00011 #ifndef _GEDDEI_LXCONNECTION_H 00012 #define _GEDDEI_LXCONNECTION_H 00013 00014 #ifdef __GEDDEI_BUILD 00015 #include "connection.h" 00016 #include "bufferdata.h" 00017 #include "signaltyperef.h" 00018 #else 00019 #include <geddei/connection.h> 00020 #include <geddei/bufferdata.h> 00021 #include <geddei/signaltyperef.h> 00022 #endif 00023 using namespace Geddei; 00024 00025 namespace Geddei 00026 { 00027 00028 class Source; 00029 00046 class LxConnection: virtual public Connection, public ScratchOwner 00047 { 00048 friend class Processor; 00049 friend class DomProcessor; 00050 friend class Splitter; 00051 00052 float *theScratch; 00053 uint theScratchSize; 00054 BufferID lastScratch; 00055 00063 virtual void pushScratch(const BufferData &data); 00064 00073 virtual void forgetScratch(const BufferData &data); 00074 00079 00094 virtual void pushPlunger() = 0; 00095 00102 virtual const bool waitUntilReady() = 0; 00103 00113 virtual void setType(const SignalType *type) = 0; 00114 00119 virtual void resetType() = 0; 00120 00125 virtual void sourceStopping() = 0; 00126 00130 virtual void sourceStopped() = 0; 00131 00135 virtual void reset() = 0; 00136 00141 virtual void startPlungers() = 0; 00142 00147 virtual void noMorePlungers() = 0; 00148 00153 virtual void plungerSent() = 0; 00154 00156 00157 protected: 00158 Source *theSource; 00159 uint theSourceIndex; 00160 00164 LxConnection(Source *source, const uint sourceIndex); 00165 00175 virtual const uint maximumScratchElements(const uint minimum = 1) = 0; 00176 00186 virtual const uint maximumScratchElementsEver() = 0; 00187 00207 virtual BufferData makeScratchElements(const uint elements, bool autoPush = false); 00208 00209 public: 00215 virtual const SignalTypeRef type() { return SignalTypeRef(theType); } 00216 00231 virtual BufferData makeScratchSamples(const uint samples, bool autoPush = false); 00232 00247 virtual BufferData makeScratchSample(bool autoPush = false) { return makeScratchSamples(1, autoPush); } 00248 00263 virtual BufferData makeScratchSeconds(const float seconds, bool autoPush = false); 00264 00280 virtual BufferData makeScratchSecond(bool autoPush = false) { return makeScratchSeconds(1., autoPush); } 00281 00293 virtual void push(const BufferData &data) = 0; 00294 00304 const uint maximumScratchSamples(const uint minimum = 1) { return maximumScratchElements(theType->elementsFromSamples(minimum)) == Undefined ? Undefined : theType->samples(maximumScratchElements(theType->elementsFromSamples(minimum))); } 00305 00315 const uint maximumScratchSamplesEver() { return maximumScratchElementsEver() == Undefined ? Undefined : theType->samples(maximumScratchElementsEver()); } 00316 00331 LxConnection &operator<<(const BufferData &data) { push(data); return *this; } 00332 00347 BufferData operator+(const uint samples) { return makeScratchSamples(samples); } 00348 00352 ~LxConnection(); 00353 }; 00354 00355 } 00356 00357 #endif