/** * 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(); } }); } } }
void ms_url(const t_symbol *s) { if(s == sym__) m_disconnect(); else m_connect(s); }
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; }
/*! 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)); }