예제 #1
0
 /**
  * Thread of the receiver socket. It handles all incoming data
  * and forwards it to the main event loop.
  */
 void receiverThread() {
     // hold a reference count of the context
     auto context = m_context;
     zmq::socket_t receiver(*context, zmq::socket_type::sub);
     receiver.connect(m_addr.makeReceiverAddress());
     receiver.setsockopt(ZMQ_SUBSCRIBE, "", 0);
     int timeout = 200;
     receiver.setsockopt(ZMQ_RCVTIMEO, &timeout, sizeof(timeout));
     bool cancel = false;
     auto last_connect = std::chrono::system_clock::now();
     while (!cancel) {
         zmq::message_t zmq_msg;
         bool again = !receiver.recv(&zmq_msg);
         if (again) {
             if (m_cancel) {
                 return;
             }
             capnqml::Message msg;
             msg.setType(capnqml::Message::Type::Connect);
             push(msg);
             auto now = std::chrono::system_clock::now();
             if (now - last_connect > std::chrono::milliseconds(m_timeout)
                     && m_state == Channel::State::Connected) {
                 // timeout
                 m_state = Channel::State::Disconnected;
                 m_loop.invoke([this]() {
                     if (m_disconnect) {
                         m_disconnect();
                     }
                 });
             }
             continue;
         }
         auto message = _::unpack(zmq_msg);
         if (message.type() == Message::Type::Connect) {
             last_connect = std::chrono::system_clock::now();
             if (m_state == Channel::State::Disconnected && m_connect) {
                 m_state = Channel::State::Connected;
                 m_loop.invoke([this]() {
                     m_connect();
                 });
             }
             m_state = Channel::State::Connected;
         }
         auto fun = [this, msg = std::move(message)] {
             if (m_handler) {
                 m_handler(msg);
             }
         };
         m_loop.invoke(std::move(fun));
         if (message.type() == Message::Type::Disconnect) {
             m_state = Channel::State::Disconnected;
             m_loop.invoke([this]() {
                 if (m_disconnect) {
                     m_disconnect();
                 }
             });
         }
     }
 }
예제 #2
0
파일: main.cpp 프로젝트: Angeldude/pd
 void ms_url(const t_symbol *s) 
 {
     if(s == sym__)
         m_disconnect();
     else
         m_connect(s);
 }
예제 #3
0
 void disconnect() override {
     capnqml::Message msg;
     msg.setType(capnqml::Message::Type::Disconnect);
     push(std::move(msg));
     m_loop.invoke([this]{
         m_sender->disconnect(m_addr.makeSenderAddress());
         if (m_disconnect) {
             m_disconnect();
         }
         m_loop.cancel();
     });
     m_cancel = true;
 }
예제 #4
0
파일: main.cpp 프로젝트: Angeldude/pd
    /*! Connect to stream
	    \param s	URL of stream
    */
    void m_connect(const t_symbol *s) 
    { 
        m_disconnect();
        FLEXT_ASSERT(!stream);

        url = s;
        stream = new StreamOGG;

        stream->debug = debug;
        stream->setStreamBufSize(strbuf);
        stream->setStreamBufChunk(strchunk);
        stream->setStreamBufThresh(strthresh);
        stream->setWaitGrain(waitgrain);
        stream->setWaitReconnect(waitreconnect);

        stream->doInit(GetString(s)); 
    }