2
0
Fork 0

Working audio output from VST!

- Fix namespace clash with Value from DOSBox and Juce
- Generate samples using HiOPL wrapper and convert to floating point format
This commit is contained in:
bruce 2013-09-04 22:19:22 +08:00
parent d7e1629618
commit f160931d6f
7 changed files with 114 additions and 345 deletions

View file

@ -1,181 +0,0 @@
/*
==============================================================================
This is an automatically generated GUI class created by the Introjucer!
Be careful when adding custom code to these files, as only the code within
the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded
and re-saved.
Created with Introjucer version: 3.1.0
------------------------------------------------------------------------------
The Introjucer is part of the JUCE library - "Jules' Utility Class Extensions"
Copyright 2004-13 by Raw Material Software Ltd.
==============================================================================
*/
//[Headers] You can add your own extra header files here...
//[/Headers]
#include "OplGui.h"
//[MiscUserDefs] You can add your own user definitions and misc code here...
//[/MiscUserDefs]
//==============================================================================
NewComponent::NewComponent ()
{
addAndMakeVisible (label = new Label ("new label",
"Carrier waveform"));
label->setFont (Font (15.00f, Font::plain));
label->setJustificationType (Justification::centredLeft);
label->setEditable (false, false, false);
label->setColour (TextEditor::textColourId, Colours::black);
label->setColour (TextEditor::backgroundColourId, Colour (0x00000000));
addAndMakeVisible (wav_car_sin = new ToggleButton ("new toggle button"));
wav_car_sin->setButtonText ("Sine");
wav_car_sin->addListener (this);
addAndMakeVisible (toggleButton2 = new ToggleButton ("new toggle button"));
toggleButton2->setButtonText ("Half Sine");
toggleButton2->addListener (this);
addAndMakeVisible (toggleButton3 = new ToggleButton ("new toggle button"));
toggleButton3->setButtonText ("Abs Sine");
toggleButton3->addListener (this);
addAndMakeVisible (toggleButton4 = new ToggleButton ("new toggle button"));
toggleButton4->setButtonText ("Quarter Sine");
toggleButton4->addListener (this);
//[UserPreSize]
//[/UserPreSize]
setSize (600, 400);
//[Constructor] You can add your own custom stuff here..
//[/Constructor]
}
NewComponent::~NewComponent()
{
//[Destructor_pre]. You can add your own custom destruction code here..
//[/Destructor_pre]
label = nullptr;
wav_car_sin = nullptr;
toggleButton2 = nullptr;
toggleButton3 = nullptr;
toggleButton4 = nullptr;
//[Destructor]. You can add your own custom destruction code here..
//[/Destructor]
}
//==============================================================================
void NewComponent::paint (Graphics& g)
{
//[UserPrePaint] Add your own custom painting code here..
//[/UserPrePaint]
g.fillAll (Colours::white);
//[UserPaint] Add your own custom painting code here..
//[/UserPaint]
}
void NewComponent::resized()
{
label->setBounds (8, 8, 150, 24);
wav_car_sin->setBounds (152, 8, 150, 24);
toggleButton2->setBounds (152, 32, 150, 24);
toggleButton3->setBounds (152, 56, 150, 24);
toggleButton4->setBounds (152, 80, 150, 24);
//[UserResized] Add your own custom resize handling here..
//[/UserResized]
}
void NewComponent::buttonClicked (Button* buttonThatWasClicked)
{
//[UserbuttonClicked_Pre]
//[/UserbuttonClicked_Pre]
if (buttonThatWasClicked == wav_car_sin)
{
//[UserButtonCode_wav_car_sin] -- add your button handler code here..
//[/UserButtonCode_wav_car_sin]
}
else if (buttonThatWasClicked == toggleButton2)
{
//[UserButtonCode_toggleButton2] -- add your button handler code here..
//[/UserButtonCode_toggleButton2]
}
else if (buttonThatWasClicked == toggleButton3)
{
//[UserButtonCode_toggleButton3] -- add your button handler code here..
//[/UserButtonCode_toggleButton3]
}
else if (buttonThatWasClicked == toggleButton4)
{
//[UserButtonCode_toggleButton4] -- add your button handler code here..
//[/UserButtonCode_toggleButton4]
}
//[UserbuttonClicked_Post]
//[/UserbuttonClicked_Post]
}
//[MiscUserCode] You can add your own definitions of your custom methods or any other code here...
//[/MiscUserCode]
//==============================================================================
#if 0
/* -- Introjucer information section --
This is where the Introjucer stores the metadata that describe this GUI layout, so
make changes in here at your peril!
BEGIN_JUCER_METADATA
<JUCER_COMPONENT documentType="Component" className="NewComponent" componentName=""
parentClasses="public Component" constructorParams="" variableInitialisers=""
snapPixels="8" snapActive="1" snapShown="1" overlayOpacity="0.33"
fixedSize="0" initialWidth="600" initialHeight="400">
<BACKGROUND backgroundColour="ffffffff"/>
<LABEL name="new label" id="40d227ec2225494a" memberName="label" virtualName=""
explicitFocusOrder="0" pos="8 8 150 24" edTextCol="ff000000"
edBkgCol="0" labelText="Carrier waveform" editableSingleClick="0"
editableDoubleClick="0" focusDiscardsChanges="0" fontname="Default font"
fontsize="15" bold="0" italic="0" justification="33"/>
<TOGGLEBUTTON name="new toggle button" id="bfb505f78994ec5d" memberName="wav_car_sin"
virtualName="" explicitFocusOrder="0" pos="152 8 150 24" buttonText="Sine"
connectedEdges="0" needsCallback="1" radioGroupId="0" state="0"/>
<TOGGLEBUTTON name="new toggle button" id="f565d4caaf1be1c8" memberName="toggleButton2"
virtualName="" explicitFocusOrder="0" pos="152 32 150 24" buttonText="Half Sine"
connectedEdges="0" needsCallback="1" radioGroupId="0" state="0"/>
<TOGGLEBUTTON name="new toggle button" id="c8242ddebab8a74f" memberName="toggleButton3"
virtualName="" explicitFocusOrder="0" pos="152 56 150 24" buttonText="Abs Sine"
connectedEdges="0" needsCallback="1" radioGroupId="0" state="0"/>
<TOGGLEBUTTON name="new toggle button" id="86bf0db3d1bd0f34" memberName="toggleButton4"
virtualName="" explicitFocusOrder="0" pos="152 80 150 24" buttonText="Quarter Sine"
connectedEdges="0" needsCallback="1" radioGroupId="0" state="0"/>
</JUCER_COMPONENT>
END_JUCER_METADATA
*/
#endif
//[EndFile] You can add extra defines here...
//[/EndFile]

