|
CLAM-Development
1.3
|
00001 #ifndef AudioSink_hxx 00002 #define AudioSink_hxx 00003 00004 #include "Processing.hxx" 00005 #include "AudioInPort.hxx" 00006 00007 #include <sstream> 00008 00009 namespace CLAM 00010 { 00011 class AudioSink : public Processing 00012 { 00013 public: 00014 struct Port 00015 { 00016 float* mFloatBuffer; 00017 double* mDoubleBuffer; 00018 unsigned mBufferSize; 00019 AudioInPort* mPort; 00020 00021 //resize needs a default constructor 00022 Port() 00023 : mFloatBuffer(0), mDoubleBuffer(0), mBufferSize(0), mPort(0) 00024 { 00025 } 00026 00027 explicit Port(AudioInPort* p) 00028 : mFloatBuffer(0), mDoubleBuffer(0), mBufferSize(0), mPort(p) 00029 { 00030 } 00031 }; 00032 typedef std::vector<Port> Ports; 00033 00034 private: 00035 class Config : public ProcessingConfig 00036 { 00037 DYNAMIC_TYPE_USING_INTERFACE( Config, 1, ProcessingConfig ); 00038 DYN_ATTRIBUTE( 0, public, int, NSinks); 00039 protected: 00040 void DefaultInit() 00041 { 00042 AddAll(); 00043 UpdateData(); 00044 SetNSinks(1); 00045 }; 00046 void LoadFrom(Storage & storage) 00047 { 00048 ProcessingConfig::LoadFrom(storage); 00049 if (not HasNSinks()) 00050 { 00051 AddNSinks(); 00052 UpdateData(); 00053 SetNSinks(1); 00054 } 00055 } 00056 }; 00057 00058 private: 00059 Config _config; 00060 Ports _ports; 00061 00062 public: 00063 AudioSink(const ProcessingConfig & config=Config()) 00064 { 00065 //After being dropped it is ready to run as it does not need any configuration at all 00066 //SetExecState(Ready); 00067 Configure( config ); 00068 ResizePorts(1); 00069 } 00070 00071 ~AudioSink() 00072 { 00073 for (unsigned port = 0; port < _ports.size(); ++port) 00074 delete _ports[port].mPort; 00075 } 00076 00078 void SetFrameAndHopSize(const int val, unsigned index) 00079 { 00080 CLAM_ASSERT(index < _ports.size(), "AudioInPort index out of range"); 00081 Port& port = _ports[index]; 00082 port.mPort->SetSize(val); 00083 port.mPort->SetHop(val); 00084 } 00085 00086 void SetExternalBuffer(float* buf, unsigned nframes, unsigned index); 00087 void SetExternalBuffer(double* buf, unsigned nframes, unsigned index); 00088 00089 bool Do(); 00090 00091 const char* GetClassName() const { return "AudioSink";} 00092 00093 const ProcessingConfig & GetConfig() const 00094 { 00095 return _config; 00096 } 00097 00098 bool ConcreteConfigure(const ProcessingConfig& config) 00099 { 00100 CopyAsConcreteConfig(_config, config); 00101 unsigned sinks = _config.GetNSinks(); 00102 00103 ResizePorts(sinks); 00104 00105 return true; 00106 } 00107 00108 Ports& GetPorts() { return _ports; } 00109 00110 private: 00111 std::string const Portname(unsigned port) const 00112 { 00113 std::ostringstream os; 00114 os << port + 1; //to make ports one based (when viewed in jack) 00115 return os.str(); 00116 } 00117 00118 void ResizePorts(unsigned sinks) 00119 { 00120 if (sinks == _ports.size()) 00121 return; 00122 00123 for (unsigned port = sinks; port < _ports.size(); ++port) 00124 delete _ports[port].mPort; 00125 00126 unsigned oldSize = _ports.size(); 00127 _ports.resize(sinks); 00128 00129 for (unsigned port = oldSize; port < sinks; ++port) 00130 _ports[port] = Port(new AudioInPort(Portname(port), this)); 00131 } 00132 }; 00133 00134 } //namespace CLAM 00135 00136 #endif 00137
1.7.6.1