Skip to content

Commit c3de181

Browse files
flush sound if user stops playback when count-in is playing
1 parent bd84397 commit c3de181

File tree

12 files changed

+57
-24
lines changed

12 files changed

+57
-24
lines changed

src/framework/audio/internal/abstracteventsequencer.h

+14-5
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,20 @@ class AbstractEventSequencer : public async::Asyncable
8989
}
9090
}
9191

92+
void flushOffstream()
93+
{
94+
if (m_offStreamEvents.empty()) {
95+
return;
96+
}
97+
98+
m_offStreamEvents.clear();
99+
updateOffSequenceIterator();
100+
101+
if (m_onOffStreamFlushed) {
102+
m_onOffStreamFlushed();
103+
}
104+
}
105+
92106
void setActive(const bool active)
93107
{
94108
if (m_isActive == active) {
@@ -98,11 +112,6 @@ class AbstractEventSequencer : public async::Asyncable
98112
m_isActive = active;
99113

100114
if (m_isActive) {
101-
if (!m_offStreamEvents.empty()) {
102-
m_offStreamEvents.clear();
103-
updateOffSequenceIterator();
104-
}
105-
106115
updateMainStream();
107116
}
108117
}

src/framework/audio/internal/synthesizers/fluidsynth/fluidsequencer.cpp

+1-6
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,7 @@ int FluidSequencer::naturalExpressionLevel() const
6161

6262
void FluidSequencer::updateOffStreamEvents(const mpe::PlaybackEventsMap& events, const PlaybackParamList&)
6363
{
64-
m_offStreamEvents.clear();
65-
66-
if (m_onOffStreamFlushed) {
67-
m_onOffStreamFlushed();
68-
}
69-
64+
flushOffstream();
7065
updatePlaybackEvents(m_offStreamEvents, events);
7166
updateOffSequenceIterator();
7267
}

src/framework/audio/internal/synthesizers/fluidsynth/fluidsynth.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,8 @@ void FluidSynth::allNotesOff()
203203
port->sendEvent(e);
204204
}
205205
}
206+
207+
m_allNotesOffRequested = false;
206208
}
207209

208210
bool FluidSynth::handleEvent(const midi::Event& event)
@@ -364,6 +366,8 @@ void FluidSynth::flushSound()
364366
return;
365367
}
366368

369+
m_sequencer.flushOffstream();
370+
367371
allNotesOff();
368372

369373
fluid_synth_all_sounds_off(m_fluid->synth, -1);
@@ -408,7 +412,6 @@ samples_t FluidSynth::process(float* buffer, samples_t samplesPerChannel)
408412

409413
if (m_allNotesOffRequested) {
410414
allNotesOff();
411-
m_allNotesOffRequested = false;
412415
}
413416

414417
const msecs_t nextMsecs = samplesToMsecs(samplesPerChannel, m_sampleRate);

src/framework/audio/internal/worker/eventaudiosource.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,17 @@ void EventAudioSource::seek(const msecs_t newPositionMsecs)
138138
m_synth->revokePlayingNotes();
139139
}
140140

141+
void EventAudioSource::flush()
142+
{
143+
ONLY_AUDIO_WORKER_THREAD;
144+
145+
IF_ASSERT_FAILED(m_synth) {
146+
return;
147+
}
148+
149+
m_synth->flushSound();
150+
}
151+
141152
const AudioInputParams& EventAudioSource::inputParams() const
142153
{
143154
return m_params;

src/framework/audio/internal/worker/eventaudiosource.h

+1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class EventAudioSource : public ITrackAudioInput, public muse::Injectable, publi
5353
samples_t process(float* buffer, samples_t samplesPerChannel) override;
5454

5555
void seek(const msecs_t newPositionMsecs) override;
56+
void flush() override;
5657

5758
const AudioInputParams& inputParams() const override;
5859
void applyInputParams(const AudioInputParams& requiredParams) override;

src/framework/audio/internal/worker/sequenceplayer.cpp

+18-1
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,12 @@ SequencePlayer::SequencePlayer(IGetTracks* getTracks, IClockPtr clock, const mod
3838
});
3939