View file

@ -1,74 +0,0 @@
/*
==============================================================================
This is an automatically generated GUI class created by the Introjucer!
Be careful when adding custom code to these files, as only the code within
the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded
and re-saved.
Created with Introjucer version: 3.1.0
------------------------------------------------------------------------------
The Introjucer is part of the JUCE library - "Jules' Utility Class Extensions"
Copyright 2004-13 by Raw Material Software Ltd.
==============================================================================
*/
#ifndef __JUCE_HEADER_A8B78202A92195B5__
#define __JUCE_HEADER_A8B78202A92195B5__
//[Headers] -- You can add your own extra header files here --
#include "JuceHeader.h"
//[/Headers]
//==============================================================================
/**
//[Comments]
An auto-generated component, created by the Introjucer.
Describe your class and how it works here!
//[/Comments]
*/
class NewComponent : public Component,
public ButtonListener
{
public:
//==============================================================================
NewComponent ();
~NewComponent();
//==============================================================================
//[UserMethods] -- You can add your own custom methods in this section.
//[/UserMethods]
void paint (Graphics& g);
void resized();
void buttonClicked (Button* buttonThatWasClicked);
private:
//[UserVariables] -- You can add your own custom variables in this section.
//[/UserVariables]
//==============================================================================
ScopedPointer<Label> label;
ScopedPointer<ToggleButton> wav_car_sin;
ScopedPointer<ToggleButton> toggleButton2;
ScopedPointer<ToggleButton> toggleButton3;
ScopedPointer<ToggleButton> toggleButton4;
//==============================================================================
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NewComponent)
};
//[EndFile] You can add extra defines here...
//[/EndFile]
#endif // __JUCE_HEADER_A8B78202A92195B5__

View file

