Line data Source code
1 : /*
2 : * SPDX-License-Identifier: GPL-3.0-only
3 : * MuseScore-CLA-applies
4 : *
5 : * MuseScore Studio
6 : * Music Composition & Notation
7 : *
8 : * Copyright (C) 2021 MuseScore Limited and others
9 : *
10 : * This program is free software: you can redistribute it and/or modify
11 : * it under the terms of the GNU General Public License version 3 as
12 : * published by the Free Software Foundation.
13 : *
14 : * This program is distributed in the hope that it will be useful,
15 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 : * GNU General Public License for more details.
18 : *
19 : * You should have received a copy of the GNU General Public License
20 : * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 : */
22 : #pragma once
23 :
24 : #include "../iplayback.h"
25 : #include "global/async/asyncable.h"
26 : #include "global/types/retval.h"
27 :
28 : #include "modularity/ioc.h"
29 : #include "audio/common/rpc/irpcchannel.h"
30 : #include "../istartaudiocontroller.h"
31 :
32 : #include "../iplayer.h"
33 :
34 : namespace muse::audio {
35 : class Player;
36 :
37 : //! NOTE It may not use contextual services,
38 : // but the playback itself is contextual,
39 : // because each context (window) has its own playback.
40 : class Playback : public IPlayback, public async::Asyncable, public Contextable
41 : {
42 : GlobalInject<IStartAudioController> startAudioController;
43 : GlobalInject<rpc::IRpcChannel> channel;
44 :
45 : public:
46 5 : Playback(const muse::modularity::ContextPtr& ctx)
47 5 : : Contextable(ctx) {}
48 : ~Playback() override;
49 :
50 : // Init
51 : async::Promise<Ret> init() override;
52 : bool isInited() const override;
53 : async::Channel<bool> initedChanged() const override;
54 : void deinit() override;
55 :
56 : // Resources
57 : async::Promise<AudioResourceMetaList> availableInputResources() const override;
58 : async::Promise<SoundPresetList> availableSoundPresets(const AudioResourceMeta& resourceMeta) const override;
59 : async::Promise<AudioResourceMetaList> availableOutputResources() const override;
60 :
61 : // Setup tracks
62 : async::Promise<TrackIdList> trackIdList() const override;
63 : async::Promise<RetVal<TrackName> > trackName(const TrackId trackId) const override;
64 :
65 : async::Promise<TrackId, TrackParams> addTrack(const TrackName& name, io::IODevice* data, const TrackParams& params) override;
66 : async::Promise<TrackId, TrackParams> addTrack(const TrackName& name, const mpe::PlaybackData& data, const TrackParams& params) override;
67 : async::Promise<TrackId, TrackParams> addAuxTrack(const TrackName& name, const TrackParams& params) override;
68 :
69 : void removeTrack(const TrackId trackId) override;
70 : void removeAllTracks() override;
71 :
72 : async::Channel<TrackId> trackAdded() const override;
73 : async::Channel<TrackId> trackRemoved() const override;
74 :
75 : // Params
76 : // Get all params
77 : async::Promise<TrackParams> params(const TrackId trackId) const override;
78 :
79 : // Set some params
80 : void setSourceParams(const TrackId trackId, const AudioSourceParams& params) override;
81 : void setControlParams(const TrackId trackId, const ControlParams& params) override;
82 : void setFxChainParams(const TrackId trackId, const AudioFxChain& params) override;
83 : void setAuxSendsParams(const TrackId trackId, const AuxSendsParams& params) override;
84 :
85 : // These parameters can be changed within the audio system.
86 : async::Channel<TrackId, AudioSourceParams> sourceParamsChanged() const override;
87 : async::Channel<TrackId, ControlParams> controlParamsChanged() const override;
88 : async::Channel<TrackId, AudioFxChain> fxChainParamsChanged() const override;
89 : async::Channel<TrackId, AuxSendsParams> auxSendsParamsChanged() const override;
90 :
91 : // Same for master
92 : async::Promise<TrackParams> masterParams() const override;
93 : void setMasterControlParams(const ControlParams& params) override;
94 : void setMasterFxChainParams(const AudioFxChain& params) override;
95 : void setMasterAuxSendsParams(const AuxSendsParams& params) override;
96 : async::Channel<ControlParams> masterControlParamsChanged() const override;
97 : async::Channel<AudioFxChain> masterFxChainParamsChanged() const override;
98 : async::Channel<AuxSendsParams> masterAuxSendsParamsChanged() const override;
99 :
100 : // Input processing
101 : void processInput(const TrackId trackId) const override;
102 : async::Promise<InputProcessingProgress> inputProcessingProgress(const TrackId trackId) const override;
103 :
104 : // Clear cache
105 : void clearCache(const TrackId trackId) const override;
106 : void clearSources() override;
107 : void clearMasterOutputParams() override;
108 : void clearAllFx() override;
109 :
110 : // Play
111 : IPlayerPtr player() const override;
112 :
113 : // Signal changes
114 : async::Promise<AudioSignalChanges> signalChanges(const TrackId trackId) const override;
115 : async::Promise<AudioSignalChanges> masterSignalChanges() const override;
116 :
117 : // Automation
118 : async::Promise<AutomatedControlParamsChanges> automatedControlParamsChanges(const TrackId trackId) const override;
119 :
120 : // Export
121 : async::Promise<bool> saveSoundTrack(const SoundTrackFormat& format, io::IODevice& dstDevice) override;
122 : void abortSavingAllSoundTracks() override;
123 : SaveSoundTrackProgress saveSoundTrackProgressChanged() const override;
124 :
125 : private:
126 :
127 : rpc::CtxId ctxId() const;
128 :
129 : void addTrackStream(TrackId trackId, rpc::StreamId streamId) const;
130 : void removeTrackStreams(TrackId trackId) const;
131 :
132 : ValCh<bool> m_inited;
133 :
134 : async::Channel<TrackId> m_trackAdded;
135 : async::Channel<TrackId> m_trackRemoved;
136 : async::Channel<TrackId, AudioSourceParams> m_sourceParamsChanged;
137 : async::Channel<TrackId, ControlParams> m_controlParamsChanged;
138 : async::Channel<TrackId, AudioFxChain> m_fxChainParamsChanged;
139 : async::Channel<TrackId, AuxSendsParams> m_auxSendsParamsChanged;
140 : async::Channel<ControlParams> m_masterControlParamsChanged;
141 : async::Channel<AudioFxChain> m_masterFxChainParamsChanged;
142 : async::Channel<AuxSendsParams> m_masterAuxSendsParamsChanged;
143 :
144 : mutable bool m_saveSoundTrackProgressStreamInited = false;
145 : async::Channel<int64_t, int64_t, SaveSoundTrackStage> m_saveSoundTrackProgressStream;
146 : mutable rpc::StreamId m_saveSoundTrackProgressStreamId = 0;
147 :
148 : mutable std::shared_ptr<Player> m_player;
149 :
150 : //! NOTE The receive streams are removed on the track removal, on the deinit all streams of the context are removed by the channel
151 : mutable std::map<TrackId, std::vector<rpc::StreamId> > m_trackStreams;
152 : };
153 : }
|