[PD-dev] Synchronizing OpenGL with libpd (with RtAudio or Port Audio)

Dan Wilcox danomatika at gmail.com
Fri Feb 19 02:34:18 CET 2016


Good to hear.

--------
Dan Wilcox
@danomatika <https://twitter.com/danomatika>
danomatika.com <http://danomatika.com/>
robotcowboy.com <http://robotcowboy.com/>
> On Feb 18, 2016, at 6:03 PM, 0222445 <Luis.Valdivia at stud.sbg.ac.at> wrote:
> 
> Thansk for your help. Yes, you are rigth, the problem was in the interaction between the wxwidgets main loop and the gl context.
> For the Pd-dev list:
> The solution is to write an Idle function, I made the following changes:
> //on WxApp class
> void MyApp::activateRenderLoop(bool on) {
>     if(on && !render_loop_on) {
>         Connect(wxID_ANY, wxEVT_IDLE, wxIdleEventHandler(MyApp::onIdle));
>         render_loop_on = true;
>     }
>     else if (!on && render_loop_on) {
>         Disconnect(wxEVT_IDLE, wxIdleEventHandler(MyApp::onIdle));
>         render_loop_on = false;
>     }
> }
> 
> void MyApp::onIdle(wxIdleEvent &evt) {
>     activateRenderLoop(glPane->render_on);
>     if(render_loop_on) {
>         std::cout<<"MyApp on Idle, render_loop_on"<<std::endl;
>         glPane->paint_now();
>         evt.RequestMore();
>     }
> }
> 
> //on event table:
> EVT_PAINT(BasicGLPane::paint_rt)
> 
> //on WxGLCanvas class
> void BasicGLPane::rightClick(wxMouseEvent& event) {
>     render_on = true;
>     manager->init();
>     SLEEP(2000);
>     manager->play();
>     wxGetApp().activateRenderLoop(true);    
> }
> 
> void BasicGLPane::paint_rt(wxPaintEvent &evt) {
>     wxPaintDC dc(this);
>     render_rt(dc);
> }
> 
> void BasicGLPane::paint_now(){
>     wxClientDC dc(this);
>     std::cout<<"paint now() "<<std::endl;
>     render_rt(dc);
> }
> 
> void BasicGLPane::render_rt(wxDC &dc) {
>     wxGLCanvas::SetCurrent(*m_context);
>     if(_object->getCounter()>=10) { 
>         wxGetApp().activateRenderLoop(false);
>         manager->stop();
>         render_on = false;
>     }
>     else {
>         ctx = CGLGetCurrentContext();
>         err =  CGLEnable( ctx, kCGLCEMPEngine);
>         std::cout<<"render_rt CGLError: "<<err<<std::endl;
>         if (err==0) {
>             glTranslatef(p3->x, p3->y, 0);
>             Refresh(false);
>         }
> 
>     }
> }
> and the synchronisation works now.
> Regards.
> Luis
> 
> 2016-02-18 3:15 GMT+01:00 Dan Wilcox <danomatika at gmail.com <mailto:danomatika at gmail.com>>:
> That shouldn’t make a difference, but you could try it. People haven’t had problems with OpenGL + libpd using ofxPd in open frameworks, so it may be due to how the wx widget mainloop & gl context interact.
> 
> --------
> Dan Wilcox
> @danomatika <https://twitter.com/danomatika>
> danomatika.com <http://danomatika.com/>
> robotcowboy.com <http://robotcowboy.com/>
>> On Feb 17, 2016, at 7:12 PM, 0222445 <Luis.Valdivia at stud.sbg.ac.at <mailto:Luis.Valdivia at stud.sbg.ac.at>> wrote:
>> 
>> There is no context error in the OpenGL draw now (solved with the call wxGLCanvas::SetCurrent(*m_context) but the draw still doesn't works (the object is moved after the manager->stop() and not during the execution) . I still think RtAudio is owning the CPU and blocking the execution of other threads or process. It will be better to do it with PortAudio?
> 
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puredata.info/pipermail/pd-dev/attachments/20160218/750b3be5/attachment.html>


More information about the Pd-dev mailing list