@ -10,14 +10,12 @@
#include "PluginProcessor.h"
#include "PluginEditor.h"
#include "hiopl.h"
//==============================================================================
JuceOplvstiAudioProcessor::JuceOplvstiAudioProcessor()
{
Opl = new Hiopl(buflen);
Opl->SetSampleRate(SAMPLE_RATE);
Opl = new Hiopl(44100); // 1 second at 44100
}
JuceOplvstiAudioProcessor::~JuceOplvstiAudioProcessor()
@ -128,8 +126,36 @@ void JuceOplvstiAudioProcessor::changeProgramName (int index, const String& newN
//==============================================================================
void JuceOplvstiAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock)
{
Opl->SetSampleRate(sampleRate);
// Use this method as the place to do any pre-playback
// initialisation that you need..
Opl->_WriteReg(0x20,0x32);
Opl->_WriteReg(0x23,0x21);
Opl->_WriteReg(0x40,0x1a);
Opl->_WriteReg(0x43,0x09);
Opl->_WriteReg(0x60,0x84);
Opl->_WriteReg(0x63,0x84);
Opl->_WriteReg(0x80,0x29);
Opl->_WriteReg(0x83,0x44);
Opl->_WriteReg(0xe3,0x00);
Opl->_WriteReg(0xe0,0x02);
Opl->_WriteReg(0xc0,0x06);
Opl->_WriteReg(0xa0,0x8b);
Opl->_WriteReg(0xb0,0x26);
Opl->_WriteReg(0x21,0x32);
Opl->_WriteReg(0x24,0x21);
Opl->_WriteReg(0x41,0x1a);
Opl->_WriteReg(0x44,0x09);
Opl->_WriteReg(0x61,0x84);
Opl->_WriteReg(0x64,0x84);
Opl->_WriteReg(0x81,0x29);
Opl->_WriteReg(0x84,0x44);
Opl->_WriteReg(0xe4,0x00);
Opl->_WriteReg(0xe1,0x02);
Opl->_WriteReg(0xc1,0x06);
Opl->_WriteReg(0xa1,0x8b);
Opl->_WriteReg(0xb1,0x2a);
}
void JuceOplvstiAudioProcessor::releaseResources()
@ -140,22 +166,8 @@ void JuceOplvstiAudioProcessor::releaseResources()
void JuceOplvstiAudioProcessor::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages)
{
// This is the place where you'd normally do the guts of your plugin's
// audio processing...
for (int channel = 0; channel < getNumInputChannels(); ++channel)
{
float* channelData = buffer.getSampleData (channel);
// ..do something to the data...
}
// In case we have more outputs than inputs, we'll clear any output
// channels that didn't contain input data, (because these aren't
// guaranteed to be empty - they may contain garbage).
for (int i = getNumInputChannels(); i < getNumOutputChannels(); ++i)
{
buffer.clear (i, 0, buffer.getNumSamples());
}
buffer.clear(0, 0, buffer.getNumSamples());
Opl->Generate(buffer.getNumSamples(), buffer.getSampleData(0));
}
//==============================================================================

View file

@ -12,6 +12,7 @@
#define PLUGINPROCESSOR_H_INCLUDED
#include "../JuceLibraryCode/JuceHeader.h"
#include "hiopl.h"
//==============================================================================
@ -67,6 +68,8 @@ public:
void setStateInformation (const void* data, int sizeInBytes);
private:
Hiopl *Opl;
//==============================================================================
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceOplvstiAudioProcessor)
};

View file

@ -17,6 +17,14 @@ void Hiopl::Generate(int length, short* buffer) {
}
}
void Hiopl::Generate(int length, float* buffer) {
// This would be better done using Juce's built in audio format conversion.
adlib->Generate(length, Buf32);
for (int i = 0; i < length; i++) {
buffer[i] = (float)(Buf32[i])/32768.0f;
}
}
void Hiopl::SetSampleRate(int hz) {
adlib->Init(hz);
}

View file

