/********************************************************************* * Running *********************************************************************/ void Audio::preRun(MasterTimer* timer) { if (m_decoder != NULL) { m_decoder->seek(elapsed()); AudioParameters ap = m_decoder->audioParameters(); #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) #if defined(__APPLE__) || defined(Q_OS_MAC) //m_audio_out = new AudioRendererCoreAudio(); m_audio_out = new AudioRendererPortAudio(m_audioDevice); #elif defined(WIN32) || defined(Q_OS_WIN) m_audio_out = new AudioRendererWaveOut(m_audioDevice); #else m_audio_out = new AudioRendererAlsa(m_audioDevice); #endif m_audio_out->moveToThread(QCoreApplication::instance()->thread()); #else m_audio_out = new AudioRendererQt(m_audioDevice); #endif m_audio_out->setDecoder(m_decoder); m_audio_out->initialize(ap.sampleRate(), ap.channels(), ap.format()); m_audio_out->adjustIntensity(getAttributeValue(Intensity)); m_audio_out->setFadeIn(fadeInSpeed()); m_audio_out->start(); connect(m_audio_out, SIGNAL(endOfStreamReached()), this, SLOT(slotEndOfStream())); } Function::preRun(timer); }
void RGBMatrix::insertStartValues(FadeChannel& fc) const { Q_ASSERT(m_fader != NULL); // To create a nice and smooth fade, get the starting value from // m_fader's existing FadeChannel (if any). Otherwise just assume // we're starting from zero. if (m_fader->channels().contains(fc) == true) { FadeChannel old = m_fader->channels()[fc]; fc.setCurrent(old.current()); fc.setStart(old.current()); } else { fc.setCurrent(0); fc.setStart(0); } // The channel is not ready yet fc.setReady(false); // Fade in speed is used for all non-zero targets if (fc.target() == 0) fc.setFadeTime(fadeOutSpeed()); else fc.setFadeTime(fadeInSpeed()); }
bool Cue::saveXMLSpeed(QXmlStreamWriter *doc) const { doc->writeStartElement(KXMLQLCCueSpeed); doc->writeAttribute(KXMLQLCCueSpeedFadeIn, QString::number(fadeInSpeed())); doc->writeAttribute(KXMLQLCCueSpeedFadeOut, QString::number(fadeOutSpeed())); doc->writeAttribute(KXMLQLCCueSpeedDuration, QString::number(duration())); doc->writeEndElement(); return true; }
bool Function::saveXMLSpeed(QDomDocument* doc, QDomElement* root) const { QDomElement tag; tag = doc->createElement(KXMLQLCFunctionSpeed); tag.setAttribute(KXMLQLCFunctionSpeedFadeIn, QString::number(fadeInSpeed())); tag.setAttribute(KXMLQLCFunctionSpeedFadeOut, QString::number(fadeOutSpeed())); tag.setAttribute(KXMLQLCFunctionSpeedDuration, QString::number(duration())); root->appendChild(tag); return true; }
void Function::setTempoType(const Function::TempoType &type) { if (type == m_tempoType) return; m_tempoType = type; /* Retrieve the current BPM value known by the Master Timer */ float bpmNum = doc()->masterTimer()->bpmNumber(); /* Calculate the duration in ms of a single beat */ float beatTime = 60000.0 / bpmNum; switch (type) { /* Beats -> Time */ case Time: setFadeInSpeed(beatsToTime(fadeInSpeed(), beatTime)); setDuration(beatsToTime(duration(), beatTime)); setFadeOutSpeed(beatsToTime(fadeOutSpeed(), beatTime)); disconnect(doc()->masterTimer(), SIGNAL(bpmNumberChanged(int)), this, SLOT(slotBPMChanged(int))); break; /* Time -> Beats */ case Beats: setFadeInSpeed(timeToBeats(fadeInSpeed(), beatTime)); setDuration(timeToBeats(duration(), beatTime)); setFadeOutSpeed(timeToBeats(fadeOutSpeed(), beatTime)); connect(doc()->masterTimer(), SIGNAL(bpmNumberChanged(int)), this, SLOT(slotBPMChanged(int))); break; default: qDebug() << "Error. Unhandled tempo type" << type; break; } emit changed(m_id); }
bool CueStack::saveXML(QDomDocument* doc, QDomElement* wksp_root, uint id) const { qDebug() << Q_FUNC_INFO; Q_ASSERT(doc != NULL); Q_ASSERT(wksp_root != NULL); QDomElement root = doc->createElement(KXMLQLCCueStack); root.setAttribute(KXMLQLCCueStackID, id); wksp_root->appendChild(root); QDomElement speed = doc->createElement(KXMLQLCCueStackSpeed); speed.setAttribute(KXMLQLCCueStackSpeedFadeIn, fadeInSpeed()); speed.setAttribute(KXMLQLCCueStackSpeedFadeOut, fadeOutSpeed()); speed.setAttribute(KXMLQLCCueStackSpeedDuration, duration()); root.appendChild(speed); foreach (Cue cue, cues()) cue.saveXML(doc, &root); return true; }
void RGBMatrix::updateMapChannels(const RGBMap& map, const FixtureGroup* grp) { quint32 mdAssigned = QLCChannel::invalid(); quint32 mdFxi = Fixture::invalidId(); uint fadeTime = 0; if (overrideFadeInSpeed() == defaultSpeed()) fadeTime = fadeInSpeed(); else fadeTime = overrideFadeInSpeed(); // Create/modify fade channels for ALL pixels in the color map. for (int y = 0; y < map.size(); y++) { for (int x = 0; x < map[y].size(); x++) { QLCPoint pt(x, y); GroupHead grpHead(grp->head(pt)); Fixture* fxi = doc()->fixture(grpHead.fxi); if (fxi == NULL) continue; if (grpHead.fxi != mdFxi) { mdAssigned = QLCChannel::invalid(); mdFxi = grpHead.fxi; } QLCFixtureHead head = fxi->head(grpHead.head); QVector <quint32> rgb = head.rgbChannels(); QVector <quint32> cmy = head.cmyChannels(); if (rgb.size() == 3) { // RGB color mixing FadeChannel fc; fc.setFixture(doc(), grpHead.fxi); fc.setChannel(rgb.at(0)); fc.setTarget(qRed(map[y][x])); insertStartValues(fc, fadeTime); m_fader->add(fc); fc.setChannel(rgb.at(1)); fc.setTarget(qGreen(map[y][x])); insertStartValues(fc, fadeTime); m_fader->add(fc); fc.setChannel(rgb.at(2)); fc.setTarget(qBlue(map[y][x])); insertStartValues(fc, fadeTime); m_fader->add(fc); } else if (cmy.size() == 3) { // CMY color mixing QColor col(map[y][x]); FadeChannel fc; fc.setFixture(doc(), grpHead.fxi); fc.setChannel(cmy.at(0)); fc.setTarget(col.cyan()); insertStartValues(fc, fadeTime); m_fader->add(fc); fc.setChannel(cmy.at(1)); fc.setTarget(col.magenta()); insertStartValues(fc, fadeTime); m_fader->add(fc); fc.setChannel(cmy.at(2)); fc.setTarget(col.yellow()); insertStartValues(fc, fadeTime); m_fader->add(fc); } if (m_dimmerControl && head.masterIntensityChannel() != QLCChannel::invalid()) { //qDebug() << "RGBMatrix: found dimmer at" << head.masterIntensityChannel(); // Simple intensity (dimmer) channel QColor col(map[y][x]); FadeChannel fc; fc.setFixture(doc(), grpHead.fxi); fc.setChannel(head.masterIntensityChannel()); if (col.value() == 0 && mdAssigned != head.masterIntensityChannel()) fc.setTarget(0); else { fc.setTarget(255); if (mdAssigned == QLCChannel::invalid()) mdAssigned = head.masterIntensityChannel(); } insertStartValues(fc, fadeTime); m_fader->add(fc); } } } }
void RGBMatrix::updateMapChannels(const RGBMap& map, const FixtureGroup* grp) { uint fadeTime = (overrideFadeInSpeed() == defaultSpeed()) ? fadeInSpeed() : overrideFadeInSpeed(); // Create/modify fade channels for ALL pixels in the color map. for (int y = 0; y < map.size(); y++) { for (int x = 0; x < map[y].size(); x++) { QLCPoint pt(x, y); GroupHead grpHead(grp->head(pt)); Fixture* fxi = doc()->fixture(grpHead.fxi); if (fxi == NULL) continue; QLCFixtureHead head = fxi->head(grpHead.head); QVector <quint32> rgb = head.rgbChannels(); QVector <quint32> cmy = head.cmyChannels(); quint32 masterDim = fxi->masterIntensityChannel(); quint32 headDim = head.channelNumber(QLCChannel::Intensity, QLCChannel::MSB); // Collect all dimmers that affect current head: // They are the master dimmer (affects whole fixture) // and per-head dimmer. // // If there are no RGB or CMY channels, the least important* dimmer channel // is used to create grayscale image. // // The rest of the dimmer channels are set to full if dimmer control is // enabled and target color is > 0 (see // http://www.qlcplus.org/forum/viewtopic.php?f=29&t=11090) // // Note: If there is only one head, and only one dimmer channel, // make it a master dimmer in fixture definition. // // *least important - per head dimmer if present, // otherwise per fixture dimmer if present QVector <quint32> dim; if (masterDim != QLCChannel::invalid()) dim << masterDim; if (headDim != QLCChannel::invalid()) dim << headDim; uint col = map[y][x]; if (rgb.size() == 3) { // RGB color mixing { FadeChannel fc(doc(), grpHead.fxi, rgb.at(0)); fc.setTarget(qRed(col)); insertStartValues(fc, fadeTime); m_fader->add(fc); } { FadeChannel fc(doc(), grpHead.fxi, rgb.at(1)); fc.setTarget(qGreen(col)); insertStartValues(fc, fadeTime); m_fader->add(fc); } { FadeChannel fc(doc(), grpHead.fxi, rgb.at(2)); fc.setTarget(qBlue(col)); insertStartValues(fc, fadeTime); m_fader->add(fc); } } else if (cmy.size() == 3) { // CMY color mixing QColor cmyCol(col); { FadeChannel fc(doc(), grpHead.fxi, cmy.at(0)); fc.setTarget(cmyCol.cyan()); insertStartValues(fc, fadeTime); m_fader->add(fc); } { FadeChannel fc(doc(), grpHead.fxi, cmy.at(1)); fc.setTarget(cmyCol.magenta()); insertStartValues(fc, fadeTime); m_fader->add(fc); } { FadeChannel fc(doc(), grpHead.fxi, cmy.at(2)); fc.setTarget(cmyCol.yellow()); insertStartValues(fc, fadeTime); m_fader->add(fc); } } else if (!dim.empty()) { // Set dimmer to value of the color (e.g. for PARs) FadeChannel fc(doc(), grpHead.fxi, dim.last()); // the weights are taken from // https://en.wikipedia.org/wiki/YUV#SDTV_with_BT.601 fc.setTarget(0.299 * qRed(col) + 0.587 * qGreen(col) + 0.114 * qBlue(col)); insertStartValues(fc, fadeTime); m_fader->add(fc); dim.pop_back(); } if (m_dimmerControl) { // Set the rest of the dimmer channels to full on foreach(quint32 ch, dim) { FadeChannel fc(doc(), grpHead.fxi, ch); fc.setTarget(col == 0 ? 0 : 255); insertStartValues(fc, fadeTime); m_fader->add(fc); } } } }