1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
#include <gtest/gtest.h>
#include <QDir>
#include <QtDebug>
#include <vector>
#include "analyzer/analyzerwaveform.h"
#include "library/dao/analysisdao.h"
#include "test/mixxxtest.h"
#include "track/track.h"
namespace {
constexpr std::size_t kBigBufSize = 2 * 1920; // Matches the WaveformSummary
constexpr std::size_t kCanarySize = 1024 * 4;
constexpr float kMagicFloat = 1234.567890f;
constexpr float kCanaryFloat = 0.0f;
const QString kReferenceBuffersPath = QStringLiteral("/src/test/reference_buffers/");
class AnalyzerWaveformTest : public MixxxTest {
protected:
AnalyzerWaveformTest()
: m_aw(config(), QSqlDatabase()) {
}
void SetUp() override {
m_pTrack = Track::newTemporary();
m_pTrack->setAudioProperties(
mixxx::audio::ChannelCount(2),
mixxx::audio::SampleRate(44100),
mixxx::audio::Bitrate(),
mixxx::Duration::fromMillis(1000));
// Memory layout for m_canaryBigBuf looks like
// [ canary | big buf | canary ]
m_canaryBigBuf.resize(kBigBufSize + 2 * kCanarySize);
for (std::size_t i = 0; i < kCanarySize; i++) {
m_canaryBigBuf[i] = kCanaryFloat;
}
for (std::size_t i = kCanarySize; i < kCanarySize + kBigBufSize; i++) {
m_canaryBigBuf[i] = kMagicFloat;
}
for (std::size_t i = kCanarySize + kBigBufSize; i < 2 * kCanarySize + kBigBufSize; i++) {
m_canaryBigBuf[i] = kCanaryFloat;
}
}
void assertWaveformReference(
ConstWaveformPointer pWaveform,
const QString& reference_title) {
pWaveform->dump();
QFile f(QDir::currentPath() + kReferenceBuffersPath + reference_title);
bool pass = true;
// If the file is not there, we will fail and write out the .actual
// reference file.
QByteArray actual = pWaveform->toByteArray();
QByteArray reference;
ASSERT_TRUE(f.open(QFile::ReadOnly));
reference = f.readAll();
if (actual.size() == reference.size()) {
for (int i = 0; i < actual.size(); ++i) {
if (actual[i] != reference[i]) {
qDebug() << "#" << i << QString::number(actual[i], 16)
<< QString::number(reference[i], 16);
pass = false;
}
}
} else {
qDebug() << "##" << actual.size() << reference.size();
pass = false;
}
// Fail if either we didn't pass, or the comparison file was empty.
if (!pass) {
QString fname_actual = reference_title + ".actual";
qWarning() << "Buffer does not match" << reference_title
<< ", actual buffer written to "
<< "reference_buffers/" + fname_actual;
QFile actualFile(QDir::currentPath() + kReferenceBuffersPath + fname_actual);
ASSERT_TRUE(actualFile.open(QFile::WriteOnly));
actualFile.write(actual);
actualFile.close();
EXPECT_TRUE(false);
}
f.close();
}
void TearDown() override {
}
protected:
AnalyzerWaveform m_aw;
TrackPointer m_pTrack;
std::vector<CSAMPLE> m_canaryBigBuf;
};
// Basic test to make sure we don't alter the input buffer and don't step out of bounds.
TEST_F(AnalyzerWaveformTest, canary) {
m_aw.initialize(m_pTrack, m_pTrack->getSampleRate(), kBigBufSize);
m_aw.processSamples(&m_canaryBigBuf[kCanarySize], kBigBufSize);
m_aw.storeResults(m_pTrack);
m_aw.cleanup();
std::size_t i = 0;
for (; i < kCanarySize; i++) {
EXPECT_FLOAT_EQ(m_canaryBigBuf[i], kCanaryFloat);
}
for (; i < kCanarySize + kBigBufSize; i++) {
EXPECT_FLOAT_EQ(m_canaryBigBuf[i], kMagicFloat);
}
for (; i < 2 * kCanarySize + kBigBufSize; i++) {
EXPECT_FLOAT_EQ(m_canaryBigBuf[i], kCanaryFloat);
}
// Small reference, compare bitwise
assertWaveformReference(m_pTrack->getWaveform(), "AnalyzerWaveformsTest");
// The summary is always big, so we check only the metadata
ConstWaveformPointer pWaveformSummary = m_pTrack->getWaveformSummary();
ASSERT_NE(pWaveformSummary, nullptr);
EXPECT_EQ(pWaveformSummary->getDataSize(), 3842);
EXPECT_EQ(pWaveformSummary->getCompletion(), 3842);
EXPECT_DOUBLE_EQ(pWaveformSummary->getAudioVisualRatio(), 1.0);
}
} // namespace
|