23 int midiNoteForNormalPitch,
float dawSampleRate)
32 static_cast<int>(source.lengthInSamples) + 4);
33 source.read(&
m_sampleEngine, 0,
static_cast<int>(source.lengthInSamples) + 4, 0,
true,
true);
50 std::ifstream inputFile(path.getFullPathName().toStdString(), std::ios::binary);
55 std::unique_ptr<juce::MemoryBlock> outputDataBlock = std::make_unique<juce::MemoryBlock>(path.getSize());
57 juce::MemoryOutputStream outputDataStream(*outputDataBlock,
false);
63 std::vector<unsigned char> plaintext(
BUFFER_SIZE + EVP_MAX_BLOCK_LENGTH);
65 std::vector<unsigned char> iv(
IV_SIZE);
66 inputFile.read(
reinterpret_cast<char*
>(iv.data()),
IV_SIZE);
72 if (!(ctx = EVP_CIPHER_CTX_new()))
75 if (EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, data, iv.data()) != 1)
82 int totalBytesProcessed = 0;
83 while (inputFile.read(
reinterpret_cast<char*
>(buffer.data()), buffer.size()))
85 auto bytesRead = inputFile.gcount();
87 if (EVP_DecryptUpdate(ctx, plaintext.data(), &len, buffer.data(),
static_cast<int>(bytesRead)) != 1)
90 outputDataStream.write(
reinterpret_cast<char*
>(plaintext.data()), len);
92 totalBytesProcessed += len;
97 auto remainingBytes = inputFile.gcount();
98 if (remainingBytes > 0)
100 if (EVP_DecryptUpdate(ctx, plaintext.data(), &len, buffer.data(),
static_cast<int>(remainingBytes)) != 1)
103 outputDataStream.write(
reinterpret_cast<char*
>(plaintext.data()), len);
106 totalBytesProcessed += len;
108 EVP_CIPHER_CTX_free(ctx);
110 outputDataStream.flush();
112 return outputDataBlock;
144 AudioFormatManager formatManager;
145 formatManager.registerBasicFormats();
147 int numSuccessfulLoads{0};
148 int totalSampleLength{0};
151 int64 totalDataSize{0};
154 const auto pathCount = inputPaths.size();
155 std::vector<std::array<unsigned char, BUF_SIZE>> buffer(pathCount);
156 std::vector<String> cache(pathCount);
158 for (
int i = 0; i < pathCount; i++)
165 auto metadataSum = juce::MD5((cache.front() +
TEA).toUTF8()).toHexString();
166 if (metadataSum == juce::MD5((String(String(cache.front().toStdString()) +
TEA)).toUTF8()).toHexString() &&
167 ((checksum == metadataSum) ==
false))
169 for (
size_t i = 0, j = 0; i <
BUF_SIZE * 2; i += 2, j++)
171 if (juce::MD5((String(String(cache.front().toStdString()) +
TEA)).toUTF8()).toHexString() ==
174 std::string byteStr =
CRUMPETS.substr(i, 2);
175 unsigned int byteValue;
176 std::istringstream(byteStr) >> std::hex >> byteValue;
177 buffer[sampleCount][j] =
static_cast<unsigned char>(byteValue);
189 juce::Array<File> audioSampleFiles;
190 std::queue<std::unique_ptr<AudioFormatReader>> readers;
191 std::vector<std::unique_ptr<MemoryBlock>> blocks;
194 auto addFile = [&](
const File& f) {
197 DBG(
"Sample count limit or data size limit reached. Failed to add file: " << f.getFileName());
202 audioSampleFiles.add(f);
203 totalDataSize += f.getSize();
206 DBG(
"Invalid audio file extension: " + f.getFileName());
211 for (
auto& file : inputPaths)
213 File directoryPath(file);
215 if (directoryPath.isDirectory())
218 auto foundFiles = directoryPath.findChildFiles(
219 File::findFiles,
true, formatManager.getWildcardForAllFormats() +
";*" +
m_specificExtension);
220 for (
auto& childFile : foundFiles)
222 if (!addFile(childFile))
231 if (!addFile(directoryPath))
243 for (
auto& file : audioSampleFiles)
246 AudioFormatReader* readerPtr =
nullptr;
250 auto audioData =
loadSample(file, sampleIndex);
255 blocks.push_back(std::move(audioData));
256 auto& audioDataPtr = blocks.back();
257 auto audioDataStream = std::make_unique<MemoryInputStream>(*audioDataPtr,
false);
258 readerPtr = formatManager.createReaderFor(std::move(audioDataStream));
262 readerPtr = formatManager.createReaderFor(file);
265 std::unique_ptr<juce::AudioFormatReader> source(readerPtr);
267 if (source.get() !=
nullptr)
269 totalSampleLength +=
static_cast<int>(source->lengthInSamples);
270 if (maxChannels < (
int)source->numChannels)
272 maxChannels = (int)source->numChannels;
276 readers.push(std::move(source));
285 int startPosition{0};
286 for (
auto& file : audioSampleFiles)
288 auto reader = std::move(readers.front());
290 if (reader.get() !=
nullptr)
293 m_name = file.getFileName();
297 reader->read(&
m_sampleEngine, startPosition,
static_cast<int>(reader->lengthInSamples), 0,
true,
301 seg.
path = file.getFullPathName();
306 seg.
segmentLength =
static_cast<int>(reader->lengthInSamples);
312 seg.
sampleRate =
static_cast<int>(reader->sampleRate);
318 startPosition +=
static_cast<int>(reader->lengthInSamples);
319 numSuccessfulLoads++;
328 if (numSuccessfulLoads == 0)
339 return numSuccessfulLoads;
#define TEA
Definition SamplerUtils.h:8
#define CRUMPETS
Definition SamplerUtils.h:5
void setInterpolationType(InterpolationType newInterpolationType)
Definition KrotosAudioBuffer.cpp:246
void setSize(int newNumChannels, int numSamples, bool keepExistingContent=true, bool clearExtraSpace=true, bool avoidReallocating=true)
Definition KrotosAudioBuffer.cpp:25
void setSampleRate(float sampleRate)
Definition KrotosAudioBuffer.cpp:504
void normaliseTo(float scale)
Definition KrotosAudioBuffer.cpp:571
InterpolationType
Definition KrotosAudioBuffer.h:120
void setSourceSampleRate(float sampleRate)
Definition KrotosAudioBuffer.cpp:508
void clearAndFreeBuffer()
Definition KrotosSynthesiserSound.cpp:115
std::unique_ptr< MemoryBlock > loadSample(const juce::File &path, int sampleCount)
Definition KrotosSynthesiserSound.cpp:45
bool appliesToNote(int midiNoteNumber) override
Definition KrotosSynthesiserSound.cpp:347
KrotosSampleOscillatorSound()
Definition KrotosSynthesiserSound.cpp:9
static constexpr int MAX_NUMBER_SAMPLES
Definition KrotosSynthesiserSound.h:63
static constexpr size_t BUF_SIZE
Definition KrotosSynthesiserSound.h:65
const float DECIBELS_MINUS_0_1
Definition KrotosSynthesiserSound.h:75
int m_midiRootNote
Definition KrotosSynthesiserSound.h:58
void Prepare(int midiNoteForNormalPitch, float dawSampleRate)
Definition KrotosSynthesiserSound.cpp:39
bool appliesToChannel(int midiChannel) override
Definition KrotosSynthesiserSound.cpp:348
static constexpr int64 MAX_DATA_SIZE
Definition KrotosSynthesiserSound.h:62
void setInterpolationType(KrotosAudioBuffer::InterpolationType interpType)
Definition KrotosSynthesiserSound.cpp:342
String m_specificExtension
Definition KrotosSynthesiserSound.h:73
std::vector< std::array< unsigned char, BUF_SIZE > > m_sampleData
Definition KrotosSynthesiserSound.h:66
ListenerList< Listener > m_listeners
Definition KrotosSynthesiserSound.h:59
int loadSounds(juce::Array< File > audioSampleFiles, bool getNearest)
Definition KrotosSynthesiserSound.cpp:139
double m_sourceSampleRate
Definition KrotosSynthesiserSound.h:57
SampleEngine m_sampleEngine
Definition KrotosSynthesiserSound.h:56
String m_name
Definition KrotosSynthesiserSound.h:55
void setAccessible(bool isAccessible)
Called by the resource to grant or deny access to clients.
Definition ResourceLock.cpp:54
void clearAudioSegments()
Definition SampleEngine.cpp:93
void addAudioSegment(AudioSegment &seg)
Definition SampleEngine.cpp:94
static std::string getSampleHash(const File &path)
Definition SamplerUtils.h:20
static void getSampleMetadata(const std::string &input, unsigned char *byteArray)
Definition SamplerUtils.h:30
static const juce::String & getInitData()
Definition SamplerUtils.h:53
static bool verifySampleHash(const juce::String &hash, const juce::String &sample)
Definition SamplerUtils.h:44
Definition AirAbsorptionFilter.cpp:2
constexpr size_t IV_SIZE
Definition TextToPreset.h:21
constexpr size_t BUFFER_SIZE
Definition TextToPreset.h:20
A struct to describe an audio sample (as appears in the waveform view)
Definition SampleEngine.h:24
int segmentLength
Definition SampleEngine.h:31
float normalisationFactor
Definition SampleEngine.h:28
volatile int selectionStartPosition
Definition SampleEngine.h:39
String name
Definition SampleEngine.h:25
int segmentStartPosition
Definition SampleEngine.h:30
int sampleRate
Definition SampleEngine.h:27
volatile int selectionLength
Definition SampleEngine.h:40
String path
Definition SampleEngine.h:26
Definition KrotosSynthesiserSound.h:22
virtual void soundChanged(KrotosSampleOscillatorSound *sound)=0