Event Marshalling
Closed this issue · 3 comments
Hi Hayden,
I believe that your COM object casting problem is because you are not getting events called in the main thread. See the following example from one of BMD's API samples:
m_switcherMonitor = new SwitcherMonitor();
// note: this invoke pattern ensures our callback is called in the main thread. We are making double
// use of lambda expressions here to achieve this.
// Essentially, the events will arrive at the callback class (implemented by our monitor classes)
// on a separate thread. We must marshal these to the main thread, and we're doing this by calling
// invoke on the Windows Forms object. The lambda expression is just a simplification.
m_switcherMonitor.SwitcherDisconnected += new SwitcherEventHandler((s, a) => this.Invoke((Action)(() => SwitcherDisconnected())));
I set up a small test app using your library and got the COM error you described, but after wiring the event handler as described above, the problem was resolved. E.g.
_atem.Inputs.AuxInputs[0].Monitor.InputSourceChanged += new EventHandler((s, a) => this.Invoke((Action)(() => Aux1SourceChanged())));
I note that you haven't worked on this project for a while - have you abandoned it? I am working on an app to control an ATEM TV Studio HD (and a few other things) for my church, and your library is the best starting point I have found for C# development of ATEM control.
Best regards,
Conrad Venn
Hi,
Oh sweet, thanks!
Yeah i hadn't played with marshaling before i started this, nor do i really understand it now.. It's something i probably need to learn.
Yeah i've pretty much abandoned the project now as we've moved to Node Red using a raspi pi and some midi devices. This also has an added benefit of tying in the ATEM to our automation system so when we power on the system it sets the ATEM to some pre-defined inputs.
Good to see this is helpful for you :)
I'll probably attempt to fix the bug when i get time.
Thanks!