Skip to content

Commit

Permalink
Major refactor; implement thumbnailing for SlicerT, AFP and Automatio…
Browse files Browse the repository at this point in the history
…n editor
  • Loading branch information
khoidauminh committed Jul 3, 2024
1 parent 7a6e2aa commit f281961
Show file tree
Hide file tree
Showing 10 changed files with 387 additions and 202 deletions.
3 changes: 3 additions & 0 deletions include/AutomationEditor.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
#include "SampleClip.h"
#include "TimePos.h"
#include "lmms_basics.h"
#include "SampleThumbnail.h"

class QPainter;
class QPixmap;
Expand Down Expand Up @@ -288,6 +289,8 @@ protected slots:
QColor m_ghostNoteColor;
QColor m_detuningNoteColor;
QColor m_ghostSampleColor;

SampleThumbnailListManager m_thumbnaillist;

friend class AutomationEditorWindow;

Expand Down
2 changes: 1 addition & 1 deletion include/SampleClipView.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public slots:

private:
SampleClip * m_clip;
SampleThumbnailListManager thumbnaillist;
SampleThumbnailListManager m_thumbnaillist;
QPixmap m_paintPixmap;
bool splitClip( const TimePos pos ) override;
} ;
Expand Down
59 changes: 39 additions & 20 deletions include/SampleThumbnail.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@
#ifndef LMMS_SAMPLE_THUMBNAIL_H
#define LMMS_SAMPLE_THUMBNAIL_H

constexpr unsigned long long MIN_THUMBNAIL_SIZE = 32;
constexpr unsigned long long MIN_THUMBNAIL_SIZE = 1;
constexpr unsigned long long MAX_THUMBNAIL_SIZE = 32768;
constexpr unsigned long long THUMBNAIL_SIZE_DIVISOR = 2;
constexpr unsigned long long THUMBNAIL_SIZE_DIVISOR = 32;

#include<vector>
#include<memory>
Expand All @@ -44,9 +44,18 @@ namespace lmms {

struct SampleThumbnailVisualizeParameters
{
float amplification;
bool reversed;
float pixelsTillSampleEnd;
const Sample* originalSample = nullptr;

const float amplification;
const bool reversed;

const float sampleStartPercent = 0.0;
const float sampleEndPercent = 1.0;

const long x;
const long y;
const long width;
const long height;
};

struct SampleThumbnailBit
Expand All @@ -58,38 +67,48 @@ struct SampleThumbnailBit

SampleThumbnailBit();

SampleThumbnailBit(const sampleFrame& sample);

~SampleThumbnailBit();

void merge(const SampleThumbnailBit& other);
SampleThumbnailBit(const SampleFrame&);

void mergeFrame(const sampleFrame& sample);
void merge(const SampleThumbnailBit&);

SampleThumbnailBit linear(const SampleThumbnailBit& other, float t) const;
void mergeFrame(const SampleFrame&);
};

using SampleThumbnail = std::vector<SampleThumbnailBit>;
using SampleThumbnailList = std::vector<SampleThumbnail>;
using SharedSampleThumbnailList = std::shared_ptr< SampleThumbnailList >;

static std::map<const QString, SharedSampleThumbnailList> SAMPLE_THUMBNAIL_MAP;
using SharedSampleThumbnailList = std::shared_ptr<SampleThumbnailList>;

