⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compositionmodelimpl.cpp

📁 LINUX下的混音软件
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    // point for that hue were taking a value of 255 with the (s < v)    // formula, so I added an extra hack to force hues in those two narrow    // ranges toward black.  Black always looks good, while white washes out    // badly against intense yellow, and doesn't look very good against    // intense green either...  hacky, but this produces pleasant results against    // every bizarre extreme of color I could cook up to throw at it, plus    // (the real reason for all this convoluted fiddling, it does all that while keeping    // white against bright reds and blues, which looks better than black)    if ( ((((h > 57) && (h < 66)) || ((h > 93) && (h < 131))) && (s > 127) && (v > 127) ) ||            (s < v) ) {        v = 0;    } else {        v = 255;    }    s = 31;    h += 180;    segColor.setHsv(h, s, v);    return segColor;}void CompositionModelImpl::updatePreviewCacheForAudioSegment(const Segment* segment, AudioPreviewData* apData){    if (m_audioPreviewThread) {        //	std::cerr << "CompositionModelImpl::updatePreviewCacheForAudioSegment() - new audio preview started" << std::endl;        CompositionRect segRect = computeSegmentRect(*segment);        segRect.setWidth(segRect.getBaseWidth()); // don't use repeating area        segRect.moveTopLeft(QPoint(0, 0));        if (apData)            apData->setSegmentRect(segRect);        if (m_audioPreviewUpdaterMap.find(segment) ==                m_audioPreviewUpdaterMap.end()) {            AudioPreviewUpdater *updater = new AudioPreviewUpdater                                           (*m_audioPreviewThread, m_composition, segment, segRect, this);            connect(updater, SIGNAL(audioPreviewComplete(AudioPreviewUpdater*)),                    this, SLOT(slotAudioPreviewComplete(AudioPreviewUpdater*)));            m_audioPreviewUpdaterMap[segment] = updater;        } else {            m_audioPreviewUpdaterMap[segment]->setDisplayExtent(segRect);        }        m_audioPreviewUpdaterMap[segment]->update();    } else {        RG_DEBUG << "CompositionModelImpl::updatePreviewCacheForAudioSegment() - no audio preview thread set\n";    }}void CompositionModelImpl::slotAudioPreviewComplete(AudioPreviewUpdater* apu){    RG_DEBUG << "CompositionModelImpl::slotAudioPreviewComplete()\n";    AudioPreviewData *apData = getAudioPreviewData(apu->getSegment());    QRect updateRect;    if (apData) {        RG_DEBUG << "CompositionModelImpl::slotAudioPreviewComplete(" << apu << "): apData contains " << apData->getValues().size() << " values already" << endl;        unsigned int channels = 0;        const std::vector<float> &values = apu->getComputedValues(channels);        if (channels > 0) {            RG_DEBUG << "CompositionModelImpl::slotAudioPreviewComplete: set "            << values.size() << " samples on " << channels << " channels\n";            apData->setChannels(channels);            apData->setValues(values);            updateRect = postProcessAudioPreview(apData, apu->getSegment());        }    }    if (!updateRect.isEmpty())        emit needContentUpdate(updateRect);}QRect CompositionModelImpl::postProcessAudioPreview(AudioPreviewData* apData, const Segment* segment){    //     RG_DEBUG << "CompositionModelImpl::postProcessAudioPreview()\n";    AudioPreviewPainter previewPainter(*this, apData, m_composition, segment);    previewPainter.paintPreviewImage();    m_audioSegmentPreviewMap[segment] = previewPainter.getPreviewImage();    return previewPainter.getSegmentRect();}void CompositionModelImpl::slotInstrumentParametersChanged(InstrumentId id){    std::cerr << "CompositionModelImpl::slotInstrumentParametersChanged()\n";    const Composition::segmentcontainer& segments = m_composition.getSegments();    Composition::segmentcontainer::iterator segEnd = segments.end();    for (Composition::segmentcontainer::iterator i = segments.begin();            i != segEnd; ++i) {        Segment* s = *i;        TrackId trackId = s->getTrack();        Track *track = getComposition().getTrackById(trackId);        // We need to update the cache for audio segments, because the        // instrument playback level is reflected in the audio        // preview.  And we need to update it for midi segments,        // because the preview style differs depending on whether the        // segment is on a percussion instrument or not        if (track && track->getInstrument() == id) {            removePreviewCache(s);            emit needContentUpdate(computeSegmentRect(*s));        }    }}void CompositionModelImpl::slotAudioFileFinalized(Segment* s){    //     RG_DEBUG << "CompositionModelImpl::slotAudioFileFinalized()\n";    removePreviewCache(s);}PixmapArray CompositionModelImpl::getAudioPreviewPixmap(const Segment* s){    getAudioPreviewData(s);    return m_audioSegmentPreviewMap[s];}void CompositionModelImpl::eventAdded(const Segment *s, Event *){    //     RG_DEBUG << "CompositionModelImpl::eventAdded()\n";    removePreviewCache(s);    emit needContentUpdate(computeSegmentRect(*s));}void CompositionModelImpl::eventRemoved(const Segment *s, Event *){    //     RG_DEBUG << "CompositionModelImpl::eventRemoved" << endl;    removePreviewCache(s);    emit needContentUpdate(computeSegmentRect(*s));}void CompositionModelImpl::appearanceChanged(const Segment *s){    //     RG_DEBUG << "CompositionModelImpl::appearanceChanged" << endl;    clearInCache(s, true);    emit needContentUpdate(computeSegmentRect(*s));}void CompositionModelImpl::endMarkerTimeChanged(const Segment *s, bool shorten){    //     RG_DEBUG << "CompositionModelImpl::endMarkerTimeChanged(" << shorten << ")" << endl;    clearInCache(s, true);    if (shorten) {        emit needContentUpdate(); // no longer know former segment dimension    } else {        emit needContentUpdate(computeSegmentRect(*s));    }}void CompositionModelImpl::makePreviewCache(const Segment *s){    if (s->getType() == Segment::Internal) {        makeNotationPreviewDataCache(s);    } else {        makeAudioPreviewDataCache(s);    }}void CompositionModelImpl::removePreviewCache(const Segment *s){    if (s->getType() == Segment::Internal) {        m_notationPreviewDataCache.remove(const_cast<Segment*>(s));    } else {        m_audioPreviewDataCache.remove(const_cast<Segment*>(s));        m_audioSegmentPreviewMap.erase(s);    }}void CompositionModelImpl::segmentAdded(const Composition *, Segment *s){    makePreviewCache(s);    s->addObserver(this);    emit needContentUpdate();}void CompositionModelImpl::segmentRemoved(const Composition *, Segment *s){    QRect r = computeSegmentRect(*s);    m_selectedSegments.erase(s);    clearInCache(s, true);    s->removeObserver(this);    m_recordingSegments.erase(s); // this could be a recording segment    emit needContentUpdate(r);}void CompositionModelImpl::segmentRepeatChanged(const Composition *, Segment *s, bool){    clearInCache(s);    emit needContentUpdate();}void CompositionModelImpl::endMarkerTimeChanged(const Composition *, bool){    emit needSizeUpdate();}void CompositionModelImpl::setSelectionRect(const QRect& r){    m_selectionRect = r.normalize();    m_previousTmpSelectedSegments = m_tmpSelectedSegments;    m_tmpSelectedSegments.clear();    const Composition::segmentcontainer& segments = m_composition.getSegments();    Composition::segmentcontainer::iterator segEnd = segments.end();    QRect updateRect = m_selectionRect;    for (Composition::segmentcontainer::iterator i = segments.begin();            i != segEnd; ++i) {        Segment* s = *i;        CompositionRect sr = computeSegmentRect(*s);        if (sr.intersects(m_selectionRect)) {            m_tmpSelectedSegments.insert(s);            updateRect |= sr;        }    }    updateRect = updateRect.normalize();    if (!updateRect.isNull() && !m_previousSelectionUpdateRect.isNull()) {        if (m_tmpSelectedSegments != m_previousTmpSelectedSegments)            emit needContentUpdate(updateRect | m_previousSelectionUpdateRect);        emit needArtifactsUpdate();    }    m_previousSelectionUpdateRect = updateRect;}void CompositionModelImpl::finalizeSelectionRect(){    const Composition::segmentcontainer& segments = m_composition.getSegments();    Composition::segmentcontainer::iterator segEnd = segments.end();    for (Composition::segmentcontainer::iterator i = segments.begin();            i != segEnd; ++i) {        Segment* s = *i;        CompositionRect sr = computeSegmentRect(*s);        if (sr.intersects(m_selectionRect)) {            setSelected(s);        }    }    m_previousSelectionUpdateRect = m_selectionRect = QRect();    m_tmpSelectedSegments.clear();}QRect CompositionModelImpl::getSelectionContentsRect(){    QRect selectionRect;    SegmentSelection sel = getSelectedSegments();    for (SegmentSelection::iterator i = sel.begin();            i != sel.end(); ++i) {        Segment* s = *i;        CompositionRect sr = computeSegmentRect(*s);        selectionRect |= sr;    }    return selectionRect;}void CompositionModelImpl::addRecordingItem(const CompositionItem& item){    m_recordingSegments.insert(CompositionItemHelper::getSegment(item));    emit needContentUpdate();    RG_DEBUG << "CompositionModelImpl::addRecordingItem: now have "    << m_recordingSegments.size() << " recording items\n";}void CompositionModelImpl::removeRecordingItem(const CompositionItem &item){    Segment* s = CompositionItemHelper::getSegment(item);    m_recordingSegments.erase(s);    clearInCache(s, true);    emit needContentUpdate();    RG_DEBUG << "CompositionModelImpl::removeRecordingItem: now have "    << m_recordingSegments.size() << " recording items\n";}void CompositionModelImpl::clearRecordingItems(){    for (recordingsegmentset::iterator i = m_recordingSegments.begin();            i != m_recordingSegments.end(); ++i)        clearInCache(*i, true);    m_recordingSegments.clear();    emit needContentUpdate();    RG_DEBUG << "CompositionModelImpl::clearRecordingItem\n";}bool CompositionModelImpl::isMoving(const Segment* sm) const{    itemcontainer::const_iterator movEnd = m_changingItems.end();    for (itemcontainer::const_iterator i = m_changingItems.begin(); i != movEnd; ++i) {        const CompositionItemImpl* ci = dynamic_cast<const CompositionItemImpl*>((_CompositionItem*)(*i));        const Segment* s = ci->getSegment();        if (sm == s)            return true;    }    return false;}bool CompositionModelImpl::isRecording(const Segment* s) const{    return m_recordingSegments.find(const_cast<Segment*>(s)) != m_recordingSegments.end();}CompositionModel::itemcontainer CompositionModelImpl::getItemsAt(const QPoint& point){    itemcontainer res;    const Composition::segmentcontainer& segments = m_composition.getSegments();    for (Composition::segmentcontainer::iterator i = segments.begin();            i != segments.end(); ++i) {        Segment* s = *i;        CompositionRect sr = computeSegmentRect(*s);        if (sr.contains(point)) {            //            RG_DEBUG << "CompositionModelImpl::getItemsAt() adding " << sr << " for segment " << s << endl;            CompositionItem item(new CompositionItemImpl(*s, sr));            unsigned int z = computeZForSegment(s);            //            RG_DEBUG << "CompositionModelImpl::getItemsAt() z = " << z << endl;            item->setZ(z);            res.insert(item);        } else {            //             RG_DEBUG << "CompositionModelImpl::getItemsAt() skiping " << sr << endl;        }    }    if (res.size() == 1) { // only one segment under click point        Segment* s = CompositionItemHelper::getSegment(*(res.begin()));        m_segmentOrderer.segmentClicked(s);    }    return res;}void CompositionModelImpl::setPointerPos(int xPos){    m_pointerTimePos = grid().getRulerScale()->getTimeForX(xPos);    for (recordingsegmentset::iterator i = m_recordingSegments.begin();            i != m_recordingSegments.end(); ++i) {        emit needContentUpdate(computeSegmentRect(**i));    }}void CompositionModelImpl::setSelected(const CompositionItem& item, bool selected){    const CompositionItemImpl* itemImpl = dynamic_cast<const CompositionItemImpl*>((_CompositionItem*)item);    if (itemImpl) {        Segment* segment = const_cast<Segment*>(itemImpl->getSegment());        setSelected(segment, selected);    }}void CompositionModelImpl::setSelected(const itemcontainer& items){    for (itemcontainer::const_iterator i = items.begin(); i != items.end(); ++i) {        setSelected(*i);    }}void CompositionModelImpl::setSelected(const Segment* segment, bool selected){    RG_DEBUG << "CompositionModelImpl::setSelected " << segment << " - " << selected << endl;    if (selected) {        if (!isSelected(segment))            m_selectedSegments.insert(const_cast<Segment*>(segment));    } else {        SegmentSelection::iterator i = m_selectedSegments.find(const_cast<Segment*>(segment));        if (i != m_selectedSegments.end())            m_selectedSegments.erase(i);    }    emit needContentUpdate();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -