forked from Sneeds-Feed-and-Seed/sneedacity
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProjectAudioManager.h
186 lines (134 loc) · 5.6 KB
/
ProjectAudioManager.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
/**********************************************************************
Sneedacity: A Digital Audio Editor
ProjectAudioManager.h
Paul Licameli split from ProjectManager.h
**********************************************************************/
#ifndef __SNEEDACITY_PROJECT_AUDIO_MANAGER__
#define __SNEEDACITY_PROJECT_AUDIO_MANAGER__
#include <memory>
#include <vector>
#include "AudioIOListener.h" // to inherit
#include "ClientData.h" // to inherit
constexpr int RATE_NOT_SELECTED{ -1 };
class SneedacityProject;
struct AudioIOStartStreamOptions;
class TrackList;
class SelectedRegion;
class WaveTrack;
using WaveTrackArray = std::vector < std::shared_ptr < WaveTrack > >;
enum class PlayMode : int {
normalPlay,
oneSecondPlay, // Disables auto-scrolling
loopedPlay, // Disables auto-scrolling
cutPreviewPlay
};
struct TransportTracks;
enum StatusBarField : int;
class SNEEDACITY_DLL_API ProjectAudioManager final
: public ClientData::Base
, public AudioIOListener
, public std::enable_shared_from_this< ProjectAudioManager >
{
public:
static ProjectAudioManager &Get( SneedacityProject &project );
static const ProjectAudioManager &Get( const SneedacityProject &project );
// Find suitable tracks to record into, or return an empty array.
static WaveTrackArray ChooseExistingRecordingTracks(
SneedacityProject &proj, bool selectedOnly,
double targetRate = RATE_NOT_SELECTED);
static bool UseDuplex();
static TransportTracks GetAllPlaybackTracks(
TrackList &trackList, bool selectedOnly, bool useMidi = false);
explicit ProjectAudioManager( SneedacityProject &project );
ProjectAudioManager( const ProjectAudioManager & ) PROHIBITED;
ProjectAudioManager &operator=( const ProjectAudioManager & ) PROHIBITED;
~ProjectAudioManager() override;
bool IsTimerRecordCancelled() { return mTimerRecordCanceled; }
void SetTimerRecordCancelled() { mTimerRecordCanceled = true; }
void ResetTimerRecordCancelled() { mTimerRecordCanceled = false; }
bool Paused() const { return mPaused; }
bool Playing() const;
// Whether recording into this project (not just into some project) is
// active
bool Recording() const;
bool Stopping() const { return mStopping; }
// Whether the last attempt to start recording requested appending to tracks
bool Appending() const { return mAppending; }
bool Looping() const { return mLooping; }
bool Cutting() const { return mCutting; }
// A project is only allowed to stop an audio stream that it owns.
bool CanStopAudioStream () const;
void OnRecord(bool altAppearance);
bool DoRecord(SneedacityProject &project,
const TransportTracks &transportTracks, // If captureTracks is empty, then tracks are created
double t0, double t1,
bool altAppearance,
const AudioIOStartStreamOptions &options);
int PlayPlayRegion(const SelectedRegion &selectedRegion,
const AudioIOStartStreamOptions &options,
PlayMode playMode,
bool backwards = false,
// Allow t0 and t1 to be beyond end of tracks
bool playWhiteSpace = false);
// Play currently selected region, or if nothing selected,
// play from current cursor.
void PlayCurrentRegion(bool looped = false, bool cutpreview = false);
void OnPause();
// Pause - used by AudioIO to pause sound activate recording
void Pause();
// Stop playing or recording
void Stop(bool stopStream = true);
void StopIfPaused();
bool DoPlayStopSelect( bool click, bool shift );
void DoPlayStopSelect( );
PlayMode GetLastPlayMode() const { return mLastPlayMode; }
private:
void SetPaused( bool value ) { mPaused = value; }
void SetAppending( bool value ) { mAppending = value; }
void SetLooping( bool value ) { mLooping = value; }
void SetCutting( bool value ) { mCutting = value; }
void SetStopping( bool value ) { mStopping = value; }
void SetupCutPreviewTracks(double playStart, double cutStart,
double cutEnd, double playEnd);
void ClearCutPreviewTracks();
// Cancel the addition of temporary recording tracks into the project
void CancelRecording();
// Audio IO callback methods
void OnAudioIORate(int rate) override;
void OnAudioIOStartRecording() override;
void OnAudioIOStopRecording() override;
void OnAudioIONewBlocks(const WaveTrackArray *tracks) override;
void OnCommitRecording() override;
void OnSoundActivationThreshold() override;
void OnCheckpointFailure(wxCommandEvent &evt);
SneedacityProject &mProject;
std::shared_ptr<TrackList> mCutPreviewTracks;
PlayMode mLastPlayMode{ PlayMode::normalPlay };
//flag for cancellation of timer record.
bool mTimerRecordCanceled{ false };
bool mPaused{ false };
bool mAppending{ false };
bool mLooping{ false };
bool mCutting{ false };
bool mStopping{ false };
int mDisplayedRate{ 0 };
static std::pair< TranslatableStrings, unsigned >
StatusWidthFunction(
const SneedacityProject &project, StatusBarField field);
};
SNEEDACITY_DLL_API
AudioIOStartStreamOptions DefaultPlayOptions( SneedacityProject &project );
SNEEDACITY_DLL_API
AudioIOStartStreamOptions DefaultSpeedPlayOptions( SneedacityProject &project );
struct PropertiesOfSelected
{
bool allSameRate{ false };
int rateOfSelected{ RATE_NOT_SELECTED };
int numberOfSelected{ 0 };
};
SNEEDACITY_DLL_API
PropertiesOfSelected GetPropertiesOfSelected(const SneedacityProject &proj);
#include "commands/CommandFlag.h"
extern SNEEDACITY_DLL_API const ReservedCommandFlag
&CanStopAudioStreamFlag();
#endif