void AudacityProject::OnPlotSpectrum(wxCommandEvent & event) { int selcount = 0; WaveTrack *selt = NULL; TrackListIterator iter(mTracks); VTrack *t = iter.First(); while (t) { if (t->GetSelected()) selcount++; if (t->GetKind() == VTrack::Wave) selt = (WaveTrack *) t; t = iter.Next(); } if (selcount != 1) { wxMessageBox(_("Please select a single track first.\n")); return; } /* This shouldn't be possible, since the menu is grayed out. * But we'll check just in case it does happen, to prevent * the crash that would result. */ if (!selt) { wxMessageBox(_("Please select a track first.\n")); return; } sampleCount s0 = (sampleCount) ((mViewInfo.sel0 - selt->GetOffset()) * selt->GetRate()); sampleCount s1 = (sampleCount) ((mViewInfo.sel1 - selt->GetOffset()) * selt->GetRate()); sampleCount slen = s1 - s0; if (slen > 1048576) slen = 1048576; float *data = new float[slen]; sampleType *data_sample = new sampleType[slen]; if (s0 >= selt->GetNumSamples() || s0 + slen > selt->GetNumSamples()) { wxMessageBox(_("Not enough samples selected.\n")); delete[]data; delete[]data_sample; return; } selt->Get(data_sample, s0, slen); for (sampleCount i = 0; i < slen; i++) data[i] = data_sample[i] / 32767.; gFreqWindow->Plot(slen, data, selt->GetRate()); gFreqWindow->Show(true); gFreqWindow->Raise(); delete[]data; delete[]data_sample; }
WaveTrack::WaveTrack(WaveTrack &orig): Track(orig) { this->SetDisplay(WaveformDisplay); // Move to GUIWaveTrack Init(orig); mSequence = new Sequence(*orig.mSequence); mAppendBuffer = NULL; mAppendBufferLen = 0; mEnvelope = new Envelope(); mEnvelope->Paste(0.0, orig.mEnvelope); mEnvelope->SetOffset(orig.GetOffset()); mEnvelope->SetTrackLen(orig.mSequence->GetNumSamples() / orig.mRate); mWaveCache = new WaveCache(1); mSpecCache = new SpecCache(1, 1, false); }