fix camera selection issues on linux

This commit is contained in:
Craig Raw 2021-07-05 12:58:26 +02:00
parent ada45ee75b
commit 422713ff53
2 changed files with 26 additions and 2 deletions

View file

@ -131,6 +131,9 @@ public class QRScanDialog extends Dialog<QRScanDialog.Result> {
if(org.controlsfx.tools.Platform.getCurrent() == org.controlsfx.tools.Platform.WINDOWS && if(org.controlsfx.tools.Platform.getCurrent() == org.controlsfx.tools.Platform.WINDOWS &&
nested.getMessage().startsWith("Library 'OpenIMAJGrabber' was not loaded successfully from file")) { nested.getMessage().startsWith("Library 'OpenIMAJGrabber' was not loaded successfully from file")) {
exception = new WebcamDependencyException("Your system is missing a dependency required for the webcam. Follow the link below for more details.\n\n[https://sparrowwallet.com/docs/faq.html#your-system-is-missing-a-dependency-for-the-webcam]", exception); exception = new WebcamDependencyException("Your system is missing a dependency required for the webcam. Follow the link below for more details.\n\n[https://sparrowwallet.com/docs/faq.html#your-system-is-missing-a-dependency-for-the-webcam]", exception);
} else if(nested.getMessage().startsWith("Cannot start native grabber") && Config.get().getWebcamDevice() != null) {
exception = new WebcamOpenException("Cannot open configured webcam " + Config.get().getWebcamDevice() + ", reverting to the default webcam");
Config.get().setWebcamDevice(null);
} }
final Throwable result = exception; final Throwable result = exception;
@ -597,7 +600,7 @@ public class QRScanDialog extends Dialog<QRScanDialog.Result> {
} }
if(button instanceof Region) { if(button instanceof Region) {
((Region)button).setMaxWidth(140); ((Region)button).setMaxWidth(150);
} }
button.disableProperty().bind(webcamService.openingProperty()); button.disableProperty().bind(webcamService.openingProperty());
@ -783,6 +786,24 @@ public class QRScanDialog extends Dialog<QRScanDialog.Result> {
} }
} }
public static class WebcamOpenException extends ScanException {
public WebcamOpenException() {
super();
}
public WebcamOpenException(String message) {
super(message);
}
public WebcamOpenException(Throwable cause) {
super(cause);
}
public WebcamOpenException(String message, Throwable cause) {
super(message, cause);
}
}
public static class ScanDelayCalculator implements WebcamUpdater.DelayCalculator { public static class ScanDelayCalculator implements WebcamUpdater.DelayCalculator {
public long calculateDelay(long snapshotDuration, double deviceFps) { public long calculateDelay(long snapshotDuration, double deviceFps) {
return Math.max(SCAN_PERIOD_MILLIS - snapshotDuration, 0L); return Math.max(SCAN_PERIOD_MILLIS - snapshotDuration, 0L);

View file

@ -20,7 +20,10 @@ public class WebcamScanDriver extends WebcamDefaultDriver {
List<WebcamDevice> scanDevices = new ArrayList<>(); List<WebcamDevice> scanDevices = new ArrayList<>();
for(WebcamDevice device : devices) { for(WebcamDevice device : devices) {
WebcamDefaultDevice defaultDevice = (WebcamDefaultDevice)device; WebcamDefaultDevice defaultDevice = (WebcamDefaultDevice)device;
scanDevices.add(new WebcamScanDevice(defaultDevice.getDeviceRef())); WebcamScanDevice scanDevice = new WebcamScanDevice(defaultDevice.getDeviceRef());
if(scanDevices.stream().noneMatch(dev -> ((WebcamScanDevice)dev).getDeviceName().equals(scanDevice.getDeviceName()))) {
scanDevices.add(scanDevice);
}
} }
List<WebcamDevice> newDevices = new ArrayList<>(scanDevices); List<WebcamDevice> newDevices = new ArrayList<>(scanDevices);