Audacity 3.2.0
AudioIOBase.h
Go to the documentation of this file.
1/**********************************************************************
2
3Audacity: A Digital Audio Editor
4
5AudioIOBase.h
6
7Paul Licameli split from AudioIO.h
8
9**********************************************************************/
10
11#ifndef __AUDACITY_AUDIO_IO_BASE__
12#define __AUDACITY_AUDIO_IO_BASE__
13
14#include <atomic>
15#include <cfloat>
16#include <chrono>
17#include <functional>
18#include <optional>
19#include <vector>
20#include <wx/string.h>
21#include "MemoryX.h"
22
23struct PaDeviceInfo;
24typedef void PaStream;
25
26#if USE_PORTMIXER
27typedef void PxMixer;
28#endif
29
30class AudioIOBase;
31
32class AudacityProject;
33class AudioIOListener;
34class BoundedEnvelope;
35class Meter;
36using PRCrossfadeData = std::vector< std::vector < float > >;
37
38#define BAD_STREAM_TIME (-DBL_MAX)
39
40class PlaybackPolicy;
41
42// To avoid growing the argument list of StartStream, add fields here
44{
45 explicit
47 const std::shared_ptr<AudacityProject> &pProject = {},
48 double rate_ = 44100.0
49 ) : pProject{ pProject }
50 , rate(rate_)
51 {}
52
53 std::shared_ptr<AudacityProject> pProject;
54 std::weak_ptr<Meter> captureMeter, playbackMeter;
55 const BoundedEnvelope *envelope{}; // for time warping
56 std::shared_ptr< AudioIOListener > listener;
57 double rate;
58 mutable std::optional<double> pStartTime;
59 double preRoll{ 0.0 };
60
61 bool playNonWaveTracks{ true };
62
63 // contents may get swapped with empty vector
65
66 // An unfortunate thing needed just to make scrubbing work on Linux when
67 // we can't use a separate polling thread.
68 // The return value is duration to sleep before calling again
69 std::function< std::chrono::milliseconds() > playbackStreamPrimer;
70
71 using PolicyFactory = std::function<
72 std::unique_ptr<PlaybackPolicy>(const AudioIOStartStreamOptions&) >;
74
75 bool loopEnabled{ false };
76 bool variableSpeed{ false };
77};
78
80 wxString filename; // For crash report bundle
81 wxString text; // One big string, may be localized
82 wxString description; // Non-localized short description
83};
84
86class AUDIO_DEVICES_API AudioIOExtBase
87{
88public:
89 virtual ~AudioIOExtBase();
90
91 // Formerly in AudioIOBase
92 virtual bool IsOtherStreamActive() const = 0;
93
95 virtual AudioIODiagnostics Dump() const = 0;
96};
97
100class AUDIO_DEVICES_API AudioIOBase /* not final */
101 : public NonInterferingBase
102{
103public:
104 static AudioIOBase *Get();
105
107 virtual ~AudioIOBase();
108
109 AudioIOBase(const AudioIOBase &) = delete;
111
112 void SetCaptureMeter(
113 const std::shared_ptr<AudacityProject> &project, const std::weak_ptr<Meter> &meter);
114 void SetPlaybackMeter(
115 const std::shared_ptr<AudacityProject> &project, const std::weak_ptr<Meter> &meter);
116
125 void HandleDeviceChange();
126
139 static std::vector<long> GetSupportedPlaybackRates(int DevIndex = -1,
140 double rate = 0.0);
141
154 static std::vector<long> GetSupportedCaptureRates(int devIndex = -1,
155 double rate = 0.0);
156
171 static std::vector<long> GetSupportedSampleRates(int playDevice = -1,
172 int recDevice = -1,
173 double rate = 0.0);
174
183 static int GetOptimalSupportedSampleRate();
184
189 static const int StandardRates[];
191 static const int NumStandardRates;
192
196 wxString GetDeviceInfo() const;
197
199 std::vector<AudioIODiagnostics> GetAllDeviceInfo();
200
202 bool IsPaused() const;
203
204 virtual void StopStream() = 0;
205
210 bool IsBusy() const;
211
218 bool IsStreamActive() const;
219 bool IsStreamActive(int token) const;
220
226 bool IsAudioTokenActive(int token) const;
227
230 bool IsMonitoring() const;
231
232 /* Mixer services are always available. If no stream is running, these
233 * methods use whatever device is specified by the preferences. If a
234 * stream *is* running, naturally they manipulate the mixer associated
235 * with that stream. If no mixer is available, output is emulated and
236 * input is stuck at 1.0f (a gain is applied to output samples).
237 */
238 void SetMixer(int inputSource);
239
240protected:
241 static std::unique_ptr<AudioIOBase> ugAudioIO;
242 static wxString DeviceName(const PaDeviceInfo* info);
243 static wxString HostName(const PaDeviceInfo* info);
244
245 std::weak_ptr<AudacityProject> mOwningProject;
246
248 std::atomic<bool> mPaused{ false };
249
251 int mStreamToken{ 0 };
252
254
255 double mRate;
256
258
259 std::weak_ptr<Meter> mInputMeter{};
260 std::weak_ptr<Meter> mOutputMeter{};
261
262 #if USE_PORTMIXER
263 PxMixer *mPortMixer;
264 float mPreviousHWPlaythrough;
265 #endif /* USE_PORTMIXER */
266
275
276 // For cacheing supported sample rates
278 static std::vector<long> mCachedPlaybackRates;
280 static std::vector<long> mCachedCaptureRates;
281 static std::vector<long> mCachedSampleRates;
282 static double mCachedBestRateIn;
283
284protected:
292 static int getRecordDevIndex(const wxString &devName = {});
293
298#if USE_PORTMIXER
299 static int getRecordSourceIndex(PxMixer *portMixer);
300#endif
301
309 static int getPlayDevIndex(const wxString &devName = {});
310
315 static const int RatesToTry[];
317 static const int NumRatesToTry;
318
322 std::vector<std::unique_ptr<AudioIOExtBase>> mAudioIOExt;
323};
324
325#include "Prefs.h"
326
327extern AUDIO_DEVICES_API StringSetting AudioIOHost;
328extern AUDIO_DEVICES_API DoubleSetting AudioIOLatencyCorrection;
329extern AUDIO_DEVICES_API DoubleSetting AudioIOLatencyDuration;
330extern AUDIO_DEVICES_API StringSetting AudioIOPlaybackDevice;
331extern AUDIO_DEVICES_API StringSetting AudioIOPlaybackSource;
332extern AUDIO_DEVICES_API DoubleSetting AudioIOPlaybackVolume;
333extern AUDIO_DEVICES_API IntSetting AudioIORecordChannels;
334extern AUDIO_DEVICES_API StringSetting AudioIORecordingDevice;
335extern AUDIO_DEVICES_API StringSetting AudioIORecordingSource;
336extern AUDIO_DEVICES_API IntSetting AudioIORecordingSourceIndex;
337
338#endif
void PaStream
Definition: AudioIOBase.h:23
AUDIO_DEVICES_API IntSetting AudioIORecordChannels
AUDIO_DEVICES_API DoubleSetting AudioIOLatencyCorrection
AUDIO_DEVICES_API StringSetting AudioIOHost
AUDIO_DEVICES_API StringSetting AudioIORecordingSource
AUDIO_DEVICES_API StringSetting AudioIOPlaybackSource
AUDIO_DEVICES_API DoubleSetting AudioIOLatencyDuration
AUDIO_DEVICES_API StringSetting AudioIOPlaybackDevice
AUDIO_DEVICES_API DoubleSetting AudioIOPlaybackVolume
AUDIO_DEVICES_API StringSetting AudioIORecordingDevice
std::vector< std::vector< float > > PRCrossfadeData
Definition: AudioIOBase.h:36
AUDIO_DEVICES_API IntSetting AudioIORecordingSourceIndex
const auto project
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
Definition: Project.h:90
A singleton object supporting queries of the state of any active audio streams, and audio device capa...
Definition: AudioIOBase.h:102
PaStream * mPortStreamV19
Definition: AudioIOBase.h:257
static std::vector< long > mCachedSampleRates
Definition: AudioIOBase.h:281
double mRate
Audio playback rate in samples per second.
Definition: AudioIOBase.h:255
static int mCachedCaptureIndex
Definition: AudioIOBase.h:279
AudioIOBase & operator=(const AudioIOBase &)=delete
virtual ~AudioIOBase()
static std::unique_ptr< AudioIOBase > ugAudioIO
Definition: AudioIOBase.h:241
std::vector< std::unique_ptr< AudioIOExtBase > > mAudioIOExt
Definition: AudioIOBase.h:322
static double mCachedBestRateIn
Definition: AudioIOBase.h:282
virtual void StopStream()=0
AudioIOBase(const AudioIOBase &)=delete
static std::vector< long > mCachedCaptureRates
Definition: AudioIOBase.h:280
std::weak_ptr< AudacityProject > mOwningProject
Definition: AudioIOBase.h:245
bool mInputMixerWorks
Can we control the hardware input level?
Definition: AudioIOBase.h:274
static const int NumRatesToTry
How many sample rates to try.
Definition: AudioIOBase.h:317
static const int NumStandardRates
How many standard sample rates there are.
Definition: AudioIOBase.h:191
static std::vector< long > mCachedPlaybackRates
Definition: AudioIOBase.h:278
static int mCachedPlaybackIndex
Definition: AudioIOBase.h:277
Abstract interface to alternative, concurrent playback with the main audio (such as MIDI events)
Definition: AudioIOBase.h:87
virtual bool IsOtherStreamActive() const =0
virtual AudioIODiagnostics Dump() const =0
Get diagnostic information for audio devices and also for extensions.
virtual ~AudioIOExtBase()
Monitors record play start/stop and new sample blocks. Has callbacks for these events.
Specialization of Setting for double.
Definition: Prefs.h:363
Specialization of Setting for int.
Definition: Prefs.h:356
AudioIO uses this to send sample buffers for real-time display updates.
Definition: Meter.h:16
Directs which parts of tracks to fetch for playback.
Specialization of Setting for strings.
Definition: Prefs.h:370
Services * Get()
Fetch the global instance, or nullptr if none is yet installed.
Definition: BasicUI.cpp:196
wxString description
Definition: AudioIOBase.h:82
struct holding stream options, including a pointer to the time warp info and AudioIOListener and whet...
Definition: AudioIOBase.h:44
std::function< std::chrono::milliseconds() > playbackStreamPrimer
Definition: AudioIOBase.h:69
PolicyFactory policyFactory
Definition: AudioIOBase.h:73
std::shared_ptr< AudacityProject > pProject
Definition: AudioIOBase.h:53
std::weak_ptr< Meter > captureMeter
Definition: AudioIOBase.h:54
std::weak_ptr< Meter > playbackMeter
Definition: AudioIOBase.h:54
AudioIOStartStreamOptions(const std::shared_ptr< AudacityProject > &pProject={}, double rate_=44100.0)
Definition: AudioIOBase.h:46
PRCrossfadeData * pCrossfadeData
Definition: AudioIOBase.h:64
const BoundedEnvelope * envelope
Definition: AudioIOBase.h:55
std::function< std::unique_ptr< PlaybackPolicy >(const AudioIOStartStreamOptions &) > PolicyFactory
Definition: AudioIOBase.h:72
std::optional< double > pStartTime
Definition: AudioIOBase.h:58
std::shared_ptr< AudioIOListener > listener
Definition: AudioIOBase.h:56