4040
m_clock->statusChanged().onReceive(this, [this](const PlaybackStatus status) {
41+
const bool active = status == PlaybackStatus::Running;
42+
4143
if (!m_countDownIsSet) {
42-
audioEngine()->mixer()->setIsActive(status == PlaybackStatus::Running);
44+
audioEngine()->mixer()->setIsActive(active);
45+
} else if (!active) {
46+
flushAllTracks();
4347
}
4448
});
4549

@@ -166,3 +170,16 @@ void SequencePlayer::seekAllTracks(const msecs_t newPositionMsecs)
166170
}
167171
}
168172
}
173+
174+
void SequencePlayer::flushAllTracks()
175+
{
176+
IF_ASSERT_FAILED(m_getTracks) {
177+
return;
178+
}
179+
180+
for (const auto& pair : m_getTracks->allTracks()) {
181+
if (pair.second->inputHandler) {
182+
pair.second->inputHandler->flush();
183+
}
184+
}
185+
}

src/framework/audio/internal/worker/sequenceplayer.h

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ class SequencePlayer : public ISequencePlayer, public Injectable, public async::
5959

6060
private:
6161
void seekAllTracks(const msecs_t newPositionMsecs);
62+
void flushAllTracks();
6263

6364
IGetTracks* m_getTracks = nullptr;
6465
IClockPtr m_clock = nullptr;

src/framework/audio/internal/worker/track.h

+2
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ class ITrackAudioInput : public IAudioSource
4444
virtual ~ITrackAudioInput() = default;
4545

4646
virtual void seek(const msecs_t newPositionMsecs) = 0;
47+
virtual void flush() = 0;
48+
4749
virtual const AudioInputParams& inputParams() const = 0;
4850
virtual void applyInputParams(const AudioInputParams& requiredParams) = 0;
4951
virtual async::Channel<AudioInputParams> inputParamsChanged() const = 0;

src/framework/musesampler/internal/musesamplersequencer.cpp

+1-5
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,7 @@ void MuseSamplerSequencer::init(MuseSamplerLibHandlerPtr samplerLib, ms_MuseSamp
116116

117117
void MuseSamplerSequencer::updateOffStreamEvents(const PlaybackEventsMap& events, const PlaybackParamList& params)
118118
{
119-
m_offStreamEvents.clear();
120-
121-
if (m_onOffStreamFlushed) {
122-
m_onOffStreamFlushed();
123-
}
119+
flushOffstream();
124120

125121
parseOffStreamParams(params, m_offStreamCache);
126122

src/framework/musesampler/internal/musesamplerwrapper.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ AudioSourceType MuseSamplerWrapper::type() const
149149

150150
void MuseSamplerWrapper::flushSound()
151151
{
152+
m_sequencer.flushOffstream();
152153
m_allNotesOffRequested = true;
153154
}
154155

src/framework/vst/internal/synth/vstsequencer.cpp

+1-6
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,7 @@ void VstSequencer::init(ParamsMapping&& mapping, bool useDynamicEvents)
5959

6060
void VstSequencer::updateOffStreamEvents(const mpe::PlaybackEventsMap& events, const mpe::PlaybackParamList&)
6161
{
62-
m_offStreamEvents.clear();
63-
64-
if (m_onOffStreamFlushed) {
65-
m_onOffStreamFlushed();
66-
}
67-
62+
flushOffstream();
6863
updatePlaybackEvents(m_offStreamEvents, events);
6964
updateOffSequenceIterator();
7065
}

src/framework/vst/internal/synth/vstsynthesiser.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ void VstSynthesiser::revokePlayingNotes()
129129

130130
void VstSynthesiser::flushSound()
131131
{
132+
m_sequencer.flushOffstream();
133+
132134
if (m_vstAudioClient) {
133135
m_vstAudioClient->flush();
134136
}

0 commit comments

Comments
 (0)