class LMMS_EXPORT SampleThumbnailListManager
class LMMS_EXPORT SampleThumbnailListManager
{
private:
SharedSampleThumbnailList list;
static std::map<const QString, SharedSampleThumbnailList> SAMPLE_THUMBNAIL_MAP;

protected:
static void draw(
QPainter& painter, const SampleThumbnailBit& bit,
int lineX, int centerY, float scalingFactor,
QColor color, QColor rmsColor
);

static SampleThumbnail generate(
const size_t thumbnailsize,
const SampleFrame* sampleBuffer,
const SampleFrame* sampleBufferEnd
);

public:
SampleThumbnailListManager();

SampleThumbnailListManager(const Sample& inputSample);
SampleThumbnailListManager(const Sample&);

bool selectFromGlobalThumbnailMap(const Sample& inputSample);
bool selectFromGlobalThumbnailMap(const Sample&);

void cleanUpGlobalThumbnailMap();

void visualize(SampleThumbnailVisualizeParameters parameters, QPainter& painter, const QRect& rect);

void visualize(const SampleThumbnailVisualizeParameters&, QPainter&) const;
static void visualize_original(const SampleThumbnailVisualizeParameters&, QPainter&);

};

}
Expand Down
33 changes: 27 additions & 6 deletions plugins/AudioFileProcessor/AudioFileProcessorWaveView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@

#include "ConfigManager.h"
#include "gui_templates.h"
#include "SampleWaveform.h"
#include "SampleThumbnail.h"

