void NinjamController::start(const ServerInfo& server) { qCDebug(jtNinjamCore) << "starting ninjam controller..."; QMutexLocker locker(&mutex); //schedule an update in internal attributes scheduledEvents.append(new BpiChangeEvent(this, server.getBpi())); scheduledEvents.append(new BpmChangeEvent(this, server.getBpm())); preparedForTransmit = false; // the xmit start after the first interval is received emit preparingTransmission(); // schedule the encoders creation (one encoder for each channel) int channels = mainController->getInputTrackGroupsCount(); for (int channelIndex = 0; channelIndex < channels; ++channelIndex) { scheduledEvents.append(new InputChannelChangedEvent(this, channelIndex)); } processScheduledChanges(); if (!running) { encodingThread = new NinjamController::EncodingThread(this); // add a sine wave generator as input to test audio transmission //mainController->addInputTrackNode(new Audio::LocalInputTestStreamer(440, mainController->getAudioDriverSampleRate())); mainController->addTrack(METRONOME_TRACK_ID, this->metronomeTrackNode); mainController->setTrackMute(METRONOME_TRACK_ID, mainController->getSettings().getMetronomeMuteStatus()); mainController->setTrackGain(METRONOME_TRACK_ID,mainController->getSettings().getMetronomeGain()); mainController->setTrackPan(METRONOME_TRACK_ID, mainController->getSettings().getMetronomePan()); this->intervalPosition = lastBeat = 0; auto ninjamService = mainController->getNinjamService(); connect(ninjamService, &Service::serverBpmChanged, this, &NinjamController::scheduleBpmChangeEvent); connect(ninjamService, &Service::serverBpiChanged, this, &NinjamController::scheduleBpiChangeEvent); connect(ninjamService, &Service::audioIntervalCompleted, this, &NinjamController::handleIntervalCompleted); connect(ninjamService, &Service::userChannelCreated, this, &NinjamController::addNinjamRemoteChannel); connect(ninjamService, &Service::userChannelRemoved, this, &NinjamController::removeNinjamRemoteChannel); connect(ninjamService, &Service::userChannelUpdated, this, &NinjamController::updateNinjamRemoteChannel); connect(ninjamService, &Service::audioIntervalDownloading, this, &NinjamController::handleIntervalDownloading); connect(ninjamService, &Service::userExited, this, &NinjamController::handleNinjamUserExiting); connect(ninjamService, &Service::userEntered, this, &NinjamController::handleNinjamUserEntering); connect(ninjamService, &Service::publicChatMessageReceived, this, &NinjamController::handleReceivedPublicChatMessage); connect(ninjamService, &Service::privateChatMessageReceived, this, &NinjamController::handleReceivedPrivateChatMessage); connect(ninjamService, &Service::serverTopicMessageReceived, this, &NinjamController::topicMessageReceived); // add tracks for users connected in server auto users = server.getUsers(); for (const auto &user : users) { for (const auto &channel : user.getChannels()) { addTrack(user, channel); } } this->running = true; emit started(); } qCDebug(jtNinjamCore) << "ninjam controller started!"; }