diff --git a/src/playback/internal/playbackcontroller.cpp b/src/playback/internal/playbackcontroller.cpp index 6143a712587c0..daa99f461276c 100644 --- a/src/playback/internal/playbackcontroller.cpp +++ b/src/playback/internal/playbackcontroller.cpp @@ -980,6 +980,7 @@ void PlaybackController::doAddTrack(const InstrumentTrackId& instrumentTrackId, m_instrumentTrackIdMap.insert({ instrumentTrackId, trackId }); + const bool trackNewlyAdded = !audioSettings()->trackHasExistingOutputParams(instrumentTrackId); audioSettings()->setTrackInputParams(instrumentTrackId, appliedParams.in); audioSettings()->setTrackOutputParams(instrumentTrackId, appliedParams.out); @@ -989,6 +990,10 @@ void PlaybackController::doAddTrack(const InstrumentTrackId& instrumentTrackId, m_trackAdded.send(trackId); + if (trackNewlyAdded) { + onTrackNewlyAdded(instrumentTrackId); + } + if (shouldLoadDrumset(originMeta, appliedParams.in.resourceMeta)) { m_drumsetLoader.loadDrumset(m_notation, instrumentTrackId, appliedParams.in.resourceMeta); } @@ -1133,6 +1138,19 @@ void PlaybackController::removeTrack(const InstrumentTrackId& instrumentTrackId) m_instrumentTrackIdMap.erase(instrumentTrackId); } +void PlaybackController::onTrackNewlyAdded(const InstrumentTrackId& instrumentTrackId) +{ + for (const IExcerptNotationPtr& excerpt : m_masterNotation->excerpts()) { + if (const INotationPtr& notation = excerpt->notation()) { + if (notation == m_notation) { + continue; + } + const INotationSoloMuteState::SoloMuteState soloMuteState = { /*mute*/ true, /*solo*/ false }; + notation->soloMuteState()->setTrackSoloMuteState(instrumentTrackId, soloMuteState); + } + } +} + void PlaybackController::setupNewCurrentSequence(const TrackSequenceId sequenceId) { playback()->tracks()->removeAllTracks(m_currentSequenceId); diff --git a/src/playback/internal/playbackcontroller.h b/src/playback/internal/playbackcontroller.h index 84640c5ebe310..78262d878dfbe 100644 --- a/src/playback/internal/playbackcontroller.h +++ b/src/playback/internal/playbackcontroller.h @@ -203,6 +203,8 @@ class PlaybackController : public IPlaybackController, public muse::actions::Act void removeNonExistingTracks(); void removeTrack(const engraving::InstrumentTrackId& instrumentTrackId); + void onTrackNewlyAdded(const engraving::InstrumentTrackId& instrumentTrackId); + muse::audio::secs_t playedTickToSecs(int tick) const; notation::INotationPtr m_notation; diff --git a/src/project/internal/projectaudiosettings.cpp b/src/project/internal/projectaudiosettings.cpp index 0903abebcb38e..c993cee87f94e 100644 --- a/src/project/internal/projectaudiosettings.cpp +++ b/src/project/internal/projectaudiosettings.cpp @@ -123,6 +123,11 @@ void ProjectAudioSettings::clearTrackInputParams() m_settingsChanged.notify(); } +bool ProjectAudioSettings::trackHasExistingOutputParams(const InstrumentTrackId& partId) const +{ + return muse::contains(m_trackOutputParamsMap, partId); +} + const AudioOutputParams& ProjectAudioSettings::trackOutputParams(const InstrumentTrackId& partId) const { auto search = m_trackOutputParamsMap.find(partId); diff --git a/src/project/internal/projectaudiosettings.h b/src/project/internal/projectaudiosettings.h index 74794f442027c..b9c4e61a51f12 100644 --- a/src/project/internal/projectaudiosettings.h +++ b/src/project/internal/projectaudiosettings.h @@ -49,6 +49,7 @@ class ProjectAudioSettings : public IProjectAudioSettings void setTrackInputParams(const engraving::InstrumentTrackId& partId, const muse::audio::AudioInputParams& params) override; void clearTrackInputParams() override; + bool trackHasExistingOutputParams(const engraving::InstrumentTrackId& partId) const override; const muse::audio::AudioOutputParams& trackOutputParams(const engraving::InstrumentTrackId& partId) const override; void setTrackOutputParams(const engraving::InstrumentTrackId& partId, const muse::audio::AudioOutputParams& params) override; diff --git a/src/project/iprojectaudiosettings.h b/src/project/iprojectaudiosettings.h index f5dc3a4f84f40..f2e96c2785789 100644 --- a/src/project/iprojectaudiosettings.h +++ b/src/project/iprojectaudiosettings.h @@ -50,6 +50,7 @@ class IProjectAudioSettings virtual void setTrackInputParams(const engraving::InstrumentTrackId& trackId, const muse::audio::AudioInputParams& params) = 0; virtual void clearTrackInputParams() = 0; + virtual bool trackHasExistingOutputParams(const engraving::InstrumentTrackId& trackId) const = 0; virtual const muse::audio::AudioOutputParams& trackOutputParams(const engraving::InstrumentTrackId& trackId) const = 0; virtual void setTrackOutputParams(const engraving::InstrumentTrackId& trackId, const muse::audio::AudioOutputParams& params) = 0;