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:
@@ -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;
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user