@ -18,6 +18,7 @@ class Hiopl {
public:
Hiopl(int buflen);
void Generate(int length, short* buffer);
void Generate(int length, float* buffer);
void SetSampleRate(int hz);
void SetWaveform(int ch, int osc, Waveform wave);
Waveform GetWaveform(int ch, int osc);

View file

@ -54,11 +54,11 @@ public:
};
class Value {
class DbxValue {
/*
* Multitype storage container that is aware of the currently stored type in it.
* Value st = "hello";
* Value in = 1;
* DbxValue st = "hello";
* DbxValue in = 1;
* st = 12 //Exception
* in = 12 //works
*/
@ -73,39 +73,39 @@ public:
enum Etype { V_NONE, V_HEX, V_BOOL, V_INT, V_STRING, V_DOUBLE,V_CURRENT} type;
/* Constructors */
Value() :_string(0), type(V_NONE) { };
Value(Hex in) :_hex(in), type(V_HEX) { };
Value(int in) :_int(in), type(V_INT) { };
Value(bool in) :_bool(in), type(V_BOOL) { };
Value(double in) :_double(in), type(V_DOUBLE) { };
Value(std::string const& in) :_string(new std::string(in)),type(V_STRING) { };
Value(char const * const in) :_string(new std::string(in)),type(V_STRING) { };
Value(Value const& in):_string(0) {plaincopy(in);}
~Value() { destroy();};
Value(std::string const& in,Etype _t) :_string(0),type(V_NONE) {SetValue(in,_t);}
DbxValue() :_string(0), type(V_NONE) { };
DbxValue(Hex in) :_hex(in), type(V_HEX) { };
DbxValue(int in) :_int(in), type(V_INT) { };
DbxValue(bool in) :_bool(in), type(V_BOOL) { };
DbxValue(double in) :_double(in), type(V_DOUBLE) { };
DbxValue(std::string const& in) :_string(new std::string(in)),type(V_STRING) { };
DbxValue(char const * const in) :_string(new std::string(in)),type(V_STRING) { };
DbxValue(DbxValue const& in):_string(0) {plaincopy(in);}
~DbxValue() { destroy();};
DbxValue(std::string const& in,Etype _t) :_string(0),type(V_NONE) {SetDbxValue(in,_t);}
/* Assigment operators */
Value& operator= (Hex in) throw(WrongType) { return copy(Value(in));}
Value& operator= (int in) throw(WrongType) { return copy(Value(in));}
Value& operator= (bool in) throw(WrongType) { return copy(Value(in));}
Value& operator= (double in) throw(WrongType) { return copy(Value(in));}
Value& operator= (std::string const& in) throw(WrongType) { return copy(Value(in));}
Value& operator= (char const * const in) throw(WrongType) { return copy(Value(in));}
Value& operator= (Value const& in) throw(WrongType) { return copy(Value(in));}
DbxValue& operator= (Hex in) throw(WrongType) { return copy(DbxValue(in));}
DbxValue& operator= (int in) throw(WrongType) { return copy(DbxValue(in));}
DbxValue& operator= (bool in) throw(WrongType) { return copy(DbxValue(in));}
DbxValue& operator= (double in) throw(WrongType) { return copy(DbxValue(in));}
DbxValue& operator= (std::string const& in) throw(WrongType) { return copy(DbxValue(in));}
DbxValue& operator= (char const * const in) throw(WrongType) { return copy(DbxValue(in));}
DbxValue& operator= (DbxValue const& in) throw(WrongType) { return copy(DbxValue(in));}
bool operator== (Value const & other);
bool operator== (DbxValue const & other);
operator bool () const throw(WrongType);
operator Hex () const throw(WrongType);
operator int () const throw(WrongType);
operator double () const throw(WrongType);
operator char const* () const throw(WrongType);
void SetValue(std::string const& in,Etype _type = V_CURRENT) throw(WrongType);
void SetDbxValue(std::string const& in,Etype _type = V_CURRENT) throw(WrongType);
std::string ToString() const;
private:
void destroy() throw();
Value& copy(Value const& in) throw(WrongType);
void plaincopy(Value const& in) throw();
DbxValue& copy(DbxValue const& in) throw(WrongType);
void plaincopy(DbxValue const& in) throw();
void set_hex(std::string const& in);
void set_int(std::string const&in);
void set_bool(std::string const& in);
@ -115,104 +115,104 @@ private:
class Property {
public:
struct Changeable { enum Value {Always, WhenIdle,OnlyAtStart};};
struct Changeable { enum DbxValue {Always, WhenIdle,OnlyAtStart};};
const std::string propname;
Property(std::string const& _propname, Changeable::Value when):propname(_propname),change(when) { }
Property(std::string const& _propname, Changeable::DbxValue when):propname(_propname),change(when) { }
void Set_values(const char * const * in);
void Set_help(std::string const& str);
char const* Get_help();
virtual void SetValue(std::string const& str)=0;
Value const& GetValue() const { return value;}
Value const& Get_Default_Value() const { return default_value; }
//CheckValue returns true if value is in suggested_values;
virtual void SetDbxValue(std::string const& str)=0;
DbxValue const& GetDbxValue() const { return value;}
DbxValue const& Get_Default_DbxValue() const { return default_value; }
//CheckDbxValue returns true if value is in suggested_values;
//Type specific properties are encouraged to override this and check for type
//specific features.
virtual bool CheckValue(Value const& in, bool warn);
virtual bool CheckDbxValue(DbxValue const& in, bool warn);
//Set interval value to in or default if in is invalid. force always sets the value.
void SetVal(Value const& in, bool forced,bool warn=true) {if(forced || CheckValue(in,warn)) value = in; else value = default_value;}
void SetVal(DbxValue const& in, bool forced,bool warn=true) {if(forced || CheckDbxValue(in,warn)) value = in; else value = default_value;}
virtual ~Property(){ }
virtual const std::vector<Value>& GetValues() const;
Value::Etype Get_type(){return default_value.type;}
virtual const std::vector<DbxValue>& GetDbxValues() const;
DbxValue::Etype Get_type(){return default_value.type;}
protected:
Value value;
std::vector<Value> suggested_values;
typedef std::vector<Value>::iterator iter;
Value default_value;
const Changeable::Value change;
DbxValue value;
std::vector<DbxValue> suggested_values;
typedef std::vector<DbxValue>::iterator iter;
DbxValue default_value;
const Changeable::DbxValue change;
};
class Prop_int:public Property {
public:
Prop_int(std::string const& _propname,Changeable::Value when, int _value)
Prop_int(std::string const& _propname,Changeable::DbxValue when, int _value)
:Property(_propname,when) {
default_value = value = _value;
min = max = -1;
}
Prop_int(std::string const& _propname,Changeable::Value when, int _min,int _max,int _value)
Prop_int(std::string const& _propname,Changeable::DbxValue when, int _min,int _max,int _value)
:Property(_propname,when) {
default_value = value = _value;
min = _min;
max = _max;
}
void SetMinMax(Value const& min,Value const& max) {this->min = min; this->max=max;}
void SetValue(std::string const& in);
void SetMinMax(DbxValue const& min,DbxValue const& max) {this->min = min; this->max=max;}
void SetDbxValue(std::string const& in);
~Prop_int(){ }
virtual bool CheckValue(Value const& in, bool warn);
virtual bool CheckDbxValue(DbxValue const& in, bool warn);
private:
Value min,max;
DbxValue min,max;
};
class Prop_double:public Property {
public:
Prop_double(std::string const & _propname, Changeable::Value when, double _value)
Prop_double(std::string const & _propname, Changeable::DbxValue when, double _value)
:Property(_propname,when){
default_value = value = _value;
}
void SetValue(std::string const& input);
void SetDbxValue(std::string const& input);
~Prop_double(){ }
};
class Prop_bool:public Property {
public:
Prop_bool(std::string const& _propname, Changeable::Value when, bool _value)
Prop_bool(std::string const& _propname, Changeable::DbxValue when, bool _value)
:Property(_propname,when) {
default_value = value = _value;
}
void SetValue(std::string const& in);
void SetDbxValue(std::string const& in);
~Prop_bool(){ }
};
class Prop_string:public Property{
public:
Prop_string(std::string const& _propname, Changeable::Value when, char const * const _value)
Prop_string(std::string const& _propname, Changeable::DbxValue when, char const * const _value)
:Property(_propname,when) {
default_value = value = _value;
}
void SetValue(std::string const& in);
virtual bool CheckValue(Value const& in, bool warn);
void SetDbxValue(std::string const& in);
virtual bool CheckDbxValue(DbxValue const& in, bool warn);
~Prop_string(){ }
};
class Prop_path:public Prop_string{
public:
std::string realpath;
Prop_path(std::string const& _propname, Changeable::Value when, char const * const _value)
Prop_path(std::string const& _propname, Changeable::DbxValue when, char const * const _value)
:Prop_string(_propname,when,_value) {
default_value = value = _value;
realpath = _value;
}
void SetValue(std::string const& in);
void SetDbxValue(std::string const& in);
~Prop_path(){ }
};
class Prop_hex:public Property {
public:
Prop_hex(std::string const& _propname, Changeable::Value when, Hex _value)
Prop_hex(std::string const& _propname, Changeable::DbxValue when, Hex _value)
:Property(_propname,when) {
default_value = value = _value;
}
void SetValue(std::string const& in);
void SetDbxValue(std::string const& in);
~Prop_hex(){ }
};
@ -242,7 +242,7 @@ public:
void ExecuteDestroy(bool destroyall=true);
const char* GetName() const {return sectionname.c_str();}
virtual std::string GetPropValue(std::string const& _property) const =0;
virtual std::string GetPropDbxValue(std::string const& _property) const =0;
virtual void HandleInputline(std::string const& _line)=0;
virtual void PrintData(FILE* outfile) const =0;
virtual ~Section() { /*Children must call executedestroy ! */}
@ -258,14 +258,14 @@ private:
public:
Section_prop(std::string const& _sectionname):Section(_sectionname){}
Prop_int* Add_int(std::string const& _propname, Property::Changeable::Value when, int _value=0);
Prop_string* Add_string(std::string const& _propname, Property::Changeable::Value when, char const * const _value=NULL);
Prop_path* Add_path(std::string const& _propname, Property::Changeable::Value when, char const * const _value=NULL);
Prop_bool* Add_bool(std::string const& _propname, Property::Changeable::Value when, bool _value=false);
Prop_hex* Add_hex(std::string const& _propname, Property::Changeable::Value when, Hex _value=0);
Prop_int* Add_int(std::string const& _propname, Property::Changeable::DbxValue when, int _value=0);
Prop_string* Add_string(std::string const& _propname, Property::Changeable::DbxValue when, char const * const _value=NULL);
Prop_path* Add_path(std::string const& _propname, Property::Changeable::DbxValue when, char const * const _value=NULL);
Prop_bool* Add_bool(std::string const& _propname, Property::Changeable::DbxValue when, bool _value=false);
Prop_hex* Add_hex(std::string const& _propname, Property::Changeable::DbxValue when, Hex _value=0);
// void Add_double(char const * const _propname, double _value=0.0);
Prop_multival *Add_multi(std::string const& _propname, Property::Changeable::Value when,std::string const& sep);
Prop_multival_remain *Add_multiremain(std::string const& _propname, Property::Changeable::Value when,std::string const& sep);
Prop_multival *Add_multi(std::string const& _propname, Property::Changeable::DbxValue when,std::string const& sep);
Prop_multival_remain *Add_multiremain(std::string const& _propname, Property::Changeable::DbxValue when,std::string const& sep);
Property* Get_prop(int index);
int Get_int(std::string const& _propname) const;
@ -278,7 +278,7 @@ public:
Prop_multival_remain* Get_multivalremain(std::string const& _propname) const;
void HandleInputline(std::string const& gegevens);
void PrintData(FILE* outfile) const;
virtual std::string GetPropValue(std::string const& _property) const;
virtual std::string GetPropDbxValue(std::string const& _property) const;
//ExecuteDestroy should be here else the destroy functions use destroyed properties
virtual ~Section_prop();
};
@ -289,21 +289,21 @@ protected:
std::string seperator;
void make_default_value();
public:
Prop_multival(std::string const& _propname, Changeable::Value when,std::string const& sep):Property(_propname,when), section(new Section_prop("")),seperator(sep) {
Prop_multival(std::string const& _propname, Changeable::DbxValue when,std::string const& sep):Property(_propname,when), section(new Section_prop("")),seperator(sep) {
default_value = value = "";
}
Section_prop *GetSection() { return section; }
const Section_prop *GetSection() const { return section; }
virtual void SetValue(std::string const& input);
virtual const std::vector<Value>& GetValues() const;
virtual void SetDbxValue(std::string const& input);
virtual const std::vector<DbxValue>& GetDbxValues() const;
~Prop_multival() { delete section; }
}; //value bevat totale string. setvalue zet elk van de sub properties en checked die.
class Prop_multival_remain:public Prop_multival{
public:
Prop_multival_remain(std::string const& _propname, Changeable::Value when,std::string const& sep):Prop_multival(_propname,when,sep){ }
Prop_multival_remain(std::string const& _propname, Changeable::DbxValue when,std::string const& sep):Prop_multival(_propname,when,sep){ }
virtual void SetValue(std::string const& input);
virtual void SetDbxValue(std::string const& input);
};
@ -313,7 +313,7 @@ public:
~Section_line(){ExecuteDestroy(true);}
void HandleInputline(std::string const& gegevens);
void PrintData(FILE* outfile) const;
virtual std::string GetPropValue(std::string const& _property) const;
virtual std::string GetPropDbxValue(std::string const& _property) const;
std::string data;
};