void FreqWindow::GetAudio() { mData.reset(); mDataLen = 0; int selcount = 0; bool warning = false; TrackListIterator iter(p->GetTracks()); Track *t = iter.First(); while (t) { if (t->GetSelected() && t->GetKind() == Track::Wave) { WaveTrack *track = (WaveTrack *)t; if (selcount==0) { mRate = track->GetRate(); auto start = track->TimeToLongSamples(p->mViewInfo.selectedRegion.t0()); auto end = track->TimeToLongSamples(p->mViewInfo.selectedRegion.t1()); auto dataLen = end - start; if (dataLen > 10485760) { warning = true; mDataLen = 10485760; } else // dataLen is not more than 10 * 2 ^ 20 mDataLen = dataLen.as_size_t(); mData = Floats{ mDataLen }; // Don't allow throw for bad reads track->Get((samplePtr)mData.get(), floatSample, start, mDataLen, fillZero, false); } else { if (track->GetRate() != mRate) { AudacityMessageBox(_("To plot the spectrum, all selected tracks must be the same sample rate.")); mData.reset(); mDataLen = 0; return; } auto start = track->TimeToLongSamples(p->mViewInfo.selectedRegion.t0()); Floats buffer2{ mDataLen }; // Again, stop exceptions track->Get((samplePtr)buffer2.get(), floatSample, start, mDataLen, fillZero, false); for (size_t i = 0; i < mDataLen; i++) mData[i] += buffer2[i]; } selcount++; } t = iter.Next(); } if (selcount == 0) return; if (warning) { wxString msg; msg.Printf(_("Too much audio was selected. Only the first %.1f seconds of audio will be analyzed."), (mDataLen / mRate)); AudacityMessageBox(msg); } }
bool EffectRepair::Process() { //v This may be too much copying for EffectRepair. To support Cancel, may be able to copy much less. // But for now, Cancel isn't supported without this. this->CopyInputTracks(); // Set up mOutputTracks. //v This may be too much copying for EffectRepair. bool bGoodResult = true; SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get()); WaveTrack *track = (WaveTrack *) iter.First(); int count = 0; while (track) { const double trackStart = track->GetStartTime(); const double repair_t0 = std::max(mT0, trackStart); const double trackEnd = track->GetEndTime(); const double repair_t1 = std::min(mT1, trackEnd); const double repair_deltat = repair_t1 - repair_t0; if (repair_deltat > 0) { // selection is within track audio const auto repair0 = track->TimeToLongSamples(repair_t0); const auto repair1 = track->TimeToLongSamples(repair_t1); const auto repairLen = repair1 - repair0; if (repairLen > 128) { ::Effect::MessageBox(_("The Repair effect is intended to be used on very short sections of damaged audio (up to 128 samples).\n\nZoom in and select a tiny fraction of a second to repair.")); bGoodResult = false; break; } const double rate = track->GetRate(); const double spacing = std::max(repair_deltat * 2, 128. / rate); const double t0 = std::max(repair_t0 - spacing, trackStart); const double t1 = std::min(repair_t1 + spacing, trackEnd); const auto s0 = track->TimeToLongSamples(t0); const auto s1 = track->TimeToLongSamples(t1); // The difference is at most 2 * 128: const auto repairStart = (repair0 - s0).as_size_t(); const auto len = s1 - s0; if (s0 == repair0 && s1 == repair1) { ::Effect::MessageBox(_("Repair works by using audio data outside the selection region.\n\nPlease select a region that has audio touching at least one side of it.\n\nThe more surrounding audio, the better it performs.")); /// The Repair effect needs some data to go on.\n\nPlease select an area to repair with some audio on at least one side (the more the better).")); bGoodResult = false; break; } if (!ProcessOne(count, track, s0, // len is at most 5 * 128. len.as_size_t(), repairStart, // repairLen is at most 128. repairLen.as_size_t() )) { bGoodResult = false; break; } } track = (WaveTrack *) iter.Next(); count++; } this->ReplaceProcessedTracks(bGoodResult); return bGoodResult; }