JackLayer::JackLayer(const AudioPreference &p) : AudioLayer(p), captureClient_(nullptr), playbackClient_(nullptr), out_ports_(), in_ports_(), out_ringbuffers_(), in_ringbuffers_(), ringbuffer_thread_(), //workerAlive_(false), ringbuffer_thread_mutex_(), data_ready_(), playbackBuffer_(0, audioFormat_), playbackFloatBuffer_(), captureBuffer_(0, audioFormat_), captureFloatBuffer_(), hardwareBufferSize_(0), mainRingBuffer_(Manager::instance().getRingBufferPool().getRingBuffer(RingBufferPool::DEFAULT_ID)) { playbackClient_ = jack_client_open(PACKAGE_NAME, (jack_options_t) (JackNullOption | JackNoStartServer), NULL); if (!playbackClient_) throw std::runtime_error("Could not open JACK client"); captureClient_ = jack_client_open(PACKAGE_NAME, (jack_options_t) (JackNullOption | JackNoStartServer), NULL); if (!captureClient_) throw std::runtime_error("Could not open JACK client"); jack_set_process_callback(captureClient_, process_capture, this); jack_set_process_callback(playbackClient_, process_playback, this); createPorts(playbackClient_, out_ports_, true, out_ringbuffers_); createPorts(captureClient_, in_ports_, false, in_ringbuffers_); const auto playRate = jack_get_sample_rate(playbackClient_); const auto captureRate = jack_get_sample_rate(captureClient_); if (playRate != captureRate) RING_ERR("Mismatch between capture rate %u and playback rate %u", playRate, captureRate); hardwareBufferSize_ = jack_get_buffer_size(playbackClient_); auto update_buffer = [] (AudioBuffer &buf, size_t size, unsigned rate, unsigned nbChannels) { buf.setSampleRate(rate); buf.resize(size); buf.setChannelNum(nbChannels); }; update_buffer(playbackBuffer_, hardwareBufferSize_, playRate, out_ports_.size()); update_buffer(captureBuffer_, hardwareBufferSize_, captureRate, in_ports_.size()); jack_on_shutdown(playbackClient_, onShutdown, this); }
WorkflowProcessItem::WorkflowProcessItem(Actor* prc) : process(prc), hasBreakpoint(false), highlighting(NULL)/*, inspectionItem(NULL)*/ { setToolTip(process->getProto()->getDocumentation()); setFlag(QGraphicsItem::ItemIsSelectable, true); setFlag(QGraphicsItem::ItemIsMovable, true); #if (QT_VERSION >= QT_VERSION_CHECK(4, 6, 0)) setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); #endif setAcceptHoverEvents(true); styles[ItemStyles::SIMPLE] = new SimpleProcStyle(this); styles[ItemStyles::EXTENDED] = new ExtendedProcStyle(this); currentStyle = getStyleByIdSafe(WorkflowSettings::defaultStyle()); currentStyle->setVisible(true); createPorts(); }
int main() { printf("*************************************************************************\n"); printf("* Program creates 3 servers and 5 clients\n* Ports 0 - 2 are used by servers\n* Ports 3 - 99 are used by clients\n* Server multiplies every array element by 3 before sending back to client\n"); printf("*************************************************************************\n\n"); createPorts(); start_thread(client); start_thread(client); start_thread(client); start_thread(client); start_thread(client); start_thread(server); start_thread(server); start_thread(server); run(); return 0; }