From fa5fe9943db6b10a64f563b8a05917f12341182c Mon Sep 17 00:00:00 2001 From: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com> Date: Thu, 26 Oct 2023 14:44:41 +0100 Subject: [PATCH] update sud file management to more efficiently skip to the correct part of a sud file when reading data offline. --- dependency-reduced-pom.xml | 2 +- pom.xml | 8 +- src/Acquisition/pamAudio/WavAudioFile.java | 11 +- src/PamController/PamguardVersionInfo.java | 2 +- .../dataOffline/OfflineDataLoading.java | 158 ++++++++++-------- 5 files changed, 101 insertions(+), 80 deletions(-) diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml index b5d893d2..cf5d92d7 100644 --- a/dependency-reduced-pom.xml +++ b/dependency-reduced-pom.xml @@ -4,7 +4,7 @@ org.pamguard Pamguard Pamguard Java12+ - 2.02.09 + 2.02.09b Pamguard for Java 12+, using Maven to control dependcies www.pamguard.org diff --git a/pom.xml b/pom.xml index 6bae56a9..e76420fa 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 org.pamguard Pamguard - 2.02.09a + 2.02.09b Pamguard Java12+ Pamguard for Java 12+, using Maven to control dependcies www.pamguard.org @@ -782,13 +782,13 @@ +C:\Users\*yourusername*\.m2\repository\pamguard\org\x3\2.2.2--> pamguard.org x3 - 2.2.2 + 2.2.3 + diff --git a/src/Acquisition/pamAudio/WavAudioFile.java b/src/Acquisition/pamAudio/WavAudioFile.java index bf0ec6d0..b20a4b1b 100644 --- a/src/Acquisition/pamAudio/WavAudioFile.java +++ b/src/Acquisition/pamAudio/WavAudioFile.java @@ -14,6 +14,7 @@ import javax.sound.sampled.UnsupportedAudioFileException; import org.codehaus.plexus.util.FileUtils; import Acquisition.offlineFuncs.AquisitionLoadPoint; import PamDetection.RawDataUnit; +//import PamUtils.CPUMonitor; import PamguardMVC.PamDataBlock; import PamguardMVC.dataOffline.OfflineDataLoadInfo; import dataMap.OfflineDataMap; @@ -70,9 +71,13 @@ public class WavAudioFile implements PamAudioFileLoader { FileDataMapPoint mapPoint = offlineFileServer.findFirstMapPoint(mapIt, offlineDataLoadInfo.getStartMillis(), offlineDataLoadInfo.getEndMillis()); if (openSoundFile(mapPoint.getSoundFile()) == false) { - System.out.println("Could not open .wav sound file " + mapPoint.getSoundFile().getAbsolutePath()); + System.out.println("Could not open sound file " + mapPoint.getSoundFile().getAbsolutePath()); return false; } + if (offlineDataLoadInfo.cancel) { + return false; + } + File soundFile; ByteConverter byteConverter = ByteConverter.createByteConverter(audioFormat); @@ -106,7 +111,11 @@ public class WavAudioFile implements PamAudioFileLoader { try { //System.out.println("Skipped " + skipped+ " " + skipBytes + " " + audioInputStream.available()); +// CPUMonitor cpuMonitor = new CPUMonitor(); +// cpuMonitor.start(); skipped = audioInputStream.skip(skipBytes); +// cpuMonitor.stop(); +// System.out.println(cpuMonitor.getSummary("Sound skip: " + skipBytes + " bytes ")); //System.out.println("Offline " + (offlineDataLoadInfo.getStartMillis()-currentTime) + " ms : frame size: " + audioFormat.getFrameSize()); } catch (IOException e) { diff --git a/src/PamController/PamguardVersionInfo.java b/src/PamController/PamguardVersionInfo.java index b7e3b529..a5d16d78 100644 --- a/src/PamController/PamguardVersionInfo.java +++ b/src/PamController/PamguardVersionInfo.java @@ -31,7 +31,7 @@ public class PamguardVersionInfo { * Version number, major version.minorversion.sub-release. * Note: can't go higher than sub-release 'f' */ - static public final String version = "2.02.09a"; + static public final String version = "2.02.09b"; /** * Release date diff --git a/src/PamguardMVC/dataOffline/OfflineDataLoading.java b/src/PamguardMVC/dataOffline/OfflineDataLoading.java index c10a716c..0e9dbb3f 100644 --- a/src/PamguardMVC/dataOffline/OfflineDataLoading.java +++ b/src/PamguardMVC/dataOffline/OfflineDataLoading.java @@ -129,8 +129,8 @@ public class OfflineDataLoading { this.orderOfflineData(offlineDataInfo); } - - + + /** * Clears all raw and FFT data blocks prior to a new load. */ @@ -140,7 +140,7 @@ public class OfflineDataLoading { datablocks.get(i).clearAll(); datablocks.get(i).clearDeletedList(); } - + datablocks = PamController.getInstance().getRawDataBlocks(); for (int i=0; i { long t4 = t2; // String orderDates = String.format(" %s to %s", // PamCalendar.formatDateTime(startMillis), PamCalendar.formatDateTime(endMillis)); -// System.out.printf("Offline data order in %s %s from %s to %s\n", pamDataBlock.getDataName(), offlineDataInfo.toString(), -// PamCalendar.formatDBDateTime(offlineDataInfo.getStartMillis()), -// PamCalendar.formatDBDateTime(offlineDataInfo.getEndMillis())); -// if (offlineDataInfo.getEndMillis()-offlineDataInfo.getStartMillis() > 3600000L) { -// System.out.printf("Stupid long load time !"); -// return; -// } + // System.out.printf("Offline data order in %s %s from %s to %s\n", pamDataBlock.getDataName(), offlineDataInfo.toString(), + // PamCalendar.formatDBDateTime(offlineDataInfo.getStartMillis()), + // PamCalendar.formatDBDateTime(offlineDataInfo.getEndMillis())); + // if (offlineDataInfo.getEndMillis()-offlineDataInfo.getStartMillis() > 3600000L) { + // System.out.printf("Stupid long load time !"); + // return; + // } try { - if (orderData != null) { - // System.out.println("order Data is not null"); - if (orderData.isDone() == false) { - switch (offlineDataInfo.getInterrupt()) { - case OFFLINE_DATA_INTERRUPT: - // System.out.println("Request order cancelling"); + if (orderData != null) { + // System.out.println("order Data is not null"); + if (orderData.isDone() == false) { + switch (offlineDataInfo.getInterrupt()) { + case OFFLINE_DATA_INTERRUPT: + // System.out.println("Request order cancelling"); - if (orderData.cancelOrder()) { + if (orderData.cancelOrder()) { - while (orderData!=null || !orderData.isDone()) { - try { - Thread.sleep(10); - } catch (InterruptedException e) { - e.printStackTrace(); - return; + while (orderData!=null || !orderData.isDone()) { + try { + Thread.sleep(10); + } catch (InterruptedException e) { + e.printStackTrace(); + return; + } } } + else { + // System.out.println("Old order could not be cancelled"); + } + break; + case OFFLINE_DATA_CANCEL: + // System.out.println("Don't order new data " + orderDates); + return; + case OFFLINE_DATA_WAIT: + int waitCount = 0; + t3 = System.currentTimeMillis(); + waitingDataLoads.add(offlineDataInfo); + return; + // // System.out.println("Wait for old lot to complete " + orderDates); + // while (true) { + // if (orderData==null || orderData.isDone() || orderData.isCancelled()) { + // break; + // } + // waitCount++; + // try { + // Thread.sleep(10, 0); + // } catch (InterruptedException e) { + // e.printStackTrace(); + // } + // } } - else { - // System.out.println("Old order could not be cancelled"); - } - break; - case OFFLINE_DATA_CANCEL: - // System.out.println("Don't order new data " + orderDates); - return; - case OFFLINE_DATA_WAIT: - int waitCount = 0; - t3 = System.currentTimeMillis(); - waitingDataLoads.add(offlineDataInfo); - return; -// // System.out.println("Wait for old lot to complete " + orderDates); -// while (true) { -// if (orderData==null || orderData.isDone() || orderData.isCancelled()) { -// break; -// } -// waitCount++; -// try { -// Thread.sleep(10, 0); -// } catch (InterruptedException e) { -// e.printStackTrace(); -// } -// } + t4 = System.currentTimeMillis() - t3; } - t4 = System.currentTimeMillis() - t3; } } - } catch (NullPointerException e) { // happens when orderData is set null in a different thread. } @@ -244,8 +244,8 @@ public class OfflineDataLoading { //t = new Timer(1000, new StartOrderOnTimer(orderData)); } // end of order lock } - - + + /** * Cancels the current order. */ @@ -259,16 +259,19 @@ public class OfflineDataLoading { * @param que */ public void cancelDataOrder(boolean que) { - synchronized (orderLock) { - if (orderData != null) { - try { - orderData.cancelOrder(); - } - catch (NullPointerException e) { - System.err.println("Null pointer in Cancel data order " + e.getMessage()); +// threadMessage("Calling cancelDataOrder"); + synchronized (orderLock) { +// threadMessage("cancelDataOrder is in synchronized oderLock"); + if (orderData != null) { + try { + boolean isCancelled = orderData.cancelOrder(); +// threadMessage("candelDataOrder returned: isCancelled = " + isCancelled); + } + catch (NullPointerException e) { + System.err.println("Null pointer in Cancel data order " + e.getMessage()); + } } } - } if (que) this.waitingDataLoads.clear(); } /** @@ -319,16 +322,19 @@ public class OfflineDataLoading { @Override protected Integer doInBackground() { +// threadMessage("Start background"); try { -// System.out.println("Enter get offline data " + pamDataBlock.getDataName() + " Thread " + Thread.currentThread().getName()); - + // System.out.println("Enter get offline data " + pamDataBlock.getDataName() + " Thread " + Thread.currentThread().getName()); + clearAllFFTBlocks(); +// threadMessage("Called clearAllFTBlocks"); int ans = getOfflineData(offlineDataInfo); -// System.out.println("Leave get offline data " + pamDataBlock.getDataName()); + // System.out.println("Leave get offline data " + pamDataBlock.getDataName()); if (this == orderData) { orderData = null; } +// threadMessage("End background exit code " + ans); return ans; } catch (Exception e) { @@ -338,8 +344,8 @@ public class OfflineDataLoading { } return 0; } - } + @Override protected void done() { @@ -354,7 +360,7 @@ public class OfflineDataLoading { if (isCancelled()) { status = REQUEST_INTERRUPTED; //check whether the cancelled thread should be saved for later loading. -// System.out.println("The load has been cancelled: " + offlineDataInfo.getCurrentObserver().getObserverName()); + // System.out.println("The load has been cancelled: " + offlineDataInfo.getCurrentObserver().getObserverName()); checkDataReloadQue(offlineDataInfo); } else { @@ -376,11 +382,11 @@ public class OfflineDataLoading { } -// System.out.println("WAITING DATA LOAD"); + // System.out.println("WAITING DATA LOAD"); for (int i=0; i { } +// private void threadMessage(String message) { +// String name = Thread.currentThread().getName(); +// String now = PamCalendar.formatDBDateTime(System.currentTimeMillis(), true); +// System.out.printf("Thread %s load for %s at %s: %s\n", name, pamDataBlock.getDataName(), now, message); +// } + private void launchQuedReloadThread(){ -// System.out.println(" launchQuedReloadThread(): "); + // System.out.println(" launchQuedReloadThread(): "); if (waitingDataLoads.size()>=1){ OfflineDataLoadInfo offlineDataInfo=waitingDataLoads.get(0); -// System.out.println("Removing: " + offlineDataInfo.getCurrentObserver().getObserverName()); + // System.out.println("Removing: " + offlineDataInfo.getCurrentObserver().getObserverName()); waitingDataLoads.remove(0); this.orderOfflineData(offlineDataInfo); } @@ -470,15 +482,15 @@ public class OfflineDataLoading { pamDataBlock.clearAll(); -// System.out.println("Start loading some offline data: from " + PamCalendar.formatDateTime(offlineDataInfo.getStartMillis() ) +" to "+ -// PamCalendar.formatDateTime(offlineDataInfo.getEndMillis() ) + " "+offlineDataInfo.getCurrentObserver().getObserverName() + -// " "+offlineDataInfo.getLoadKeepLayers()); + // System.out.println("Start loading some offline data: from " + PamCalendar.formatDateTime(offlineDataInfo.getStartMillis() ) +" to "+ + // PamCalendar.formatDateTime(offlineDataInfo.getEndMillis() ) + " "+offlineDataInfo.getCurrentObserver().getObserverName() + + // " "+offlineDataInfo.getLoadKeepLayers()); lastRequestAnswer = pamDataBlock.getParentProcess().getOfflineData(offlineDataInfo); // System.out.println(String.format("getOfflineData %s has %d units ", // getDataName(), getUnitsCount())); -// System.out.println("Orderring done: " + offlineDataInfo.getCurrentObserver().getObserverName() + " " + offlineDataInfo.getLoadKeepLayers()); + // System.out.println("Orderring done: " + offlineDataInfo.getCurrentObserver().getObserverName() + " " + offlineDataInfo.getLoadKeepLayers()); //reset some of the changeable variables in offline data info. offlineDataInfo.reset();