I'm writing some code that is checking if a specific midi device is plugged in, and if it isn't the code rechecks every 5 seconds until it is plugged in.
My problem comes about in checking the list of devices - the external library has no function to re-check the ports, as it only does it in the constructor of the class.
The only way I could see of getting my code to recheck the list of devices is to re-initialize the class object.
The class object is declared in the header file as ofxMidiIn midiIn;
, as it is used globally in the cpp file. The issue is if I 'redeclare' within a function in the cpp it doesn't appear to replace the object in the global scope, even though it is locally fine.
To clarify with pseudocode:
In the .h:
class foo {
ofxMidiIn midiIn; //first initialization does a port scan
};
in the .cpp:
void foo::setup(){
midiIn.listPorts(); //if this fails the recheck is triggered every 5 secs
}
void foo::run(){
//if setup failed then while (!recheck());
}
bool foo::recheck(){
ofxMidiIn midiIn;
midiIn.listPorts(); //this works in this (local) scope, but doesn't reassign midiIn globally
}
By using placement new
you can re-call the constructor:
bool foo::recheck()
{
new (&midiIn) ofxMidiIn();
midiIn.listPorts();
}
The line new (&midiIn) ofxMidiIn()
will re-construct midiIn
in its own memory region, by calling the constructor of ofxMidiIn
. However, this approach will create problem if ofxMidiIn
has pointer(s), and you've allocated memory for them in the previous object. You will be leaking memory. You can call the destructor explicitly though, by writing as:
(&midiIn)->~ofxMidiIn(); //call the destructor explicitly
new (&midiIn) ofxMidiIn(); //then do this!
Demo : http://ideone.com/OaUtw
Anyway, I believe that better and clean solution would be to make the variable as pointer as:
ofxMidiIn *midiIn;
And then use new
and delete
. And when you do new
for the next time, must delete the previous object by writing as:
bool foo::recheck()
{
delete midiIn; //must do this if it already has been allocated memory!
midiIn = new ofxMidiIn();
midiIn->listPorts();
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With