1
0
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:
Steve Daulton
2016-03-28 21:04:49 +01:00
parent 581be2ce13
commit 484f23dcc7
5 changed files with 68 additions and 37 deletions

View File

@@ -90,6 +90,7 @@ enum
IsSyncLockedFlag = 0x08000000, //awd
IsRealtimeNotActiveFlag= 0x10000000, //lll
CaptureNotBusyFlag = 0x20000000,
CanStopAudioStreamFlag = 0x40000000,
NoFlagsSpecifed = 0xffffffff
};

View File

@@ -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.

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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);