1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-09-17 16:50:26 +02:00

Move CanStopAudioStream into ProjectAudioManager

This commit is contained in:
Paul Licameli 2019-06-30 15:30:01 -04:00
parent a470ba00b0
commit 977b46cda2
5 changed files with 55 additions and 36 deletions

View File

@ -202,7 +202,7 @@ bool ProjectAudioManager::Playing() const
auto gAudioIO = AudioIO::Get(); auto gAudioIO = AudioIO::Get();
return return
gAudioIO->IsBusy() && gAudioIO->IsBusy() &&
ControlToolBar::Get( mProject ).CanStopAudioStream() && CanStopAudioStream() &&
// ... and not merely monitoring // ... and not merely monitoring
!gAudioIO->IsMonitoring() && !gAudioIO->IsMonitoring() &&
// ... and not punch-and-roll recording // ... and not punch-and-roll recording
@ -214,10 +214,27 @@ bool ProjectAudioManager::Recording() const
auto gAudioIO = AudioIO::Get(); auto gAudioIO = AudioIO::Get();
return return
gAudioIO->IsBusy() && gAudioIO->IsBusy() &&
ControlToolBar::Get( mProject).CanStopAudioStream() && CanStopAudioStream() &&
gAudioIO->GetNumCaptureChannels() > 0; gAudioIO->GetNumCaptureChannels() > 0;
} }
bool ProjectAudioManager::CanStopAudioStream() const
{
auto gAudioIO = AudioIO::Get();
return (!gAudioIO->IsStreamActive() ||
gAudioIO->IsMonitoring() ||
gAudioIO->GetOwningProject() == &mProject );
}
const ReservedCommandFlag
CanStopAudioStreamFlag{
[](const AudacityProject &project){
auto &projectAudioManager = ProjectAudioManager::Get( project );
bool canStop = projectAudioManager.CanStopAudioStream();
return canStop;
}
};
AudioIOStartStreamOptions AudioIOStartStreamOptions
DefaultPlayOptions( AudacityProject &project ) DefaultPlayOptions( AudacityProject &project )
{ {

View File

@ -58,6 +58,9 @@ public:
void SetCutting( bool value ) { mCutting = value; } void SetCutting( bool value ) { mCutting = value; }
void SetStopping( bool value ) { mStopping = value; } void SetStopping( bool value ) { mStopping = value; }
// A project is only allowed to stop an audio stream that it owns.
bool CanStopAudioStream () const;
private: private:
// Audio IO callback methods // Audio IO callback methods
void OnAudioIORate(int rate) override; void OnAudioIORate(int rate) override;
@ -87,6 +90,11 @@ private:
AudioIOStartStreamOptions DefaultPlayOptions( AudacityProject &project ); AudioIOStartStreamOptions DefaultPlayOptions( AudacityProject &project );
AudioIOStartStreamOptions DefaultSpeedPlayOptions( AudacityProject &project ); AudioIOStartStreamOptions DefaultSpeedPlayOptions( AudacityProject &project );
#include "commands/CommandFlag.h"
extern const ReservedCommandFlag
CanStopAudioStreamFlag;
/// Namespace for functions for Transport menu /// Namespace for functions for Transport menu
namespace TransportActions { namespace TransportActions {
void StopIfPaused( AudacityProject &project ); void StopIfPaused( AudacityProject &project );

View File

@ -8,6 +8,7 @@
#include "../Prefs.h" #include "../Prefs.h"
#include "../Project.h" #include "../Project.h"
#include "../ProjectAudioIO.h" #include "../ProjectAudioIO.h"
#include "../ProjectAudioManager.h"
#include "../ProjectHistory.h" #include "../ProjectHistory.h"
#include "../ProjectSelectionManager.h" #include "../ProjectSelectionManager.h"
#include "../ProjectSettings.h" #include "../ProjectSettings.h"

View File

@ -482,6 +482,8 @@ void ControlToolBar::Repaint( wxDC *dc )
void ControlToolBar::EnableDisableButtons() void ControlToolBar::EnableDisableButtons()
{ {
AudacityProject *p = &mProject; AudacityProject *p = &mProject;
auto &projectAudioManager = ProjectAudioManager::Get( mProject );
bool canStop = projectAudioManager.CanStopAudioStream();
bool paused = mPause->IsDown(); bool paused = mPause->IsDown();
bool playing = mPlay->IsDown(); bool playing = mPlay->IsDown();
@ -492,17 +494,17 @@ void ControlToolBar::EnableDisableButtons()
// Only interested in audio type tracks // Only interested in audio type tracks
bool tracks = p && TrackList::Get( *p ).Any<AudioTrack>(); // PRL: PlayableTrack ? bool tracks = p && TrackList::Get( *p ).Any<AudioTrack>(); // PRL: PlayableTrack ?
mPlay->SetEnabled(CanStopAudioStream() && tracks && !recording); mPlay->SetEnabled( canStop && tracks && !recording );
mRecord->SetEnabled( mRecord->SetEnabled(
CanStopAudioStream() && canStop &&
!(busy && !recording && !paused) && !(busy && !recording && !paused) &&
!(playing && !paused) !(playing && !paused)
); );
mStop->SetEnabled(CanStopAudioStream() && (playing || recording)); mStop->SetEnabled(canStop && (playing || recording));
mRewind->SetEnabled(paused || (!playing && !recording)); mRewind->SetEnabled(paused || (!playing && !recording));
mFF->SetEnabled(tracks && (paused || (!playing && !recording))); mFF->SetEnabled(tracks && (paused || (!playing && !recording)));
mPause->SetEnabled(CanStopAudioStream()); mPause->SetEnabled(canStop);
} }
void ControlToolBar::SetPlay(bool down, PlayAppearance appearance) void ControlToolBar::SetPlay(bool down, PlayAppearance appearance)
@ -534,8 +536,9 @@ int ControlToolBar::PlayPlayRegion(const SelectedRegion &selectedRegion,
// STRONG-GUARANTEE (for state of mCutPreviewTracks) // STRONG-GUARANTEE (for state of mCutPreviewTracks)
{ {
auto &projectAudioManager = ProjectAudioManager::Get( mProject ); auto &projectAudioManager = ProjectAudioManager::Get( mProject );
bool canStop = projectAudioManager.CanStopAudioStream();
if (!CanStopAudioStream()) if ( !canStop )
return -1; return -1;
bool useMidi = true; bool useMidi = true;
@ -701,7 +704,10 @@ int ControlToolBar::PlayPlayRegion(const SelectedRegion &selectedRegion,
void ControlToolBar::PlayCurrentRegion(bool looped /* = false */, void ControlToolBar::PlayCurrentRegion(bool looped /* = false */,
bool cutpreview /* = false */) bool cutpreview /* = false */)
{ {
if (!CanStopAudioStream()) auto &projectAudioManager = ProjectAudioManager::Get( mProject );
bool canStop = projectAudioManager.CanStopAudioStream();
if ( !canStop )
return; return;
AudacityProject *p = &mProject; AudacityProject *p = &mProject;
@ -758,8 +764,10 @@ void ControlToolBar::OnKeyEvent(wxKeyEvent & event)
void ControlToolBar::OnPlay(wxCommandEvent & WXUNUSED(evt)) void ControlToolBar::OnPlay(wxCommandEvent & WXUNUSED(evt))
{ {
auto p = &mProject; auto p = &mProject;
auto &projectAudioManager = ProjectAudioManager::Get( mProject );
bool canStop = projectAudioManager.CanStopAudioStream();
if (!CanStopAudioStream()) if ( !canStop )
return; return;
StopPlaying(); StopPlaying();
@ -772,19 +780,14 @@ void ControlToolBar::OnPlay(wxCommandEvent & WXUNUSED(evt))
void ControlToolBar::OnStop(wxCommandEvent & WXUNUSED(evt)) void ControlToolBar::OnStop(wxCommandEvent & WXUNUSED(evt))
{ {
if (CanStopAudioStream()) { auto &projectAudioManager = ProjectAudioManager::Get( mProject );
bool canStop = projectAudioManager.CanStopAudioStream();
if ( canStop ) {
StopPlaying(); StopPlaying();
} }
} }
bool ControlToolBar::CanStopAudioStream() const
{
auto gAudioIO = AudioIO::Get();
return (!gAudioIO->IsStreamActive() ||
gAudioIO->IsMonitoring() ||
gAudioIO->GetOwningProject() == &mProject );
}
void ControlToolBar::PlayDefault() void ControlToolBar::PlayDefault()
{ {
// Let control have precedence over shift // Let control have precedence over shift
@ -798,6 +801,7 @@ void ControlToolBar::StopPlaying(bool stopStream /* = true*/)
{ {
AudacityProject *project = &mProject; AudacityProject *project = &mProject;
auto &projectAudioManager = ProjectAudioManager::Get( mProject ); auto &projectAudioManager = ProjectAudioManager::Get( mProject );
bool canStop = projectAudioManager.CanStopAudioStream();
if(project) { if(project) {
// Let scrubbing code do some appearance change // Let scrubbing code do some appearance change
@ -805,7 +809,7 @@ void ControlToolBar::StopPlaying(bool stopStream /* = true*/)
scrubber.StopScrubbing(); scrubber.StopScrubbing();
} }
if (!CanStopAudioStream()) if ( !canStop )
return; return;
auto gAudioIO = AudioIO::Get(); auto gAudioIO = AudioIO::Get();
@ -860,7 +864,10 @@ void ControlToolBar::StopPlaying(bool stopStream /* = true*/)
void ControlToolBar::Pause() void ControlToolBar::Pause()
{ {
if (!CanStopAudioStream()) { auto &projectAudioManager = ProjectAudioManager::Get( mProject );
bool canStop = projectAudioManager.CanStopAudioStream();
if ( !canStop ) {
auto gAudioIO = AudioIO::Get(); auto gAudioIO = AudioIO::Get();
gAudioIO->SetPaused(!gAudioIO->IsPaused()); gAudioIO->SetPaused(!gAudioIO->IsPaused());
} }
@ -1227,8 +1234,9 @@ bool ControlToolBar::DoRecord(AudacityProject &project,
void ControlToolBar::OnPause(wxCommandEvent & WXUNUSED(evt)) void ControlToolBar::OnPause(wxCommandEvent & WXUNUSED(evt))
{ {
auto &projectAudioManager = ProjectAudioManager::Get( mProject ); auto &projectAudioManager = ProjectAudioManager::Get( mProject );
bool canStop = projectAudioManager.CanStopAudioStream();
if (!CanStopAudioStream()) { if ( !canStop ) {
return; return;
} }
@ -1551,10 +1559,3 @@ static RegisteredToolbarFactory factory{ TransportBarID,
[]( AudacityProject &project ){ []( AudacityProject &project ){
return ToolBar::Holder{ safenew ControlToolBar{ project } }; } return ToolBar::Holder{ safenew ControlToolBar{ project } }; }
}; };
const ReservedCommandFlag
CanStopAudioStreamFlag{
[](const AudacityProject &project){
return ControlToolBar::Get( project ).CanStopAudioStream();
}
};

View File

@ -96,9 +96,6 @@ class ControlToolBar final : public ToolBar {
void SetPlay(bool down, PlayAppearance appearance = PlayAppearance::Straight); void SetPlay(bool down, PlayAppearance appearance = PlayAppearance::Straight);
void SetStop(); void SetStop();
// A project is only allowed to stop an audio stream that it owns.
bool CanStopAudioStream () const;
// Play currently selected region, or if nothing selected, // Play currently selected region, or if nothing selected,
// play from current cursor. // play from current cursor.
void PlayCurrentRegion(bool looped = false, bool cutpreview = false); void PlayCurrentRegion(bool looped = false, bool cutpreview = false);
@ -194,10 +191,5 @@ class ControlToolBar final : public ToolBar {
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
}; };
#include "../commands/CommandFlag.h"
extern const ReservedCommandFlag
CanStopAudioStreamFlag;
#endif #endif