void TranscriptionToolBar::OnEndOff(wxCommandEvent & WXUNUSED(event)) { //If IO is busy, abort immediately if (gAudioIO->IsBusy()){ SetButton(false,mButtons[TTB_EndOff]); return; } mVk->AdjustThreshold(GetSensitivity()); AudacityProject *p = GetActiveProject(); 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 = start; start = 0; } auto newEnd = mVk->OffBackward(*wt, start + len, len); double newpos = newEnd.as_double() / wt->GetRate(); p->SetSel1(newpos); p->RedrawProject(); SetButton(false, mButtons[TTB_EndOff]); } }
// Update member variables with project selection data (and validate) bool CompareAudioCommand::GetSelection(AudacityProject &proj) { // Get the selected time interval mT0 = proj.mViewInfo.sel0; mT1 = proj.mViewInfo.sel1; if (mT0 >= mT1) { Error(wxT("There is no selection!")); return false; } // Get the selected tracks and check that there are at least two to // compare SelectedTrackListOfKindIterator iter(Track::Wave, proj.GetTracks()); mTrack0 = (WaveTrack*)(iter.First()); if (mTrack0 == NULL) { Error(wxT("No tracks selected! Select two tracks to compare.")); return false; } mTrack1 = (WaveTrack*)(iter.Next()); if (mTrack1 == NULL) { Error(wxT("Only one track selected! Select two tracks to compare.")); return false; } if (iter.Next() != NULL) { Status(wxT("More than two tracks selected - only the first two will be compared.")); } return true; }
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; // Only interested in audio type tracks if (p) { TrackListIterator iter( p->GetTracks() ); for (Track *t = iter.First(); t; t = iter.Next()) { if (t->GetKind() == Track::Wave #if defined(USE_MIDI) || t->GetKind() == Track::Note #endif ) { tracks = true; break; } } } mPlay->SetEnabled((!recording) || (tracks && !busy)); mRecord->SetEnabled(!busy && !playing); mStop->SetEnabled(busy); mRewind->SetEnabled(!busy); mFF->SetEnabled(tracks && !busy); mPause->SetEnabled(true); }
void TranscriptionToolBar::OnEndOff(wxCommandEvent & WXUNUSED(event)) { //If IO is busy, abort immediately if (gAudioIO->IsBusy()){ SetButton(false,mButtons[TTB_EndOff]); return; } mVk->AdjustThreshold(GetSensitivity()); AudacityProject *p = GetActiveProject(); TrackList *tl = p->GetTracks(); TrackListOfKindIterator iter(Track::Wave, tl); Track *t = iter.First(); //Make a track if(t) { sampleCount start,len; GetSamples((WaveTrack*)t, &start,&len); //Adjust length to end if selection is null if(len == 0) { len = start; start = 0; } sampleCount newEnd = mVk->OffBackward(*(WaveTrack*)t,start+ len,len); double newpos = newEnd / ((WaveTrack*)t)->GetRate(); p->SetSel1(newpos); p->RedrawProject(); SetButton(false, mButtons[TTB_EndOff]); } }
float ContrastDialog::GetDB() { // not good // why not? // what if more than one track? float rms = float(0.0); AudacityProject *p = GetActiveProject(); TrackListIterator iter(p->GetTracks()); Track *t = iter.First(); if(mT0 > mT1) { wxMessageDialog m(NULL, _("Start time after after end time!\nPlease enter reasonable times."), _("Error"), wxOK); m.ShowModal(); return 1234.0; // 'magic number', but the whole +ve dB range will 'almost' never occur } if(mT0 < t->GetStartTime()) mT0 = t->GetStartTime(); if(mT1 > t->GetEndTime()) mT1 = t->GetEndTime(); if(mT0 > mT1) { wxMessageDialog m(NULL, _("Times are not reasonable!\nPlease enter reasonable times."), _("Error"), wxOK); m.ShowModal(); return 1234.0; } if(mT0 == mT1) return 1234.0; while(t) { // this isn't quite right. What to do if more than one track selected? ((WaveTrack *)t)->GetRMS(&rms, mT0, mT1); t = iter.Next(); } return 20.0*log10(rms); }
void ControlToolBar::EnableDisableButtons() { AudacityProject *p = GetActiveProject(); bool tracks = (p && !p->GetTracks()->IsEmpty()); bool busy = gAudioIO->IsBusy(); #if 0 if (tracks) { if (!busy) mPlay->Enable(); } else mPlay->Disable(); #endif //mPlay->SetEnabled(tracks && !busy); mPlay->SetEnabled(tracks && !mRecord->IsDown()); #if (AUDACITY_BRANDING == BRAND_THINKLABS) mPlay->SetEnabled(tracks && !mRecord->IsDown() && !mLoopPlay->IsDown()); mLoopPlay->SetEnabled(tracks && !mRecord->IsDown() && !mPlay->IsDown()); #endif mStop->SetEnabled(busy); mRewind->SetEnabled(tracks && !busy); mFF->SetEnabled(tracks && !busy); }
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(); TrackList *tl = p->GetTracks(); TrackListOfKindIterator iter(Track::Wave, tl); SetButton(false, mButtons[TTB_StartOff]); Track *t = iter.First(); //Make a track 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(); p->SetSel0(newpos); p->RedrawProject(); SetButton(false, mButtons[TTB_StartOn]); } }
bool BatchCommands::IsMono() { AudacityProject *project = GetActiveProject(); if( project == NULL ) { //wxMessageBox( wxT("No project and no Audio to process!") ); return false; } TrackList * tracks = project->GetTracks(); if( tracks == NULL ) { //wxMessageBox( wxT("No tracks to process!") ); return false; } TrackListIterator iter(tracks); Track *t = iter.First(); bool mono = true; while (t) { if (t->GetLinked()) { mono = false; break; } t = iter.Next(); } return mono; }
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]); } }
void EditToolBar::EnableDisableButtons() { AudacityProject *p = GetActiveProject(); if (!p) return; // Is anything selected? bool selection = false; TrackListIterator iter(p->GetTracks()); for (Track *t = iter.First(); t; t = iter.Next()) if (t->GetSelected()) { selection = true; break; } selection &= (p->GetSel0() < p->GetSel1()); mButtons[ETBCutID]->SetEnabled(selection); mButtons[ETBCopyID]->SetEnabled(selection); mButtons[ETBTrimID]->SetEnabled(selection); mButtons[ETBSilenceID]->SetEnabled(selection); mButtons[ETBUndoID]->SetEnabled(p->GetUndoManager()->UndoAvailable()); mButtons[ETBRedoID]->SetEnabled(p->GetUndoManager()->RedoAvailable()); bool tracks = (!p->GetTracks()->IsEmpty()); mButtons[ETBZoomInID]->SetEnabled(tracks && (p->ZoomInAvailable())); mButtons[ETBZoomOutID]->SetEnabled(tracks && (p->ZoomOutAvailable()) ); #if 0 // Disabled for version 1.2.0 since it doesn't work quite right... mButtons[ETBZoomToggleID]->SetEnabled(tracks); #endif mButtons[ETBZoomSelID]->SetEnabled(selection); mButtons[ETBZoomFitID]->SetEnabled(tracks); mButtons[ETBPasteID]->SetEnabled(p->Clipboard()); #ifdef EXPERIMENTAL_SYNC_LOCK bool bSyncLockTracks; gPrefs->Read(wxT("/GUI/SyncLockTracks"), &bSyncLockTracks, false); if (bSyncLockTracks) mButtons[ETBSyncLockID]->PushDown(); else mButtons[ETBSyncLockID]->PopUp(); #endif }
// in response of a print-document apple event void AudacityApp::MacPrintFile(const wxString &fileName) { AudacityProject *project = GetActiveProject(); if (project == NULL || !project->GetTracks()->IsEmpty()) { project = CreateNewAudacityProject(gParentWindow); } project->OpenFile(fileName); }
void LOFImportFileHandle::doDuration() { if (callDurationFactor) { double longestDuration = mProject->GetTracks()->GetEndTime(); mProject->ZoomBy(longestDuration / durationFactor); callDurationFactor = false; } }
void LOFImportFileHandle::doDuration() { if (callDurationFactor) { double longestDuration = mProject->GetTracks()->GetEndTime(); double realZoomValue = ((longestDuration/durationFactor)*(mProject->GetZoom())); mProject->Zoom(realZoomValue); callDurationFactor = false; } }
void TranscriptionToolBar::EnableDisableButtons() { #ifdef EXPERIMENTAL_VOICE_DETECTION AudacityProject *p = GetActiveProject(); if (!p) return; // Is anything selected? auto selection = p->GetSel0() < p->GetSel1() && p->GetTracks()->Selected(); mButtons[TTB_Calibrate]->SetEnabled(selection); #endif }
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; }
pascal OSErr AEOpenFiles(const AppleEvent * theAppleEvent, AppleEvent * theReply, long Refcon) { AEDescList docList; AEKeyword keywd; DescType returnedType; Size actualSize; long itemsInList; FSSpec theSpec; CInfoPBRec pb; Handle nameh; short namelen; OSErr err; short i; err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeAEList, &docList); if (err != noErr) return err; err = AECountItems(&docList, &itemsInList); if (err != noErr) return err; for (i = 1; i <= itemsInList; i++) { AEGetNthPtr(&docList, i, typeFSS, &keywd, &returnedType, (Ptr) & theSpec, sizeof(theSpec), &actualSize); if (noErr == FSpGetFullPath(&theSpec, &namelen, &nameh)) { HLock(nameh); char *str = new char[namelen + 1]; memcpy(str, (char *) *nameh, namelen); str[namelen] = 0; HUnlock(nameh); DisposeHandle(nameh); AudacityProject *project = GetActiveProject(); if (project == NULL || !project->GetTracks()->IsEmpty()) { project = CreateNewAudacityProject(gParentWindow); } project->OpenFile(str); delete[]str; } } return noErr; }
void EditToolBar::EnableDisableButtons() { AudacityProject *p = GetActiveProject(); if (!p) return; // Is anything selected? bool selection = false; TrackListIterator iter(p->GetTracks()); for (Track *t = iter.First(); t; t = iter.Next()) if (t->GetSelected()) { selection = true; break; } selection &= (p->GetSel0() < p->GetSel1()); mButtons[ETBCutID]->SetEnabled(selection); mButtons[ETBCopyID]->SetEnabled(selection); mButtons[ETBTrimID]->SetEnabled(selection); mButtons[ETBSilenceID]->SetEnabled(selection); mButtons[ETBUndoID]->SetEnabled(p->GetUndoManager()->UndoAvailable()); mButtons[ETBRedoID]->SetEnabled(p->GetUndoManager()->RedoAvailable()); bool tracks = (!p->GetTracks()->IsEmpty()); mButtons[ETBZoomInID]->SetEnabled(tracks && (p->GetZoom() < gMaxZoom)); mButtons[ETBZoomOutID]->SetEnabled(tracks && (p->GetZoom() > gMinZoom) ); #if 0 // Disabled for version 1.2.0 since it doesn't work quite right... mButtons[ETBZoomToggleID]->SetEnabled(tracks); #endif mButtons[ETBZoomSelID]->SetEnabled(selection); mButtons[ETBZoomFitID]->SetEnabled(tracks); mButtons[ETBPasteID]->SetEnabled(p->Clipboard()); }
void ControlToolBar::SetupCutPreviewTracks(double playStart, double cutStart, double cutEnd, double playEnd) { ClearCutPreviewTracks(); AudacityProject *p = GetActiveProject(); if (p) { // Find first selected track (stereo or mono) and duplicate it Track *track1 = NULL, *track2 = NULL; TrackListIterator it(p->GetTracks()); for (Track *t = it.First(); t; t = it.Next()) { if (t->GetKind() == Track::Wave && t->GetSelected()) { track1 = t; track2 = p->GetTracks()->GetLink(track1); break; } } if (track1) { // Duplicate and change tracks track1 = track1->Duplicate(); track1->Clear(cutStart, cutEnd); if (track2) { track2 = track2->Duplicate(); track2->Clear(cutStart, cutEnd); } mCutPreviewTracks = new TrackList(); mCutPreviewTracks->Add(track1); if (track2) mCutPreviewTracks->Add(track2); } } }
void ContrastDialog::OnGetBackground(wxCommandEvent & /*event*/) { AudacityProject *p = GetActiveProject(); SelectedTrackListOfKindIterator iter(Track::Wave, p->GetTracks()); for (Track *t = iter.First(); t; t = iter.Next()) { mBackgroundStartT->SetValue(p->mViewInfo.selectedRegion.t0()); mBackgroundEndT->SetValue(p->mViewInfo.selectedRegion.t1()); } SetStartAndEndTime(); mBackgroundIsDefined = GetDB(backgrounddB); m_pButton_UseCurrentB->SetFocus(); results(); }
void APalette::OnRecord() { if (gAudioIO->IsBusy()) return; AudacityProject *p = GetActiveProject(); if (p) { TrackList *t = p->GetTracks(); bool success = gAudioIO->StartRecord(p, t); if (!success) { SetPlay(false); SetStop(false); SetRecord(false); } } }
void ContrastDialog::OnUseSelectionB(wxCommandEvent & event) { AudacityProject *p = GetActiveProject(); TrackListIterator iter(p->GetTracks()); Track *t = iter.First(); while (t) { if (t->GetSelected() && t->GetKind() == Track::Wave) { mBackgroundStartT->SetTimeValue(p->mViewInfo.sel0); mBackgroundEndT->SetTimeValue(p->mViewInfo.sel1); break; } t = iter.Next(); } bBGset = true; OnGetBackgroundDB(event); }
void TranscriptionToolBar::OnCalibrate(wxCommandEvent & WXUNUSED(event)) { //If IO is busy, abort immediately if (gAudioIO->IsBusy()){ SetButton(false,mButtons[TTB_Calibrate]); return; } AudacityProject *p = GetActiveProject(); TrackList *tl = p->GetTracks(); TrackListOfKindIterator iter(Track::Wave, tl); Track *t = iter.First(); //Get a track if(t) { auto wt = static_cast<const WaveTrack*>(t); sampleCount start, len; GetSamples(wt, &start, &len); mVk->CalibrateNoise(*wt, start, len); mVk->AdjustThreshold(3); mButtons[TTB_StartOn]->Enable(); mButtons[TTB_StartOff]->Enable(); mButtons[TTB_EndOn]->Enable(); mButtons[TTB_EndOff]->Enable(); //mThresholdSensitivity->Set(3); SetButton(false,mButtons[TTB_Calibrate]); } mButtons[TTB_StartOn]->Enable(); mButtons[TTB_StartOff]->Enable(); mButtons[TTB_EndOn]->Enable(); mButtons[TTB_EndOff]->Enable(); mButtons[TTB_SelectSound]->Enable(); mButtons[TTB_SelectSilence]->Enable(); mButtons[TTB_AutomateSelection]->Enable(); //Make the sensititivy slider set the sensitivity by processing an event. wxCommandEvent dummy; OnSensitivitySlider(dummy); }
void TranscriptionToolBar::EnableDisableButtons() { #ifdef EXPERIMENTAL_VOICE_DETECTION AudacityProject *p = GetActiveProject(); if (!p) return; // Is anything selected? bool selection = false; TrackListIterator iter(p->GetTracks()); for (Track *t = iter.First(); t; t = iter.Next()) if (t->GetSelected()) { selection = true; break; } selection &= (p->GetSel0() < p->GetSel1()); mButtons[TTB_Calibrate]->SetEnabled(selection); #endif }
double BatchCommands::GetEndTime() { AudacityProject *project = GetActiveProject(); if( project == NULL ) { //wxMessageBox( wxT("No project to process!") ); return -1.0; } TrackList * tracks = project->GetTracks(); if( tracks == NULL ) { //wxMessageBox( wxT("No tracks to process!") ); return -1.0; } double endTime = tracks->GetEndTime(); return endTime; }
void ControlToolBar::EnableDisableButtons() { //TIDY-ME: Button logic could be neater. AudacityProject *p = GetActiveProject(); size_t numProjects = gAudacityProjects.Count(); bool tracks = false; bool cleaningSpeech = mBatch->IsDown(); bool playing = mPlay->IsDown(); bool recording = mRecord->IsDown(); bool busy = gAudioIO->IsBusy() || playing || recording; // Only interested in audio type tracks if (p) { TrackListIterator iter( p->GetTracks() ); for (Track *t = iter.First(); t; t = iter.Next()) { if (t->GetKind() == Track::Wave #if defined(USE_MIDI) || t->GetKind() == Track::Note #endif ) { tracks = true; break; } } } mPlay->SetEnabled((!recording) || (tracks && !busy && !cleaningSpeech)); mRecord->SetEnabled(!busy && !playing); if (p && GetActiveProject()->GetCleanSpeechMode()) { bool canRecord = !tracks; canRecord &= !cleaningSpeech; canRecord &= !busy; canRecord &= ((numProjects == 0) || ((numProjects == 1) && !tracks)); mRecord->SetEnabled(canRecord); mBatch->SetEnabled(!busy && !recording); } mStop->SetEnabled(busy && !cleaningSpeech); mRewind->SetEnabled(tracks && !busy); mFF->SetEnabled(tracks && !busy); mPause->SetEnabled(true); }
void ControlToolBar::EnableDisableButtons() { AudacityProject *p = GetActiveProject(); bool tracks = false; bool playing = mPlay->IsDown(); bool recording = mRecord->IsDown(); bool busy = gAudioIO->IsBusy(); // Only interested in audio type tracks if (p) { TrackListIterator iter( p->GetTracks() ); for (Track *t = iter.First(); t; t = iter.Next()) { if (t->GetKind() == Track::Wave #if defined(USE_MIDI) || t->GetKind() == Track::Note #endif ) { tracks = true; break; } } } if (p) { TranscriptionToolBar *const playAtSpeedTB = p->GetTranscriptionToolBar(); if (playAtSpeedTB) playAtSpeedTB->SetEnabled(CanStopAudioStream() && tracks && !recording); } mPlay->SetEnabled(CanStopAudioStream() && tracks && !recording); mRecord->SetEnabled( CanStopAudioStream() && !(busy && !recording) && !playing ); mStop->SetEnabled(CanStopAudioStream() && (playing || recording)); mRewind->SetEnabled(!playing && !recording); mFF->SetEnabled(tracks && !playing && !recording); auto pProject = GetActiveProject(); mPause->SetEnabled(CanStopAudioStream()); }
void APalette::OnRecord() { if (gAudioIO->IsBusy()) return; AudacityProject *p = GetActiveProject(); if (p) { TrackList *t = p->GetTracks(); double t0 = p->GetSel0(); double t1 = p->GetSel1(); if (t1 == t0) t1 = 1000000000.0; // record for a long, long time (tens of years) bool success = gAudioIO->StartRecord(p, t, t0, t1); if (!success) { SetPlay(false); SetStop(false); SetRecord(false); } } }
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(); TrackListIterator iter(tl); Track *t = iter.First(); //Make a track if(t) { sampleCount start,len; GetSamples((WaveTrack*)t, &start,&len); //Adjust length to end if selection is null //if(len == 0) //len = (WaveTrack*)t->GetSequence()->GetNumSamples()-start; double rate = ((WaveTrack*)t)->GetRate(); sampleCount newstart = mVk->OffBackward(*(WaveTrack*)t,start,start); sampleCount newend = mVk->OffForward(*(WaveTrack*)t,start+len,(int)(tl->GetEndTime()*rate)); //reset the selection bounds. p->SetSel0(newstart / rate); p->SetSel1(newend / rate); p->RedrawProject(); } SetButton(false,mButtons[TTB_SelectSound]); }
void APalette::OnPlay() { if (gAudioIO->IsBusy()) return; AudacityProject *p = GetActiveProject(); if (p) { TrackList *t = p->GetTracks(); double t0 = p->GetSel0(); double t1 = p->GetSel1(); if (t1 == t0) t1 = t->GetMaxLen(); bool success = gAudioIO->StartPlay(p, t, t0, t1); if (!success) { SetPlay(false); SetStop(false); SetRecord(false); } } }
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]); }