/********************************************************************** Audacity: A Digital Audio Editor ProjectAudioManager.h Paul Licameli split from ProjectManager.h **********************************************************************/ #ifndef __AUDACITY_PROJECT_AUDIO_MANAGER__ #define __AUDACITY_PROJECT_AUDIO_MANAGER__ #include #include #include "AudioIOListener.h" // to inherit #include "ClientData.h" // to inherit class AudacityProject; 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 ProjectAudioManager final : public ClientData::Base , public AudioIOListener , public std::enable_shared_from_this< ProjectAudioManager > { public: static ProjectAudioManager &Get( AudacityProject &project ); static const ProjectAudioManager &Get( const AudacityProject &project ); // Find suitable tracks to record into, or return an empty array. static WaveTrackArray ChooseExistingRecordingTracks( AudacityProject &proj, bool selectedOnly); static bool UseDuplex(); static TransportTracks GetAllPlaybackTracks( TrackList &trackList, bool selectedOnly, bool useMidi = false); explicit ProjectAudioManager( AudacityProject &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(AudacityProject &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 OnAudioIONewBlockFiles(const AutoSaveFile & blockFileLog) override; void OnCommitRecording() override; void OnSoundActivationThreshold() override; AudacityProject &mProject; std::shared_ptr 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< std::vector< wxString >, unsigned > StatusWidthFunction( const AudacityProject &project, StatusBarField field); }; AudioIOStartStreamOptions DefaultPlayOptions( AudacityProject &project ); AudioIOStartStreamOptions DefaultSpeedPlayOptions( AudacityProject &project ); #include "commands/CommandFlag.h" extern const ReservedCommandFlag CanStopAudioStreamFlag; #endif