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 :
23 : #pragma once
24 :
25 : #include "modularity/imoduleinterface.h"
26 : #include "global/types/retval.h"
27 : #include "global/async/channel.h"
28 : #include "global/async/promise.h"
29 :
30 : #include "../common/audiotypes.h"
31 :
32 : namespace muse::io {
33 : class IODevice;
34 : }
35 :
36 : namespace muse::audio {
37 : class ITracks;
38 : class IPlayer;
39 : class IAudioOutput;
40 :
41 : class IPlayback : MODULE_CONTEXT_INTERFACE
42 : {
43 36 : INTERFACE_ID(IPlayback)
44 :
45 : public:
46 14 : virtual ~IPlayback() = default;
47 :
48 : // Init
49 : virtual async::Promise<Ret> init() = 0;
50 : virtual bool isInited() const = 0;
51 : virtual async::Channel<bool> initedChanged() const = 0;
52 : virtual void deinit() = 0;
53 :
54 : // Resources
55 : virtual async::Promise<AudioResourceMetaList> availableInputResources() const = 0;
56 : virtual async::Promise<SoundPresetList> availableSoundPresets(const AudioResourceMeta& resourceMeta) const = 0;
57 : virtual async::Promise<AudioResourceMetaList> availableOutputResources() const = 0;
58 :
59 : // Setup tracks
60 : virtual async::Promise<TrackIdList> trackIdList() const = 0;
61 : virtual async::Promise<RetVal<TrackName> > trackName(const TrackId trackId) const = 0;
62 :
63 : virtual async::Promise<TrackId, TrackParams> addTrack(const TrackName& name, io::IODevice* data, const TrackParams& params) = 0;
64 : virtual async::Promise<TrackId, TrackParams> addTrack(const TrackName& name, const mpe::PlaybackData& data,
65 : const TrackParams& params) = 0;
66 :
67 : virtual async::Promise<TrackId, TrackParams> addAuxTrack(const TrackName& trackName, const TrackParams& params) = 0;
68 :
69 : virtual void removeTrack(const TrackId trackId) = 0;
70 : virtual void removeAllTracks() = 0;
71 :
72 : virtual async::Channel<TrackId> trackAdded() const = 0;
73 : virtual async::Channel<TrackId> trackRemoved() const = 0;
74 :
75 : // Params
76 : // Get all params
77 : virtual async::Promise<TrackParams> params(const TrackId trackId) const = 0;
78 :
79 : // Set some params
80 : virtual void setSourceParams(const TrackId trackId, const AudioSourceParams& params) = 0;
81 : virtual void setControlParams(const TrackId trackId, const ControlParams& params) = 0;
82 : virtual void setFxChainParams(const TrackId trackId, const AudioFxChain& params) = 0;
83 : virtual void setAuxSendsParams(const TrackId trackId, const AuxSendsParams& params) = 0;
84 :
85 : // These parameters can be changed within the audio system.
86 : virtual async::Channel<TrackId, AudioSourceParams> sourceParamsChanged() const = 0;
87 : virtual async::Channel<TrackId, ControlParams> controlParamsChanged() const = 0;
88 : virtual async::Channel<TrackId, AudioFxChain> fxChainParamsChanged() const = 0;
89 : virtual async::Channel<TrackId, AuxSendsParams> auxSendsParamsChanged() const = 0;
90 :
91 : // Same for master
92 : virtual async::Promise<TrackParams> masterParams() const = 0;
93 : virtual void setMasterControlParams(const ControlParams& params) = 0;
94 : virtual void setMasterFxChainParams(const AudioFxChain& params) = 0;
95 : virtual void setMasterAuxSendsParams(const AuxSendsParams& params) = 0;
96 : virtual async::Channel<ControlParams> masterControlParamsChanged() const = 0;
97 : virtual async::Channel<AudioFxChain> masterFxChainParamsChanged() const = 0;
98 : virtual async::Channel<AuxSendsParams> masterAuxSendsParamsChanged() const = 0;
99 :
100 : // Input processing
101 : virtual void processInput(const TrackId trackId) const = 0;
102 : virtual async::Promise<InputProcessingProgress> inputProcessingProgress(const TrackId trackId) const = 0;
103 :
104 : virtual void clearCache(const TrackId trackId) const = 0;
105 : virtual void clearSources() = 0;
106 : virtual void clearMasterOutputParams() = 0;
107 : virtual void clearAllFx() = 0;
108 :
109 : // Play
110 : virtual std::shared_ptr<IPlayer> player() const = 0;
111 :
112 : // Signal changes
113 : virtual async::Promise<AudioSignalChanges> signalChanges(const TrackId trackId) const = 0;
114 : virtual async::Promise<AudioSignalChanges> masterSignalChanges() const = 0;
115 :
116 : // Automation
117 : virtual async::Promise<AutomatedControlParamsChanges> automatedControlParamsChanges(const TrackId trackId) const = 0;
118 :
119 : // Export
120 : virtual async::Promise<bool> saveSoundTrack(const SoundTrackFormat& format, io::IODevice& dstDevice) = 0;
121 : virtual void abortSavingAllSoundTracks() = 0;
122 : virtual SaveSoundTrackProgress saveSoundTrackProgressChanged() const = 0;
123 : };
124 :
125 : using IPlaybackPtr = std::shared_ptr<IPlayback>;
126 : }
|