1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-10-26 15:23:48 +01:00

Move members from ControlToolBar into class ProjectAudioManager...

... and ControlToolBar is included in fewer places
This commit is contained in:
Paul Licameli
2019-07-01 12:35:53 -04:00
parent 977b46cda2
commit 13c2e4de0f
14 changed files with 191 additions and 204 deletions

View File

@@ -85,9 +85,6 @@
IMPLEMENT_CLASS(ControlToolBar, ToolBar);
//static
AudacityProject *ControlToolBar::mBusyProject = NULL;
////////////////////////////////////////////////////////////
/// Methods for ControlToolBar
////////////////////////////////////////////////////////////
@@ -528,14 +525,14 @@ void ControlToolBar::SetStop()
EnableDisableButtons();
}
int ControlToolBar::PlayPlayRegion(const SelectedRegion &selectedRegion,
int ProjectAudioManager::PlayPlayRegion(const SelectedRegion &selectedRegion,
const AudioIOStartStreamOptions &options,
PlayMode mode,
bool backwards, /* = false */
bool playWhiteSpace /* = false */)
// STRONG-GUARANTEE (for state of mCutPreviewTracks)
{
auto &projectAudioManager = ProjectAudioManager::Get( mProject );
auto &projectAudioManager = *this;
bool canStop = projectAudioManager.CanStopAudioStream();
if ( !canStop )
@@ -674,7 +671,6 @@ int ControlToolBar::PlayPlayRegion(const SelectedRegion &selectedRegion,
if (token != 0) {
success = true;
ProjectAudioIO::Get( *p ).SetAudioIOToken(token);
mBusyProject = p;
#if defined(EXPERIMENTAL_SEEK_BEHIND_CURSOR)
//AC: If init_seek was set, now's the time to make it happen.
gAudioIO->SeekStream(init_seek);
@@ -686,9 +682,10 @@ int ControlToolBar::PlayPlayRegion(const SelectedRegion &selectedRegion,
// Problem was that the error dialog yields to events,
// causing recursion to this function in the scrub timer
// handler! Easy fix, just delay the user alert instead.
CallAfter( [=]{
auto &window = GetProjectFrame( mProject );
window.CallAfter( [&]{
// Show error message if stream could not be opened
ShowErrorDialog(this, _("Error"),
ShowErrorDialog(&window, _("Error"),
_("Error opening sound device.\nTry changing the audio host, playback device and the project sample rate."),
wxT("Error_opening_sound_device"));
});
@@ -701,10 +698,10 @@ int ControlToolBar::PlayPlayRegion(const SelectedRegion &selectedRegion,
return token;
}
void ControlToolBar::PlayCurrentRegion(bool looped /* = false */,
void ProjectAudioManager::PlayCurrentRegion(bool looped /* = false */,
bool cutpreview /* = false */)
{
auto &projectAudioManager = ProjectAudioManager::Get( mProject );
auto &projectAudioManager = *this;
bool canStop = projectAudioManager.CanStopAudioStream();
if ( !canStop )
@@ -751,10 +748,10 @@ void ControlToolBar::OnKeyEvent(wxKeyEvent & event)
if (event.GetKeyCode() == WXK_SPACE) {
if ( projectAudioManager.Playing() || projectAudioManager.Recording() ) {
SetStop();
StopPlaying();
projectAudioManager.Stop();
}
else if (!gAudioIO->IsBusy()) {
PlayCurrentRegion();
projectAudioManager.PlayCurrentRegion();
}
return;
}
@@ -770,7 +767,7 @@ void ControlToolBar::OnPlay(wxCommandEvent & WXUNUSED(evt))
if ( !canStop )
return;
StopPlaying();
projectAudioManager.Stop();
if (p)
ProjectWindow::Get( *p ).TP_DisplaySelection();
@@ -784,7 +781,7 @@ void ControlToolBar::OnStop(wxCommandEvent & WXUNUSED(evt))
bool canStop = projectAudioManager.CanStopAudioStream();
if ( canStop ) {
StopPlaying();
projectAudioManager.Stop();
}
}
@@ -794,24 +791,24 @@ void ControlToolBar::PlayDefault()
const bool cutPreview = mPlay->WasControlDown();
const bool looped = !cutPreview &&
mPlay->WasShiftDown();
PlayCurrentRegion(looped, cutPreview);
ProjectAudioManager::Get( mProject ).PlayCurrentRegion(looped, cutPreview);
}
void ControlToolBar::StopPlaying(bool stopStream /* = true*/)
void ProjectAudioManager::Stop(bool stopStream /* = true*/)
{
AudacityProject *project = &mProject;
auto &projectAudioManager = ProjectAudioManager::Get( mProject );
auto &projectAudioManager = *this;
bool canStop = projectAudioManager.CanStopAudioStream();
if ( !canStop )
return;
if(project) {
// Let scrubbing code do some appearance change
auto &scrubber = Scrubber::Get( *project );
scrubber.StopScrubbing();
}
if ( !canStop )
return;
auto gAudioIO = AudioIO::Get();
auto cleanup = finally( [&]{
@@ -842,7 +839,6 @@ void ControlToolBar::StopPlaying(bool stopStream /* = true*/)
ClearCutPreviewTracks();
mBusyProject = NULL;
// So that we continue monitoring after playing or recording.
// also clean the MeterQueues
if( project ) {
@@ -862,9 +858,9 @@ void ControlToolBar::StopPlaying(bool stopStream /* = true*/)
toolbar->EnableDisableButtons();
}
void ControlToolBar::Pause()
void ProjectAudioManager::Pause()
{
auto &projectAudioManager = ProjectAudioManager::Get( mProject );
auto &projectAudioManager = *this;
bool canStop = projectAudioManager.CanStopAudioStream();
if ( !canStop ) {
@@ -872,12 +868,11 @@ void ControlToolBar::Pause()
gAudioIO->SetPaused(!gAudioIO->IsPaused());
}
else {
wxCommandEvent dummy;
OnPause(dummy);
OnPause();
}
}
WaveTrackArray ControlToolBar::ChooseExistingRecordingTracks(
WaveTrackArray ProjectAudioManager::ChooseExistingRecordingTracks(
AudacityProject &proj, bool selectedOnly)
{
auto p = &proj;
@@ -958,10 +953,10 @@ void ControlToolBar::OnRecord(wxCommandEvent &evt)
// normally used for buttons.
bool altAppearance = mRecord->WasShiftDown();
OnRecord( altAppearance );
ProjectAudioManager::Get( mProject ).OnRecord( altAppearance );
}
void ControlToolBar::OnRecord(bool altAppearance)
void ProjectAudioManager::OnRecord(bool altAppearance)
// STRONG-GUARANTEE (for state of current project's tracks)
{
bool bPreferNewTrack;
@@ -1027,7 +1022,7 @@ void ControlToolBar::OnRecord(bool altAppearance)
}
}
bool ControlToolBar::UseDuplex()
bool ProjectAudioManager::UseDuplex()
{
bool duplex;
gPrefs->Read(wxT("/AudioIO/Duplex"), &duplex,
@@ -1040,13 +1035,13 @@ bool ControlToolBar::UseDuplex()
return duplex;
}
bool ControlToolBar::DoRecord(AudacityProject &project,
bool ProjectAudioManager::DoRecord(AudacityProject &project,
const TransportTracks &tracks,
double t0, double t1,
bool altAppearance,
const AudioIOStartStreamOptions &options)
{
auto &projectAudioManager = ProjectAudioManager::Get( mProject );
auto &projectAudioManager = *this;
CommandFlag flags = AlwaysEnabledFlag; // 0 means recalc flags.
@@ -1216,14 +1211,14 @@ bool ControlToolBar::DoRecord(AudacityProject &project,
if (success) {
ProjectAudioIO::Get( *p ).SetAudioIOToken(token);
mBusyProject = p;
}
else {
CancelRecording();
// Show error message if stream could not be opened
wxString msg = wxString::Format(_("Error opening recording device.\nError code: %s"), gAudioIO->LastPaErrorString());
ShowErrorDialog(this, _("Error"), msg, wxT("Error_opening_sound_device"));
ShowErrorDialog(&GetProjectFrame( mProject ),
_("Error"), msg, wxT("Error_opening_sound_device"));
}
}
@@ -1233,7 +1228,13 @@ bool ControlToolBar::DoRecord(AudacityProject &project,
void ControlToolBar::OnPause(wxCommandEvent & WXUNUSED(evt))
{
auto &projectAudioManager = ProjectAudioManager::Get( mProject );
ProjectAudioManager::Get( mProject ).OnPause();
}
void ProjectAudioManager::OnPause()
{
auto &projectAudioManager = *this;
bool canStop = projectAudioManager.CanStopAudioStream();
if ( !canStop ) {
@@ -1257,8 +1258,7 @@ void ControlToolBar::OnPause(wxCommandEvent & WXUNUSED(evt))
!scrubber.IsSpeedPlaying();
if (bStopInstead) {
wxCommandEvent dummy;
OnStop(dummy);
Stop();
return;
}
@@ -1353,7 +1353,7 @@ void ControlToolBar::OnFF(wxCommandEvent & WXUNUSED(evt))
}
}
void ControlToolBar::SetupCutPreviewTracks(double WXUNUSED(playStart), double cutStart,
void ProjectAudioManager::SetupCutPreviewTracks(double WXUNUSED(playStart), double cutStart,
double cutEnd, double WXUNUSED(playEnd))
// STRONG-GUARANTEE (for state of mCutPreviewTracks)
@@ -1378,7 +1378,7 @@ void ControlToolBar::SetupCutPreviewTracks(double WXUNUSED(playStart), double cu
}
}
void ControlToolBar::ClearCutPreviewTracks()
void ProjectAudioManager::ClearCutPreviewTracks()
{
if (mCutPreviewTracks)
mCutPreviewTracks->Clear();
@@ -1521,7 +1521,7 @@ void ControlToolBar::StopScrolling()
(ProjectWindow::PlaybackScroller::Mode::Off);
}
void ControlToolBar::CancelRecording()
void ProjectAudioManager::CancelRecording()
{
const auto project = &mProject;
TrackList::Get( *project ).ClearPendingTracks();
@@ -1531,7 +1531,8 @@ void ControlToolBar::CancelRecording()
#include "../NoteTrack.h"
#endif
TransportTracks GetAllPlaybackTracks(TrackList &trackList, bool selectedOnly, bool useMidi)
TransportTracks ProjectAudioManager::GetAllPlaybackTracks(
TrackList &trackList, bool selectedOnly, bool useMidi)
{
TransportTracks result;
{

View File

@@ -27,24 +27,6 @@ class wxStatusBar;
class AButton;
class AudacityProject;
class TrackList;
struct AudioIOStartStreamOptions;
class SelectedRegion;
enum class PlayMode : int {
normalPlay,
oneSecondPlay, // Disables auto-scrolling
loopedPlay, // Disables auto-scrolling
cutPreviewPlay
};
class WaveTrack;
using WaveTrackArray = std::vector < std::shared_ptr < WaveTrack > >;
struct TransportTracks;
TransportTracks GetAllPlaybackTracks(
TrackList &trackList, bool selectedOnly, bool useMidi = false);
// In the GUI, ControlToolBar appears as the "Transport Toolbar". "Control Toolbar" is historic.
class ControlToolBar final : public ToolBar {
@@ -65,24 +47,12 @@ class ControlToolBar final : public ToolBar {
void UpdatePrefs() override;
void OnKeyEvent(wxKeyEvent & event);
// Find suitable tracks to record into, or return an empty array.
static WaveTrackArray ChooseExistingRecordingTracks(AudacityProject &proj, bool selectedOnly);
static bool UseDuplex();
// msmeyer: These are public, but it's far better to
// call the "real" interface functions like PlayCurrentRegion() and
// StopPlaying() which are defined below.
// call the "real" interface functions below.
void OnRewind(wxCommandEvent & evt);
void OnPlay(wxCommandEvent & evt);
void OnStop(wxCommandEvent & evt);
void OnRecord(wxCommandEvent & evt);
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);
void OnFF(wxCommandEvent & evt);
void OnPause(wxCommandEvent & evt);
void OnIdle(wxIdleEvent & event);
@@ -96,25 +66,10 @@ class ControlToolBar final : public ToolBar {
void SetPlay(bool down, PlayAppearance appearance = PlayAppearance::Straight);
void SetStop();
// Play currently selected region, or if nothing selected,
// play from current cursor.
void PlayCurrentRegion(bool looped = false, bool cutpreview = false);
// Play the region [t0,t1]
// Return the Audio IO token or -1 for failure
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);
void PlayDefault();
// Stop playing
void StopPlaying(bool stopStream = true);
// Pause - used by AudioIO to pause sound activate recording
void Pause();
void Populate() override;
void Repaint(wxDC *dc) override;
void EnableDisableButtons() override;
@@ -127,11 +82,6 @@ class ControlToolBar final : public ToolBar {
void StartScrolling();
void StopScrolling();
// Cancel the addition of temporary recording tracks into the project
void CancelRecording();
PlayMode GetLastPlayMode() const { return mLastPlayMode; }
private:
void UpdateStatusBar();
@@ -149,9 +99,6 @@ class ControlToolBar final : public ToolBar {
teBmps eDisabled);
void ArrangeButtons();
void SetupCutPreviewTracks(double playStart, double cutStart,
double cutEnd, double playEnd);
void ClearCutPreviewTracks();
wxString StateForStatusBar();
enum
@@ -172,8 +119,6 @@ class ControlToolBar final : public ToolBar {
AButton *mStop;
AButton *mFF;
static AudacityProject *mBusyProject;
// Activate ergonomic order for transport buttons
bool mErgonomicTransportButtons;
@@ -181,10 +126,6 @@ class ControlToolBar final : public ToolBar {
wxBoxSizer *mSizer;
std::shared_ptr<TrackList> mCutPreviewTracks;
PlayMode mLastPlayMode{ PlayMode::normalPlay };
public:
DECLARE_CLASS(ControlToolBar)

View File

@@ -33,7 +33,6 @@
#include "../Envelope.h"
#include "ControlToolBar.h"
#include "../AllThemeResources.h"
#include "../AudioIO.h"
#include "../ImageManipulation.h"
@@ -479,6 +478,8 @@ void TranscriptionToolBar::PlayAtSpeed(bool looped, bool cutPreview)
return;
}
auto &projectAudioManager = ProjectAudioManager::Get( mProject );
// Fixed speed play is the old method, that uses a time track.
// VariSpeed play reuses Scrubbing.
bool bFixedSpeedPlay = !gPrefs->ReadBool(wxT("/AudioIO/VariSpeedPlay"), true);
@@ -511,10 +512,8 @@ void TranscriptionToolBar::PlayAtSpeed(bool looped, bool cutPreview)
// If IO is busy, abort immediately
auto gAudioIO = AudioIOBase::Get();
if (gAudioIO->IsBusy()) {
auto &bar = ControlToolBar::Get( *p );
bar.StopPlaying();
}
if (gAudioIO->IsBusy())
projectAudioManager.Stop();
// Get the current play region
const auto &viewInfo = ViewInfo::Get( *p );
@@ -533,8 +532,7 @@ void TranscriptionToolBar::PlayAtSpeed(bool looped, bool cutPreview)
cutPreview ? PlayMode::cutPreviewPlay
: options.playLooped ? PlayMode::loopedPlay
: PlayMode::normalPlay;
auto &bar = ControlToolBar::Get( *p );
bar.PlayPlayRegion(
projectAudioManager.PlayPlayRegion(
SelectedRegion(playRegion.GetStart(), playRegion.GetEnd()),
options,
mode);