13#ifndef __AUDACITY_AUDIO_IO__
14#define __AUDACITY_AUDIO_IO__
45 std::vector < std::shared_ptr < const PlayableTrack > >;
52struct PaStreamCallbackTimeInfo;
111 const void *inputBuffer,
void *outputBuffer,
112 unsigned long framesPerBuffer,
113 const PaStreamCallbackTimeInfo *timeInfo,
129 unsigned long framesPerBuffer,
130 const PaStreamCallbackTimeInfo *timeInfo,
145 ? audioIO.mAudioIOExt.
end()
146 : audioIO.mAudioIOExt.
begin() }
150 friend inline
bool operator == (
153 return xx.mIterator == yy.mIterator;
161 std::vector<std::unique_ptr<AudioIOExtBase>>::const_iterator
mIterator;
179 {
return mListener.lock(); }
180 void SetListener(
const std::shared_ptr< AudioIOListener > &listener);
183 int CallbackDoSeek();
186 void CallbackCheckCompletion(
187 int &callbackReturn,
unsigned long len);
192 unsigned CountSoloingTracks();
193 bool TrackShouldBeSilent(
const WaveTrack &wt );
194 bool TrackHasBeenFadedOut(
const WaveTrack &wt );
195 bool AllTracksAlreadySilent();
197 void CheckSoundActivatedRecordingLevel(
199 unsigned long framesPerBuffer
201 void AddToOutputChannel(
unsigned int chan,
202 float * outputMeterFloats,
203 float * outputFloats,
204 const float * tempBuf,
209 bool FillOutputBuffers(
211 unsigned long framesPerBuffer,
212 float *outputMeterFloats
214 void DrainInputBuffers(
216 unsigned long framesPerBuffer,
220 void UpdateTimePosition(
221 unsigned long framesPerBuffer
226 unsigned long framesPerBuffer,
227 float *outputMeterFloats
229 void SendVuInputMeterData(
230 const float *inputSamples,
231 unsigned long framesPerBuffer
233 void SendVuOutputMeterData(
234 const float *outputMeterFloats,
235 unsigned long framesPerBuffer
243 size_t GetCommonlyReadyPlayback();
248#ifdef EXPERIMENTAL_AUTOMATED_INPUT_LEVEL_ADJUSTMENT
251 int mAILATotalAnalysis;
252 int mAILAAnalysisCounter;
254 double mAILAGoalPoint;
255 double mAILAGoalDelta;
256 double mAILAAnalysisTime;
257 double mAILALastStartTime;
258 double mAILAChangeFactor;
259 double mAILATopLevel;
260 double mAILAAnalysisEndTime;
261 double mAILAAbsolutStartTime;
262 unsigned short mAILALastChangeType;
266 std::atomic<bool> mFinishAudioThread{
false };
280 std::atomic<float> mMixerOutputVol{ 1.0 };
308 unsigned long long mLostSamples{ 0 };
316 void StartAudioThreadAndWait();
317 void StopAudioThreadAndWait();
322 void StartAudioThread();
323 void WaitForAudioThreadStarted();
324 void StopAudioThread();
325 void WaitForAudioThreadStopped();
327 void ProcessOnceAndWait( std::chrono::milliseconds sleepTime = std::chrono::milliseconds(50) );
331 std::atomic<bool> mForceFadeOut{
false };
342 return mMixerOutputVol.load(std::memory_order_relaxed); }
344 mMixerOutputVol.store(value, std::memory_order_relaxed); }
351 bool mUsingAlsa {
false };
365 wxAtomicInt mRecordingException {};
367 { wxAtomicInc( mRecordingException ); }
369 {
if (mRecordingException) wxAtomicDec( mRecordingException ); }
373 bool mDetectDropouts{
true };
378 {
return mLostCaptureIntervals; }
381 bool mSimulateRecordingErrors{
false };
385 std::atomic<bool> mDetectUpstreamDropouts{
true };
423 std::shared_ptr<RealtimeEffectState>
428 Track *pTrack,
const std::shared_ptr<RealtimeEffectState> &pState);
449 double t0,
double t1,
470 wxString LastPaErrorString();
474 {
return mOwningProject.lock(); }
477 void SetPaused(
bool state);
485 void SetMixer(
int inputSource,
float inputVolume,
486 float playbackVolume);
487 void GetMixer(
int *inputSource,
float *inputVolume,
488 float *playbackVolume);
495 bool InputMixerWorks();
501 wxArrayString GetInputSourceNames();
508 bool IsCapturing()
const;
518 #ifdef EXPERIMENTAL_AUTOMATED_INPUT_LEVEL_ADJUSTMENT
519 void AILAInitialize();
522 void AILAProcess(
double maxPeak);
523 void AILASetStartTime();
524 double AILAGetLastDecisionTime();
539 double GetBestRate(
bool capturing,
bool playing,
double sampleRate);
547 double GetStreamTime();
549 static void AudioThread(std::atomic<bool> &finish);
552 static void Deinit();
556 void DelayActions(
bool recording);
560 bool DelayingActions()
const;
577 unsigned int numPlaybackChannels,
578 unsigned int numCaptureChannels,
581 void SetOwningProject(
const std::shared_ptr<AudacityProject> &pProject );
582 void ResetOwningProject();
590 void TrackBufferExchange();
593 void FillPlayBuffers();
594 void TransformPlayBuffers(
595 std::optional<RealtimeEffects::ProcessingScope> &
scope);
598 void DrainRecordBuffers();
605 size_t GetCommonlyFreePlayback();
613 size_t GetCommonlyAvailCapture();
620 bool AllocateBuffers(
622 const TransportTracks &tracks,
double t0,
double t1,
double sampleRate );
627 void StartStreamCleanup(
bool bOnlyBuffers =
false);
632 bool mDelayingActions{
false };
int audacityAudioCallback(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, void *userData)
std::vector< std::shared_ptr< WaveTrack > > WaveTrackArray
bool ValidateDeviceNames()
unsigned long PaStreamCallbackFlags
std::vector< std::shared_ptr< const WaveTrack > > WaveTrackConstArray
std::vector< std::shared_ptr< const PlayableTrack > > PlayableTrackConstArray
static TransactionScope::Factory::Scope scope
Vector operator*(const Vector &left, const Vector &right)
Generalized interface for discovery of plug-ins for one protocol.
Memory.h template class for making an array of float, bool, etc.
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
A singleton object supporting queries of the state of any active audio streams, and audio device capa...
std::vector< std::unique_ptr< AudioIOExtBase > > mAudioIOExt
static AudioIOBase * Get()
virtual void StopStream()=0
void SetMixer(int inputSource)
AudioIO uses the PortAudio library to play and record sound.
std::shared_ptr< AudacityProject > GetOwningProject() const
std::mutex mPostRecordingActionMutex
PostRecordingAction mPostRecordingAction
unsigned GetNumCaptureChannels() const
void SeekStream(double seconds)
Move the playback / recording position of the current stream by the specified amount from where it is...
sampleFormat GetCaptureFormat()
wxLongLong GetLastPlaybackTime() const
std::function< void()> PostRecordingAction
unsigned GetNumPlaybackChannels() const
std::vector< std::unique_ptr< AudioIOExtBase > >::const_iterator mIterator
ptrdiff_t difference_type
AudioIOExtIterator(AudioIoCallback &audioIO, bool end)
std::forward_iterator_tag iterator_category
AudioIoCallback is a class that implements the callback required by PortAudio. The callback needs to ...
static int mNextStreamToken
std::shared_ptr< AudioIOListener > GetListener() const
std::unique_ptr< TransportState > mpTransportState
Holds some state for duration of playback or recording.
const std::vector< std::pair< double, double > > & LostCaptureIntervals()
wxMutex mSuspendAudioThread
AudioIOExtRange Extensions()
float GetMixerOutputVol()
PlaybackSchedule mPlaybackSchedule
std::vector< float * > mScratchPointers
pointing into mScratchBuffers
std::atomic< Acknowledge > mAudioThreadAcknowledge
size_t mPlaybackSamplesToCopy
Preferred batch size for replenishing the playback RingBuffer.
std::atomic< bool > mAudioThreadTrackBufferExchangeLoopRunning
static double mCachedBestRateOut
std::vector< std::unique_ptr< Mixer > > mPlaybackMixers
PlaybackPolicy::Duration mPlaybackRingBufferSecs
std::atomic< bool > mAudioThreadTrackBufferExchangeLoopActive
void ClearRecordingException()
long mNumPauseFrames
How many frames of zeros were output due to pauses?
unsigned int mNumPlaybackChannels
void SetRecordingException()
std::atomic< bool > mAudioThreadShouldCallTrackBufferExchangeOnce
wxLongLong mLastPlaybackTimeMillis
WaveTrackArray mPlaybackTracks
static bool mCachedBestRatePlaying
bool mSoftwarePlaythrough
ArrayOf< std::unique_ptr< RingBuffer > > mCaptureBuffers
WaveTrackArray mCaptureTracks
unsigned long mMaxFramesOutput
double mLastRecordingOffset
Not (yet) used; should perhaps be atomic when it is.
size_t mPlaybackQueueMinimum
Occupancy of the queue we try to maintain, with bigger batches if needed.
std::weak_ptr< AudioIOListener > mListener
ArrayOf< std::unique_ptr< Resample > > mResample
double mCaptureRingBufferSecs
unsigned int mNumCaptureChannels
void SetMixerOutputVol(float value)
std::vector< std::pair< double, double > > mLostCaptureIntervals
bool mPauseRec
True if Sound Activated Recording is enabled.
ArrayOf< std::unique_ptr< RingBuffer > > mPlaybackBuffers
double mMinCaptureSecsToCopy
std::vector< SampleBuffer > mScratchBuffers
static bool mCachedBestRateCapturing
sampleFormat mCaptureFormat
Functions for doing the mixdown of the tracks.
An object that sends messages to an open-ended list of subscribed callbacks.
AudioTrack subclass that can also be audibly replayed by the program.
std::chrono::duration< double > Duration
Brackets one block of processing in one thread.
Brackets one suspension of processing in the main thread.
Holds streamed audio samples.
Abstract base class for an object holding data associated with points on a time axis.
A Track that contains audio waveform data.
auto end(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
auto begin(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
enum AudioIOEvent::Type type
AudacityProject * pProject
struct holding stream options, including a pointer to the time warp info and AudioIOListener and whet...
AudioIOExtIterator begin() const
AudioIOExtIterator end() const
AudioIOExtIterator second
PlayableTrackConstArray otherPlayableTracks
WaveTrackConstArray prerollTracks
WaveTrackArray captureTracks
WaveTrackArray playbackTracks