diff --git a/src/framework/audio/common/audiotypes.h b/src/framework/audio/common/audiotypes.h index 78137e3815a9b..7ee5e266edbd6 100644 --- a/src/framework/audio/common/audiotypes.h +++ b/src/framework/audio/common/audiotypes.h @@ -57,13 +57,6 @@ using volume_dbfs_t = db_t; using gain_t = float; using balance_t = float; -using TrackSequenceId = int32_t; -using TrackSequenceIdList = std::vector; - -//! NOTE: We are eliminating the concept of a sequence. -//! This is a temporary required for the transitional phase. -static constexpr TrackSequenceId DUMMY_SEQUENCE_ID = 1; - using TrackId = int32_t; using TrackIdList = std::vector; using TrackName = std::string; diff --git a/src/framework/audio/engine/CMakeLists.txt b/src/framework/audio/engine/CMakeLists.txt index 69bebdb97c826..c67a223555e0d 100644 --- a/src/framework/audio/engine/CMakeLists.txt +++ b/src/framework/audio/engine/CMakeLists.txt @@ -41,8 +41,7 @@ else() iaudioengine.h iaudiosource.h iclock.h - itracksequence.h - isequenceplayer.h + iengineplayer.h ifxprocessor.h ifxresolver.h isynthesizer.h @@ -70,8 +69,8 @@ else() internal/clock.cpp internal/clock.h internal/igetplaybackposition.h - internal/sequenceplayer.cpp - internal/sequenceplayer.h + internal/engineplayer.cpp + internal/engineplayer.h internal/samplerateconvertor.cpp internal/samplerateconvertor.h internal/track.h diff --git a/src/framework/audio/engine/isequenceplayer.h b/src/framework/audio/engine/iengineplayer.h similarity index 93% rename from src/framework/audio/engine/isequenceplayer.h rename to src/framework/audio/engine/iengineplayer.h index 0e2cc8552846a..bfa7927195504 100644 --- a/src/framework/audio/engine/isequenceplayer.h +++ b/src/framework/audio/engine/iengineplayer.h @@ -29,10 +29,10 @@ #include "audio/common/audiotypes.h" namespace muse::audio::engine { -class ISequencePlayer +class IEnginePlayer { public: - virtual ~ISequencePlayer() = default; + virtual ~IEnginePlayer() = default; virtual async::Promise prepareToPlay() = 0; @@ -53,5 +53,5 @@ class ISequencePlayer virtual secs_t playbackPosition() const = 0; virtual async::Channel playbackPositionChanged() const = 0; }; -using ISequencePlayerPtr = std::shared_ptr; +using IEnginePlayerPtr = std::shared_ptr; } diff --git a/src/framework/audio/engine/internal/engineplayback.cpp b/src/framework/audio/engine/internal/engineplayback.cpp index d6f63c41e2677..7b57cf7525957 100644 --- a/src/framework/audio/engine/internal/engineplayback.cpp +++ b/src/framework/audio/engine/internal/engineplayback.cpp @@ -27,7 +27,7 @@ #include "clock.h" #include "eventaudiosource.h" -#include "sequenceplayer.h" +#include "engineplayer.h" #include "muse_framework_config.h" #ifdef MUSE_MODULE_AUDIO_EXPORT @@ -49,7 +49,7 @@ void EnginePlayback::init() ONLY_AUDIO_ENGINE_THREAD; m_clock = std::make_shared(); - m_player = std::make_shared(this, m_clock); + m_player = std::make_shared(this, m_clock); audioEngine()->modeChanged().onReceive(this, [this](RenderMode mode) { m_prevActiveTrackId = INVALID_TRACK_ID; diff --git a/src/framework/audio/engine/internal/engineplayback.h b/src/framework/audio/engine/internal/engineplayback.h index 4e0ca31a9957b..1169915086d6c 100644 --- a/src/framework/audio/engine/internal/engineplayback.h +++ b/src/framework/audio/engine/internal/engineplayback.h @@ -33,7 +33,7 @@ #include "../iaudioengine.h" #include "../iaudioengineconfiguration.h" #include "../iclock.h" -#include "../isequenceplayer.h" +#include "../iengineplayer.h" #include "track.h" #include "igettracks.h" @@ -103,7 +103,7 @@ class EnginePlayback : public IEnginePlayback, public IGetTracks, public async:: secs_t playbackPosition() const override; async::Channel playbackPositionChanged() const override; - // 4. Adjust a Sequence output + // 4. Adjust output RetVal outputParams(const TrackId trackId) const override; void setOutputParams(const TrackId trackId, const AudioOutputParams& params) override; async::Channel outputParamsChanged() const override; @@ -151,7 +151,7 @@ class EnginePlayback : public IEnginePlayback, public IGetTracks, public async:: async::Channel m_masterOutputParamsChanged; TracksMap m_tracks; - ISequencePlayerPtr m_player = nullptr; + IEnginePlayerPtr m_player = nullptr; IClockPtr m_clock = nullptr; TrackId m_prevActiveTrackId = INVALID_TRACK_ID; std::unordered_set m_tracksToProcessWhenIdle; diff --git a/src/framework/audio/engine/internal/sequenceplayer.cpp b/src/framework/audio/engine/internal/engineplayer.cpp similarity index 83% rename from src/framework/audio/engine/internal/sequenceplayer.cpp rename to src/framework/audio/engine/internal/engineplayer.cpp index 591a026de8c60..631fa81309e5a 100644 --- a/src/framework/audio/engine/internal/sequenceplayer.cpp +++ b/src/framework/audio/engine/internal/engineplayer.cpp @@ -20,7 +20,7 @@ * along with this program. If not, see . */ -#include "sequenceplayer.h" +#include "engineplayer.h" #include "audio/common/audiosanitizer.h" @@ -31,7 +31,7 @@ using namespace muse::audio; using namespace muse::audio::engine; using namespace muse::async; -SequencePlayer::SequencePlayer(IGetTracks* getTracks, IClockPtr clock) +EnginePlayer::EnginePlayer(IGetTracks* getTracks, IClockPtr clock) : m_getTracks(getTracks), m_clock(clock) { m_clock->seekOccurred().onNotify(this, [this]() { @@ -54,7 +54,7 @@ SequencePlayer::SequencePlayer(IGetTracks* getTracks, IClockPtr clock) }); } -async::Promise SequencePlayer::prepareToPlay() +async::Promise EnginePlayer::prepareToPlay() { ONLY_AUDIO_ENGINE_THREAD; @@ -67,7 +67,7 @@ async::Promise SequencePlayer::prepareToPlay() }); } -void SequencePlayer::play(const secs_t delay) +void EnginePlayer::play(const secs_t delay) { ONLY_AUDIO_ENGINE_THREAD; @@ -77,7 +77,7 @@ void SequencePlayer::play(const secs_t delay) m_clock->start(); } -void SequencePlayer::seek(const secs_t newPosition, const bool flushSound) +void EnginePlayer::seek(const secs_t newPosition, const bool flushSound) { ONLY_AUDIO_ENGINE_THREAD; @@ -88,7 +88,7 @@ void SequencePlayer::seek(const secs_t newPosition, const bool flushSound) m_flushSoundOnSeek = true; } -void SequencePlayer::stop() +void EnginePlayer::stop() { ONLY_AUDIO_ENGINE_THREAD; @@ -97,7 +97,7 @@ void SequencePlayer::stop() m_notYetReadyToPlayTrackIdSet.clear(); } -void SequencePlayer::pause() +void EnginePlayer::pause() { ONLY_AUDIO_ENGINE_THREAD; @@ -106,7 +106,7 @@ void SequencePlayer::pause() m_notYetReadyToPlayTrackIdSet.clear(); } -void SequencePlayer::resume(const secs_t delay) +void EnginePlayer::resume(const secs_t delay) { ONLY_AUDIO_ENGINE_THREAD; @@ -116,7 +116,7 @@ void SequencePlayer::resume(const secs_t delay) m_clock->resume(); } -msecs_t SequencePlayer::duration() const +msecs_t EnginePlayer::duration() const { ONLY_AUDIO_ENGINE_THREAD; @@ -127,56 +127,56 @@ msecs_t SequencePlayer::duration() const return m_clock->timeDuration(); } -void SequencePlayer::setDuration(const msecs_t duration) +void EnginePlayer::setDuration(const msecs_t duration) { ONLY_AUDIO_ENGINE_THREAD; m_clock->setTimeDuration(duration * 1000); } -Ret SequencePlayer::setLoop(const msecs_t fromMsec, const msecs_t toMsec) +Ret EnginePlayer::setLoop(const msecs_t fromMsec, const msecs_t toMsec) { ONLY_AUDIO_ENGINE_THREAD; return m_clock->setTimeLoop(fromMsec * 1000, toMsec * 1000); } -void SequencePlayer::resetLoop() +void EnginePlayer::resetLoop() { ONLY_AUDIO_ENGINE_THREAD; m_clock->resetTimeLoop(); } -secs_t SequencePlayer::playbackPosition() const +secs_t EnginePlayer::playbackPosition() const { ONLY_AUDIO_ENGINE_THREAD; return microsecsToSecs(m_clock->currentTime()); } -Channel SequencePlayer::playbackPositionChanged() const +Channel EnginePlayer::playbackPositionChanged() const { ONLY_AUDIO_ENGINE_THREAD; return m_clock->timeChanged(); } -PlaybackStatus SequencePlayer::playbackStatus() const +PlaybackStatus EnginePlayer::playbackStatus() const { ONLY_AUDIO_ENGINE_THREAD; return m_clock->status(); } -Channel SequencePlayer::playbackStatusChanged() const +Channel EnginePlayer::playbackStatusChanged() const { ONLY_AUDIO_ENGINE_THREAD; return m_clock->statusChanged(); } -void SequencePlayer::seekAllTracks(const msecs_t newPositionMsecs) +void EnginePlayer::seekAllTracks(const msecs_t newPositionMsecs) { IF_ASSERT_FAILED(m_getTracks) { return; @@ -189,7 +189,7 @@ void SequencePlayer::seekAllTracks(const msecs_t newPositionMsecs) } } -void SequencePlayer::flushAllTracks() +void EnginePlayer::flushAllTracks() { IF_ASSERT_FAILED(m_getTracks) { return; @@ -202,7 +202,7 @@ void SequencePlayer::flushAllTracks() } } -void SequencePlayer::prepareAllTracksToPlay(AllTracksReadyCallback allTracksReadyCallback) +void EnginePlayer::prepareAllTracksToPlay(AllTracksReadyCallback allTracksReadyCallback) { ONLY_AUDIO_ENGINE_THREAD; diff --git a/src/framework/audio/engine/internal/sequenceplayer.h b/src/framework/audio/engine/internal/engineplayer.h similarity index 88% rename from src/framework/audio/engine/internal/sequenceplayer.h rename to src/framework/audio/engine/internal/engineplayer.h index d76ed00174505..08163fc4d6640 100644 --- a/src/framework/audio/engine/internal/sequenceplayer.h +++ b/src/framework/audio/engine/internal/engineplayer.h @@ -20,26 +20,26 @@ * along with this program. If not, see . */ -#ifndef MUSE_AUDIO_SEQUENCEPLAYER_H -#define MUSE_AUDIO_SEQUENCEPLAYER_H +#ifndef MUSE_AUDIO_ENGINEPLAYER_H +#define MUSE_AUDIO_ENGINEPLAYER_H #include "global/async/asyncable.h" #include "modularity/ioc.h" #include "../iaudioengine.h" -#include "../isequenceplayer.h" +#include "../iengineplayer.h" #include "../iclock.h" #include "igettracks.h" namespace muse::audio::engine { -class SequencePlayer : public ISequencePlayer, public async::Asyncable +class EnginePlayer : public IEnginePlayer, public async::Asyncable { GlobalInject audioEngine; public: - explicit SequencePlayer(IGetTracks* getTracks, IClockPtr clock); + explicit EnginePlayer(IGetTracks* getTracks, IClockPtr clock); async::Promise prepareToPlay() override; @@ -76,4 +76,4 @@ class SequencePlayer : public ISequencePlayer, public async::Asyncable }; } -#endif // MUSE_AUDIO_SEQUENCEPLAYER_H +#endif // MUSE_AUDIO_ENGINEPLAYER_H diff --git a/src/framework/audio/engine/internal/enginerpccontroller.cpp b/src/framework/audio/engine/internal/enginerpccontroller.cpp index eac3ca1b93eb9..a15217428185c 100644 --- a/src/framework/audio/engine/internal/enginerpccontroller.cpp +++ b/src/framework/audio/engine/internal/enginerpccontroller.cpp @@ -531,7 +531,7 @@ void EngineRpcController::init() SaveSoundTrackProgress ch = playback()->saveSoundTrackProgressChanged(); ch.onReceive(this, [this](int64_t current, int64_t total, SaveSoundTrackStage stage) { ONLY_AUDIO_RPC_THREAD; - m_saveSoundTrackProgressStream.send(DUMMY_SEQUENCE_ID, current, total, stage); + m_saveSoundTrackProgressStream.send(current, total, stage); }); if (m_saveSoundTrackProgressStreamId == 0) { diff --git a/src/framework/audio/engine/internal/enginerpccontroller.h b/src/framework/audio/engine/internal/enginerpccontroller.h index 9ba8bbf3055ec..4f8b3afff662d 100644 --- a/src/framework/audio/engine/internal/enginerpccontroller.h +++ b/src/framework/audio/engine/internal/enginerpccontroller.h @@ -64,7 +64,7 @@ class EngineRpcController : public async::Asyncable std::map > m_pendingTracks; bool m_soundFontsChangedSubscribed = false; - async::Channel m_saveSoundTrackProgressStream; + async::Channel m_saveSoundTrackProgressStream; rpc::StreamId m_saveSoundTrackProgressStreamId = 0; }; } diff --git a/src/framework/audio/engine/itracksequence.h b/src/framework/audio/engine/itracksequence.h deleted file mode 100644 index a48f6d303376e..0000000000000 --- a/src/framework/audio/engine/itracksequence.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * SPDX-License-Identifier: GPL-3.0-only - * MuseScore-CLA-applies - * - * MuseScore - * Music Composition & Notation - * - * Copyright (C) 2025 MuseScore Limited and others - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 3 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#pragma once - -#include "global/async/channel.h" -#include "global/types/retval.h" -#include "mpe/events.h" - -#include "audio/common/audiotypes.h" - -#include "isequenceplayer.h" -#include "isequenceio.h" - -namespace muse::audio::engine { -class ITrackSequence -{ -public: - virtual ~ITrackSequence() = default; - - virtual TrackSequenceId id() const = 0; - - virtual RetVal2 addTrack(const std::string& trackName, const mpe::PlaybackData& playbackData, - const AudioParams& requiredParams) = 0; - virtual RetVal2 addTrack(const std::string& trackName, io::IODevice* device, - const AudioParams& requiredParams) = 0; - - virtual RetVal2 addAuxTrack(const std::string& trackName, - const AudioOutputParams& requiredOutputParams) = 0; - - virtual TrackName trackName(const TrackId id) const = 0; - virtual TrackIdList trackIdList() const = 0; - - virtual Ret removeTrack(const TrackId id) = 0; - virtual void removeAllTracks() = 0; - - virtual async::Channel trackAdded() const = 0; - virtual async::Channel trackRemoved() const = 0; - - virtual ISequencePlayerPtr player() const = 0; - virtual ISequenceIOPtr audioIO() const = 0; -}; - -using ITrackSequencePtr = std::shared_ptr; -} diff --git a/src/framework/audio/main/internal/playback.cpp b/src/framework/audio/main/internal/playback.cpp index fc89ec77e2206..a28500d63d05f 100644 --- a/src/framework/audio/main/internal/playback.cpp +++ b/src/framework/audio/main/internal/playback.cpp @@ -84,15 +84,6 @@ void Playback::init() } m_masterOutputParamsChanged.send(params); }); - - m_saveSoundTrackProgressStream.onReceive(this, [this](int64_t current, int64_t total, - SaveSoundTrackStage stage) { - TrackSequenceId sequenceId = DUMMY_SEQUENCE_ID; - auto it = m_saveSoundTrackProgressChannels.find(sequenceId); - if (it != m_saveSoundTrackProgressChannels.end()) { - it->second.send(current, total, stage); - } - }); } void Playback::deinit() @@ -145,7 +136,7 @@ Promise Playback::initPlayback() void Playback::deinitPlayback() { ONLY_AUDIO_MAIN_THREAD; - m_saveSoundTrackProgressChannels.erase(DUMMY_SEQUENCE_ID); + m_saveSoundTrackProgressStream = SaveSoundTrackProgress(); } IPlayerPtr Playback::player() const @@ -155,7 +146,7 @@ IPlayerPtr Playback::player() const return p; } -// 2. Setup tracks for Sequence +// 2. Setup tracks async::Promise Playback::trackIdList() const { ONLY_AUDIO_MAIN_THREAD; @@ -174,7 +165,7 @@ async::Promise Playback::trackIdList() const (void)reject(ret.ret.code(), ret.ret.text()); } }); - return Promise::dummy_result(); + return Promise::dummy_result(); }, PromiseType::AsyncByBody); } @@ -430,7 +421,7 @@ void Playback::clearSources() channel()->send(msg); } -// 4. Adjust a Sequence output +// 4. Adjust output async::Promise Playback::outputParams(const TrackId trackId) const { @@ -609,15 +600,9 @@ void Playback::abortSavingAllSoundTracks() SaveSoundTrackProgress Playback::saveSoundTrackProgressChanged() const { - TrackSequenceId sequenceId = DUMMY_SEQUENCE_ID; - auto it = m_saveSoundTrackProgressChannels.find(sequenceId); - if (it == m_saveSoundTrackProgressChannels.end()) { - it = m_saveSoundTrackProgressChannels.insert({ sequenceId, SaveSoundTrackProgress() }).first; - - SaveSoundTrackProgress ch; - - Msg msg = rpc::make_request(Method::GetSaveSoundTrackProgress, RpcPacker::pack(sequenceId)); - channel()->send(msg, [this, ch](const Msg& res) { + if (!m_saveSoundTrackProgressStreamInited) { + Msg msg = rpc::make_request(Method::GetSaveSoundTrackProgress); + channel()->send(msg, [this](const Msg& res) { ONLY_AUDIO_MAIN_THREAD; StreamId streamId = 0; IF_ASSERT_FAILED(RpcPacker::unpack(res.data, streamId)) { @@ -633,9 +618,11 @@ SaveSoundTrackProgress Playback::saveSoundTrackProgressChanged() const assert(m_saveSoundTrackProgressStreamId == streamId); }); + + m_saveSoundTrackProgressStreamInited = true; } - return it->second; + return m_saveSoundTrackProgressStream; } void Playback::clearAllFx() diff --git a/src/framework/audio/main/internal/playback.h b/src/framework/audio/main/internal/playback.h index 046b46d614b22..a2903a18d54d9 100644 --- a/src/framework/audio/main/internal/playback.h +++ b/src/framework/audio/main/internal/playback.h @@ -55,7 +55,7 @@ class Playback : public IPlayback, public async::Asyncable, public Contextable async::Promise initPlayback() override; void deinitPlayback() override; - // 2. Setup tracks for Sequence + // 2. Setup tracks async::Promise trackIdList() const override; async::Promise > trackName(const TrackId trackId) const override; @@ -83,10 +83,10 @@ class Playback : public IPlayback, public async::Asyncable, public Contextable void clearCache(const TrackId trackId) const override; void clearSources() override; - // 3. Play Sequence + // 3. Play IPlayerPtr player() const override; - // 4. Adjust a Sequence output + // 4. Adjust output async::Promise outputParams(const TrackId trackId) const override; void setOutputParams(const TrackId trackId, const AudioOutputParams& params) override; async::Channel outputParamsChanged() const override; @@ -115,7 +115,7 @@ class Playback : public IPlayback, public async::Asyncable, public Contextable async::Channel m_outputParamsChanged; async::Channel m_masterOutputParamsChanged; - mutable std::map m_saveSoundTrackProgressChannels; + mutable bool m_saveSoundTrackProgressStreamInited = false; async::Channel m_saveSoundTrackProgressStream; mutable rpc::StreamId m_saveSoundTrackProgressStreamId = 0; }; diff --git a/src/framework/audio/main/iplayback.h b/src/framework/audio/main/iplayback.h index 2c28a735a755d..da7ec11ada951 100644 --- a/src/framework/audio/main/iplayback.h +++ b/src/framework/audio/main/iplayback.h @@ -55,7 +55,7 @@ class IPlayback : MODULE_CONTEXT_INTERFACE virtual async::Promise initPlayback() = 0; virtual void deinitPlayback() = 0; - // 2. Setup tracks for Sequence + // 2. Setup tracks virtual async::Promise trackIdList() const = 0; virtual async::Promise > trackName(const TrackId trackId) const = 0; @@ -83,10 +83,10 @@ class IPlayback : MODULE_CONTEXT_INTERFACE virtual void clearCache(const TrackId trackId) const = 0; virtual void clearSources() = 0; - // 3. Play Sequence + // 3. Play virtual std::shared_ptr player() const = 0; - // 4. Adjust a Sequence output + // 4. Adjust output virtual async::Promise outputParams(const TrackId trackId) const = 0; virtual void setOutputParams(const TrackId trackId, const AudioOutputParams& params) = 0; virtual async::Channel outputParamsChanged() const = 0;