Skip to content

Commit 3ca7fc7

Browse files
Update audio source write
1 parent a3e23f0 commit 3ca7fc7

File tree

3 files changed

+34
-4
lines changed

3 files changed

+34
-4
lines changed

src/audioCore/graph/SeqSourceProcessor.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -898,7 +898,7 @@ void SeqSourceProcessor::writeAudioSource(int type,
898898

899899
/** Get Audio Data */
900900
juce::AudioSampleBuffer audioChannelTemp{ this->audioChannels.size(),
901-
(int)(endTime * sampleRate) };
901+
(int)((endTime - startTime) * sampleRate) };
902902
audioChannelTemp.clear();
903903
for (auto [srcc, dstc] : audioLinks) {
904904
vMath::addAudioData(audioChannelTemp, audioData,
@@ -921,7 +921,7 @@ void SeqSourceProcessor::writeAudioSource(int type,
921921
(int)((overlapEndTime - overlapStartTime) * sampleRate) };
922922
for (int j = 0; j < audioTemp.getNumChannels(); j++) {
923923
vMath::copyAudioData(audioTemp, audioChannelTemp,
924-
0, (int)(overlapStartTime * sampleRate), j, j, audioTemp.getNumChannels());
924+
0, (int)((overlapStartTime - startTime) * sampleRate), j, j, audioTemp.getNumSamples());
925925
}
926926

927927
/** Add Data */

src/audioCore/source/SourceInternalContainer.cpp

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,12 +142,39 @@ void SourceInternalContainer::setAudio(
142142
void SourceInternalContainer::writeAudio(AudioWriteType type, const juce::AudioSampleBuffer& buffer,
143143
double startTime, double length, double sampleRate) {
144144
if (this->type == SourceType::Audio) {
145+
/** Limit Length */
146+
length = std::min(length, buffer.getNumSamples() / sampleRate);
147+
145148
/** Init Audio */
146149
if (!this->audioData) {
147150
this->initAudioData(buffer.getNumChannels(), sampleRate, startTime + length);
148151
}
149152

150-
/** TODO Write Data */
153+
/** Write Data */
154+
int dstStartSample = startTime * this->audioSampleRate;
155+
int dstSampleLength = length * this->audioSampleRate;
156+
int channels = std::min(this->audioData->getNumChannels(), buffer.getNumChannels());
157+
if (this->audioData->getNumSamples() - dstSampleLength < dstStartSample) {
158+
/** Increase Audio Length */
159+
this->audioData->setSize(
160+
channels, dstStartSample + dstSampleLength,
161+
true, true, true);
162+
}
163+
164+
juce::AudioSampleBuffer resampleTemp{ channels, dstSampleLength };
165+
vMath::resampleAudioData(resampleTemp, buffer,
166+
0, 0, resampleTemp.getNumSamples(), this->audioSampleRate, sampleRate);
167+
168+
if (type == AudioWriteType::Insert) {
169+
for (int i = 0; i < channels; i++) {
170+
vMath::addAudioData(*(this->audioData.get()), resampleTemp, dstStartSample, 0, i, i, dstSampleLength);
171+
}
172+
}
173+
else if (type == AudioWriteType::Cover) {
174+
for (int i = 0; i < channels; i++) {
175+
vMath::copyAudioData(*(this->audioData.get()), resampleTemp, dstStartSample, 0, i, i, dstSampleLength);
176+
}
177+
}
151178

152179
/** Set Flag */
153180
this->changed();
@@ -157,7 +184,7 @@ void SourceInternalContainer::writeAudio(AudioWriteType type, const juce::AudioS
157184
void SourceInternalContainer::writeMIDI(MIDIWriteType type, const juce::MidiMessageSequence& sequence,
158185
double startTime, double length) {
159186
if (this->type == SourceType::MIDI) {
160-
/** Init Audio */
187+
/** Init MIDI */
161188
if (!this->midiData) {
162189
this->initMidiData();
163190
}

src/audioCore/source/SourceItem.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,9 @@ void SourceItem::writeAudio(AudioWriteType type, const juce::AudioSampleBuffer&
179179
/** Write Data */
180180
this->container->writeAudio(type, buffer, startTime, length, sampleRate);
181181

182+
/** Resampler */
183+
this->updateAudioResampler();
184+
182185
/** Callback */
183186
this->invokeCallback();
184187
}

0 commit comments

Comments
 (0)