void TranscriptionToolBar::OnStartOff(wxCommandEvent & WXUNUSED(event)) { //If IO is busy, abort immediately if (gAudioIO->IsBusy()){ SetButton(false,mButtons[TTB_StartOff]); return; } mVk->AdjustThreshold(GetSensitivity()); AudacityProject *p = GetActiveProject(); SetButton(false, mButtons[TTB_StartOff]); auto t = *p->GetTracks()->Any< const WaveTrack >().begin(); if(t) { auto wt = static_cast<const WaveTrack*>(t); sampleCount start, len; GetSamples(wt, &start, &len); //Adjust length to end if selection is null //if(len == 0) //len = wt->GetSequence()->GetNumSamples()-start; auto newstart = mVk->OffForward(*wt, start, len); double newpos = newstart.as_double() / wt->GetRate(); auto &selectedRegion = p->GetViewInfo().selectedRegion; selectedRegion.setT0( newpos ); p->RedrawProject(); SetButton(false, mButtons[TTB_StartOn]); } }
bool SelectTimeCommand::Apply(const CommandContext & context){ // Many commands need focus on track panel. // No harm in setting it with a scripted select. context.GetProject()->GetTrackPanel()->SetFocus(); if( !bHasT0 && !bHasT1 ) return true; // Defaults if no value... if( !bHasT0 ) mT0 = 0.0; if( !bHasT1 ) mT1 = 0.0; if( !bHasRelativeSpec ) mRelativeTo = 0; AudacityProject * p = context.GetProject(); double end = p->GetTracks()->GetEndTime(); double t0; double t1; const auto &selectedRegion = p->GetViewInfo().selectedRegion; switch( bHasRelativeSpec ? mRelativeTo : 0 ){ default: case 0: //project start t0 = mT0; t1 = mT1; break; case 1: //project t0 = mT0; t1 = end + mT1; break; case 2: //project end; t0 = end - mT0; t1 = end - mT1; break; case 3: //selection start t0 = mT0 + selectedRegion.t0(); t1 = mT1 + selectedRegion.t0(); break; case 4: //selection t0 = mT0 + selectedRegion.t0(); t1 = mT1 + selectedRegion.t1(); break; case 5: //selection end t0 = selectedRegion.t1() - mT0; t1 = selectedRegion.t1() - mT1; break; } p->mViewInfo.selectedRegion.setTimes( t0, t1); return true; }
void TranscriptionToolBar::GetSamples( const WaveTrack *t, sampleCount *s0, sampleCount *slen) { // GetSamples attempts to translate the start and end selection markers into sample indices // These selection numbers are doubles. AudacityProject *p = GetActiveProject(); if (!p) { return; } //First, get the current selection. It is part of the mViewInfo, which is //part of the project const auto &selectedRegion = p->GetViewInfo().selectedRegion; double start = selectedRegion.t0(); double end = selectedRegion.t1(); auto ss0 = sampleCount( (start - t->GetOffset()) * t->GetRate() ); auto ss1 = sampleCount( (end - t->GetOffset()) * t->GetRate() ); if (start < t->GetOffset()) { ss0 = 0; } #if 0 //This adjusts the right samplecount to the maximum sample. if (ss1 >= t->GetNumSamples()) { ss1 = t->GetNumSamples(); } #endif if (ss1 < ss0) { ss1 = ss0; } *s0 = ss0; *slen = ss1 - ss0; }
void TranscriptionToolBar::OnSelectSound(wxCommandEvent & WXUNUSED(event)) { //If IO is busy, abort immediately if (gAudioIO->IsBusy()){ SetButton(false,mButtons[TTB_SelectSound]); return; } mVk->AdjustThreshold(GetSensitivity()); AudacityProject *p = GetActiveProject(); TrackList *tl = p->GetTracks(); if(auto wt = *tl->Any<const WaveTrack>().begin()) { sampleCount start, len; GetSamples(wt, &start, &len); //Adjust length to end if selection is null //if(len == 0) //len = wt->GetSequence()->GetNumSamples()-start; double rate = wt->GetRate(); auto newstart = mVk->OffBackward(*wt, start, start); auto newend = mVk->OffForward(*wt, start + len, (int)(tl->GetEndTime() * rate)); //reset the selection bounds. auto &selectedRegion = p->GetViewInfo().selectedRegion; selectedRegion.setTimes( newstart.as_double() / rate, newend.as_double() / rate ); p->RedrawProject(); } SetButton(false,mButtons[TTB_SelectSound]); }