#include <QPainter>
#include <QMouseEvent>
Expand Down Expand Up @@ -81,7 +81,8 @@ AudioFileProcessorWaveView::AudioFileProcessorWaveView(QWidget* parent, int w, i
m_isDragging(false),
m_reversed(false),
m_framesPlayed(0),
m_animation(ConfigManager::inst()->value("ui", "animateafp").toInt())
m_animation(ConfigManager::inst()->value("ui", "animateafp").toInt()),
m_thumbnaillist(SampleThumbnailListManager(*buf))
{
setFixedSize(w, h);
setMouseTracking(true);
Expand Down Expand Up @@ -333,10 +334,30 @@ void AudioFileProcessorWaveView::updateGraph()
QPainter p(&m_graph);
p.setPen(QColor(255, 255, 255));

const auto rect = QRect{0, 0, m_graph.width(), m_graph.height()};
const auto waveform = SampleWaveform::Parameters{
m_sample->data() + m_from, static_cast<size_t>(range()), m_sample->amplification(), m_sample->reversed()};
SampleWaveform::visualize(waveform, p, rect);
//const auto rect = QRect{0, 0, m_graph.width(), m_graph.height()};
//const auto waveform = SampleWaveform::Parameters{
//m_sample->data() + m_from, static_cast<size_t>(range()), m_sample->amplification(), m_sample->reversed()};
//SampleWaveform::visualize(waveform, p, rect);

// Performance hit is neglectable
m_thumbnaillist = SampleThumbnailListManager(*m_sample);

const auto parameters = SampleThumbnailVisualizeParameters{
.originalSample = m_sample,

.amplification = m_sample->amplification(),
.reversed = m_sample->reversed(),

.sampleStartPercent = static_cast<float>(m_from) / m_sample->sampleSize(),
.sampleEndPercent = static_cast<float>(m_to ) / m_sample->sampleSize(),

.x = 0,
.y = 0,
.width = m_graph.width(),
.height = m_graph.height()
};

m_thumbnaillist.visualize(parameters, p);
}

void AudioFileProcessorWaveView::zoom(const bool out)
Expand Down
2 changes: 2 additions & 0 deletions plugins/AudioFileProcessor/AudioFileProcessorWaveView.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@


#include "Knob.h"
#include "SampleThumbnail.h"


namespace lmms
Expand Down Expand Up @@ -142,6 +143,7 @@ public slots:
bool m_reversed;
f_cnt_t m_framesPlayed;
bool m_animation;
SampleThumbnailListManager m_thumbnaillist;

friend class AudioFileProcessorView;

Expand Down
47 changes: 38 additions & 9 deletions plugins/SlicerT/SlicerTWaveform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@

#include <QBitmap>

#include "SampleWaveform.h"
#include "SampleThumbnail.h"
#include "SlicerT.h"
#include "SlicerTView.h"
#include "embed.h"
Expand Down Expand Up @@ -90,9 +90,21 @@ void SlicerTWaveform::drawSeekerWaveform()
brush.setPen(s_waveformColor);

const auto& sample = m_slicerTParent->m_originalSample;
const auto waveform = SampleWaveform::Parameters{sample.data(), sample.sampleSize(), sample.amplification(), sample.reversed()};
const auto rect = QRect(0, 0, m_seekerWaveform.width(), m_seekerWaveform.height());
SampleWaveform::visualize(waveform, brush, rect);
//const auto waveform = SampleWaveform::Parameters{sample.data(), sample.sampleSize(), sample.amplification(), sample.reversed()};
//const auto rect = QRect(0, 0, m_seekerWaveform.width(), m_seekerWaveform.height());
//SampleWaveform::visualize(waveform, brush, rect);

m_thumbnaillist = SampleThumbnailListManager(sample);
const auto parameters = SampleThumbnailVisualizeParameters{
.amplification = sample.amplification(),
.reversed = sample.reversed(),

.x = 0,
.y = 0,
.width = m_seekerWaveform.width(),
.height = m_seekerWaveform.height()
};
m_thumbnaillist.visualize(parameters, brush);

// increase brightness in inner color
QBitmap innerMask = m_seekerWaveform.createMaskFromColor(s_waveformMaskColor, Qt::MaskMode::MaskOutColor);
Expand Down Expand Up @@ -141,15 +153,32 @@ void SlicerTWaveform::drawEditorWaveform()

QPainter brush(&m_editorWaveform);
size_t startFrame = m_seekerStart * m_slicerTParent->m_originalSample.sampleSize();
size_t endFrame = m_seekerEnd * m_slicerTParent->m_originalSample.sampleSize();
size_t endFrame = m_seekerEnd * m_slicerTParent->m_originalSample.sampleSize();

brush.setPen(s_waveformColor);
float zoomOffset = (m_editorHeight - m_zoomLevel * m_editorHeight) / 2;
long zoomOffset = (m_editorHeight - m_zoomLevel * m_editorHeight) / 2;

const auto& sample = m_slicerTParent->m_originalSample;
const auto waveform = SampleWaveform::Parameters{sample.data() + startFrame, endFrame - startFrame, sample.amplification(), sample.reversed()};
const auto rect = QRect(0, zoomOffset, m_editorWidth, m_zoomLevel * m_editorHeight);
SampleWaveform::visualize(waveform, brush, rect);
//const auto waveform = SampleWaveform::Parameters{sample.data() + startFrame, endFrame - startFrame, sample.amplification(), sample.reversed()};
//const auto rect = QRect(0, zoomOffset, m_editorWidth, m_zoomLevel * m_editorHeight);
//SampleWaveform::visualize(waveform, brush, rect);

m_thumbnaillist = SampleThumbnailListManager(sample);
const auto parameters = SampleThumbnailVisualizeParameters{
.originalSample = &sample,

.amplification = sample.amplification(),
.reversed = sample.reversed(),

.sampleStartPercent = static_cast<float>(startFrame) / sample.sampleSize(),
.sampleEndPercent = static_cast<float>( endFrame) / sample.sampleSize(),

.x = 0,
.y = zoomOffset,
.width = m_editorWidth,
.height = static_cast<long>(m_zoomLevel * m_editorHeight)
};
m_thumbnaillist.visualize(parameters, brush);

// increase brightness in inner color
QBitmap innerMask = m_editorWaveform.createMaskFromColor(s_waveformMaskColor, Qt::MaskMode::MaskOutColor);
Expand Down
3 changes: 3 additions & 0 deletions plugins/SlicerT/SlicerTWaveform.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@

#include "Instrument.h"
#include "SampleBuffer.h"
#include "SampleThumbnail.h"

namespace lmms {

Expand Down Expand Up @@ -108,6 +109,8 @@ public slots:
QPixmap m_editorWaveform;
QPixmap m_sliceEditor;
QPixmap m_emptySampleIcon;

SampleThumbnailListManager m_thumbnaillist;

SlicerT* m_slicerTParent;

Expand Down
Loading

0 comments on commit f281961

Please sign in to comment.