mirror of
https://github.com/cookiengineer/audacity
synced 2025-11-25 23:00:19 +01:00
Fix for bug 814
This commit is contained in:
@@ -90,6 +90,7 @@ enum
|
||||
IsSyncLockedFlag = 0x08000000, //awd
|
||||
IsRealtimeNotActiveFlag= 0x10000000, //lll
|
||||
CaptureNotBusyFlag = 0x20000000,
|
||||
CanStopAudioStreamFlag = 0x40000000,
|
||||
|
||||
NoFlagsSpecifed = 0xffffffff
|
||||
};
|
||||
|
||||
@@ -219,6 +219,7 @@ class AUDACITY_DLL_API AudioIO final {
|
||||
bool IsStreamActive(int token);
|
||||
|
||||
wxLongLong GetLastPlaybackTime() const { return mLastPlaybackTimeMillis; }
|
||||
AudacityProject *GetOwningProject() const { return mOwningProject; }
|
||||
|
||||
#ifdef EXPERIMENTAL_MIDI_OUT
|
||||
/** \brief Compute the current PortMidi timestamp time.
|
||||
|
||||
@@ -796,30 +796,25 @@ void AudacityProject::CreateMenusAndCommands()
|
||||
/*i18n-hint: 'Transport' is the name given to the set of controls that
|
||||
play, record, pause etc. */
|
||||
c->BeginMenu(_("T&ransport"));
|
||||
c->SetDefaultFlags(AudioIONotBusyFlag, AudioIONotBusyFlag);
|
||||
c->SetDefaultFlags(CanStopAudioStreamFlag, CanStopAudioStreamFlag);
|
||||
|
||||
/* i18n-hint: (verb) Start or Stop audio playback*/
|
||||
c->AddItem(wxT("PlayStop"), _("Pl&ay/Stop"), FN(OnPlayStop), wxT("Space"),
|
||||
AlwaysEnabledFlag,
|
||||
AlwaysEnabledFlag);
|
||||
c->AddItem(wxT("PlayStopSelect"), _("Play/Stop and &Set Cursor"), FN(OnPlayStopSelect), wxT("Shift+A"),
|
||||
AlwaysEnabledFlag,
|
||||
AlwaysEnabledFlag);
|
||||
c->AddItem(wxT("PlayStop"), _("Pl&ay/Stop"), FN(OnPlayStop), wxT("Space"));
|
||||
c->AddItem(wxT("PlayStopSelect"), _("Play/Stop and &Set Cursor"), FN(OnPlayStopSelect), wxT("Shift+A"));
|
||||
c->AddItem(wxT("PlayLooped"), _("&Loop Play"), FN(OnPlayLooped), wxT("Shift+Space"),
|
||||
WaveTracksExistFlag | AudioIONotBusyFlag,
|
||||
WaveTracksExistFlag | AudioIONotBusyFlag);
|
||||
c->AddItem(wxT("Pause"), _("&Pause"), FN(OnPause), wxT("P"),
|
||||
AlwaysEnabledFlag,
|
||||
AlwaysEnabledFlag);
|
||||
WaveTracksExistFlag | AudioIONotBusyFlag | CanStopAudioStreamFlag,
|
||||
WaveTracksExistFlag | AudioIONotBusyFlag | CanStopAudioStreamFlag);
|
||||
c->AddItem(wxT("Pause"), _("&Pause"), FN(OnPause), wxT("P"));
|
||||
c->AddItem(wxT("SkipStart"), _("S&kip to Start"), FN(OnSkipStart), wxT("Home"),
|
||||
AudioIONotBusyFlag,
|
||||
AudioIONotBusyFlag);
|
||||
AudioIONotBusyFlag, AudioIONotBusyFlag);
|
||||
c->AddItem(wxT("SkipEnd"), _("Skip to E&nd"), FN(OnSkipEnd), wxT("End"),
|
||||
WaveTracksExistFlag | AudioIONotBusyFlag,
|
||||
WaveTracksExistFlag | AudioIONotBusyFlag);
|
||||
WaveTracksExistFlag | AudioIONotBusyFlag,
|
||||
WaveTracksExistFlag | AudioIONotBusyFlag);
|
||||
|
||||
c->AddSeparator();
|
||||
|
||||
c->SetDefaultFlags(AudioIONotBusyFlag | CanStopAudioStreamFlag,
|
||||
AudioIONotBusyFlag | CanStopAudioStreamFlag);
|
||||
/* i18n-hint: (verb)*/
|
||||
c->AddItem(wxT("Record"), _("&Record"), FN(OnRecord), wxT("R"));
|
||||
c->AddItem(wxT("TimerRecord"), _("&Timer Record..."), FN(OnTimerRecord), wxT("Shift+T"));
|
||||
@@ -1809,6 +1804,10 @@ wxUint32 AudacityProject::GetUpdateFlags()
|
||||
if (!mIsCapturing)
|
||||
flags |= CaptureNotBusyFlag;
|
||||
|
||||
ControlToolBar *bar = GetControlToolBar();
|
||||
if (bar->ControlToolBar::CanStopAudioStream())
|
||||
flags |= CanStopAudioStreamFlag;
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
|
||||
@@ -389,12 +389,12 @@ void ControlToolBar::Repaint( wxDC *dc )
|
||||
|
||||
void ControlToolBar::EnableDisableButtons()
|
||||
{
|
||||
//TIDY-ME: Button logic could be neater.
|
||||
AudacityProject *p = GetActiveProject();
|
||||
bool tracks = false;
|
||||
|
||||
bool playing = mPlay->IsDown();
|
||||
bool recording = mRecord->IsDown();
|
||||
bool busy = gAudioIO->IsBusy() || playing || recording;
|
||||
bool notBusy = !gAudioIO->IsBusy();
|
||||
|
||||
// Only interested in audio type tracks
|
||||
if (p) {
|
||||
@@ -411,22 +411,18 @@ void ControlToolBar::EnableDisableButtons()
|
||||
}
|
||||
}
|
||||
|
||||
const bool enablePlay = (!recording) || (tracks && !busy);
|
||||
mPlay->SetEnabled(enablePlay);
|
||||
// Enable and disable the other play button
|
||||
if (p)
|
||||
{
|
||||
TranscriptionToolBar *const pttb = p->GetTranscriptionToolBar();
|
||||
if (pttb)
|
||||
pttb->SetEnabled(enablePlay);
|
||||
if (p) {
|
||||
TranscriptionToolBar *const playAtSpeedTB = p->GetTranscriptionToolBar();
|
||||
if (playAtSpeedTB)
|
||||
playAtSpeedTB->SetEnabled(CanStopAudioStream() && tracks && !recording);
|
||||
}
|
||||
|
||||
mRecord->SetEnabled(!busy && !playing);
|
||||
|
||||
mStop->SetEnabled(busy);
|
||||
mRewind->SetEnabled(!busy);
|
||||
mFF->SetEnabled(tracks && !busy);
|
||||
mPause->SetEnabled(true);
|
||||
mPlay->SetEnabled(CanStopAudioStream() && tracks && !recording);
|
||||
mRecord->SetEnabled(CanStopAudioStream() && notBusy && !playing);
|
||||
mStop->SetEnabled(CanStopAudioStream() && (playing || recording));
|
||||
mRewind->SetEnabled(!playing && !recording);
|
||||
mFF->SetEnabled(tracks && !playing && !recording);
|
||||
mPause->SetEnabled(CanStopAudioStream());
|
||||
}
|
||||
|
||||
void ControlToolBar::SetPlay(bool down, bool looped, bool cutPreview)
|
||||
@@ -483,6 +479,9 @@ int ControlToolBar::PlayPlayRegion(const SelectedRegion &selectedRegion,
|
||||
bool backwards, /* = false */
|
||||
bool playWhiteSpace /* = false */)
|
||||
{
|
||||
if (!CanStopAudioStream())
|
||||
return -1;
|
||||
|
||||
// Uncomment this for laughs!
|
||||
// backwards = true;
|
||||
|
||||
@@ -667,6 +666,9 @@ int ControlToolBar::PlayPlayRegion(const SelectedRegion &selectedRegion,
|
||||
void ControlToolBar::PlayCurrentRegion(bool looped /* = false */,
|
||||
bool cutpreview /* = false */)
|
||||
{
|
||||
if (!CanStopAudioStream())
|
||||
return;
|
||||
|
||||
AudacityProject *p = GetActiveProject();
|
||||
|
||||
if (p)
|
||||
@@ -695,6 +697,8 @@ void ControlToolBar::OnKeyEvent(wxKeyEvent & event)
|
||||
return;
|
||||
}
|
||||
|
||||
// Does not appear to be needed on Linux. Perhaps on some other platform?
|
||||
// If so, "!CanStopAudioStream()" should probably apply.
|
||||
if (event.GetKeyCode() == WXK_SPACE) {
|
||||
if (gAudioIO->IsStreamActive(GetActiveProject()->GetAudioIOToken())) {
|
||||
SetPlay(false);
|
||||
@@ -713,6 +717,9 @@ void ControlToolBar::OnKeyEvent(wxKeyEvent & event)
|
||||
|
||||
void ControlToolBar::OnPlay(wxCommandEvent & WXUNUSED(evt))
|
||||
{
|
||||
if (!CanStopAudioStream())
|
||||
return;
|
||||
|
||||
StopPlaying();
|
||||
|
||||
AudacityProject *p = GetActiveProject();
|
||||
@@ -724,8 +731,17 @@ void ControlToolBar::OnPlay(wxCommandEvent & WXUNUSED(evt))
|
||||
|
||||
void ControlToolBar::OnStop(wxCommandEvent & WXUNUSED(evt))
|
||||
{
|
||||
StopPlaying();
|
||||
UpdateStatusBar();
|
||||
if (CanStopAudioStream()) {
|
||||
StopPlaying();
|
||||
UpdateStatusBar();
|
||||
}
|
||||
}
|
||||
|
||||
bool ControlToolBar::CanStopAudioStream()
|
||||
{
|
||||
return (!gAudioIO->IsStreamActive() ||
|
||||
gAudioIO->IsMonitoring() ||
|
||||
gAudioIO->GetOwningProject() == GetActiveProject());
|
||||
}
|
||||
|
||||
void ControlToolBar::PlayDefault()
|
||||
@@ -739,6 +755,9 @@ void ControlToolBar::PlayDefault()
|
||||
|
||||
void ControlToolBar::StopPlaying(bool stopStream /* = true*/)
|
||||
{
|
||||
if (!CanStopAudioStream())
|
||||
return;
|
||||
|
||||
mStop->PushDown();
|
||||
|
||||
SetStop(false);
|
||||
@@ -779,8 +798,12 @@ void ControlToolBar::StopPlaying(bool stopStream /* = true*/)
|
||||
|
||||
void ControlToolBar::Pause()
|
||||
{
|
||||
wxCommandEvent dummy;
|
||||
OnPause(dummy);
|
||||
if (!CanStopAudioStream())
|
||||
gAudioIO->SetPaused(!gAudioIO->IsPaused());
|
||||
else {
|
||||
wxCommandEvent dummy;
|
||||
OnPause(dummy);
|
||||
}
|
||||
}
|
||||
|
||||
void ControlToolBar::OnRecord(wxCommandEvent &evt)
|
||||
@@ -984,7 +1007,7 @@ void ControlToolBar::OnRecord(wxCommandEvent &evt)
|
||||
#ifdef EXPERIMENTAL_AUTOMATED_INPUT_LEVEL_ADJUSTMENT
|
||||
gAudioIO->AILAInitialize();
|
||||
#endif
|
||||
|
||||
|
||||
AudioIOStartStreamOptions options(p->GetDefaultPlayOptions());
|
||||
int token = gAudioIO->StartStream(playbackTracks,
|
||||
newRecordingTracks,
|
||||
@@ -1027,6 +1050,10 @@ void ControlToolBar::OnRecord(wxCommandEvent &evt)
|
||||
|
||||
void ControlToolBar::OnPause(wxCommandEvent & WXUNUSED(evt))
|
||||
{
|
||||
if (!CanStopAudioStream()) {
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef EXPERIMENTAL_SCRUBBING_SUPPORT
|
||||
if (gAudioIO->IsScrubbing())
|
||||
// Pausing does not make sense. Force the button
|
||||
|
||||
@@ -64,6 +64,9 @@ class ControlToolBar final : public ToolBar {
|
||||
|
||||
bool IsRecordDown();
|
||||
|
||||
// A project is only allowed to stop an audio stream that it owns.
|
||||
bool CanStopAudioStream ();
|
||||
|
||||
// Play currently selected region, or if nothing selected,
|
||||
// play from current cursor.
|
||||
void PlayCurrentRegion(bool looped = false, bool cutpreview = false);
|
||||
|
||||
Reference in New Issue
Block a user