diff --git a/buildNumber.properties b/buildNumber.properties index a792328..155add6 100644 --- a/buildNumber.properties +++ b/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Thu Feb 04 01:12:53 GMT 2021 -buildNumber=137 +#Sun Feb 07 22:19:12 GMT 2021 +buildNumber=145 diff --git a/snake-app-linux/buildNumber.properties b/snake-app-linux/buildNumber.properties index 526038f..abab5bb 100644 --- a/snake-app-linux/buildNumber.properties +++ b/snake-app-linux/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Thu Feb 04 01:12:59 GMT 2021 -buildNumber=123 +#Sun Feb 07 22:19:18 GMT 2021 +buildNumber=131 diff --git a/snake-backend-openrazer/buildNumber.properties b/snake-backend-openrazer/buildNumber.properties index b13404c..dd0c726 100644 --- a/snake-backend-openrazer/buildNumber.properties +++ b/snake-backend-openrazer/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Thu Feb 04 01:12:57 GMT 2021 -buildNumber=123 +#Sun Feb 07 22:19:16 GMT 2021 +buildNumber=131 diff --git a/snake-dist/buildNumber.properties b/snake-dist/buildNumber.properties index a69a465..494ba43 100644 --- a/snake-dist/buildNumber.properties +++ b/snake-dist/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Thu Feb 04 01:13:01 GMT 2021 -buildNumber=122 +#Sun Feb 07 22:19:20 GMT 2021 +buildNumber=130 diff --git a/snake-dist/pom.xml b/snake-dist/pom.xml index ec6caaa..096017b 100644 --- a/snake-dist/pom.xml +++ b/snake-dist/pom.xml @@ -85,6 +85,7 @@ install-location ${installer.home}/snake-razer jvmarg --add-modules jvmarg themes.awhitelight,themes.agreenfuture,themes.aredsky,themes.abluelife,themes.ayellowdwarf,themes.anorangetwist,themes.apinkburst,themes.apurplehaze + jvmarg -Djfreedesktop.quiet=true @@ -178,6 +179,7 @@ install-location ${installer.home}/snake-razer jvmarg --add-modules jvmarg themes.awhitelight,themes.agreenfuture,themes.aredsky,themes.abluelife,themes.ayellowdwarf,themes.anorangetwist,themes.apinkburst,themes.apurplehaze + jvmarg -Djfreedesktop.quiet=true diff --git a/snake-lib/buildNumber.properties b/snake-lib/buildNumber.properties index c10d8dd..8e6a609 100644 --- a/snake-lib/buildNumber.properties +++ b/snake-lib/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Thu Feb 04 01:12:55 GMT 2021 -buildNumber=136 +#Sun Feb 07 22:19:14 GMT 2021 +buildNumber=144 diff --git a/snake-themes/buildNumber.properties b/snake-themes/buildNumber.properties index b13404c..dd0c726 100644 --- a/snake-themes/buildNumber.properties +++ b/snake-themes/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Thu Feb 04 01:12:57 GMT 2021 -buildNumber=123 +#Sun Feb 07 22:19:16 GMT 2021 +buildNumber=131 diff --git a/snake-themes/snake-theme-abluelife/buildNumber.properties b/snake-themes/snake-theme-abluelife/buildNumber.properties index 6be298e..5e707c1 100644 --- a/snake-themes/snake-theme-abluelife/buildNumber.properties +++ b/snake-themes/snake-theme-abluelife/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Thu Feb 04 01:12:58 GMT 2021 -buildNumber=123 +#Sun Feb 07 22:19:17 GMT 2021 +buildNumber=131 diff --git a/snake-themes/snake-theme-agreenfuture/buildNumber.properties b/snake-themes/snake-theme-agreenfuture/buildNumber.properties index 6be298e..5e707c1 100644 --- a/snake-themes/snake-theme-agreenfuture/buildNumber.properties +++ b/snake-themes/snake-theme-agreenfuture/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Thu Feb 04 01:12:58 GMT 2021 -buildNumber=123 +#Sun Feb 07 22:19:17 GMT 2021 +buildNumber=131 diff --git a/snake-themes/snake-theme-anorangetwist/buildNumber.properties b/snake-themes/snake-theme-anorangetwist/buildNumber.properties index 6be298e..5e707c1 100644 --- a/snake-themes/snake-theme-anorangetwist/buildNumber.properties +++ b/snake-themes/snake-theme-anorangetwist/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Thu Feb 04 01:12:58 GMT 2021 -buildNumber=123 +#Sun Feb 07 22:19:17 GMT 2021 +buildNumber=131 diff --git a/snake-themes/snake-theme-apinkburst/buildNumber.properties b/snake-themes/snake-theme-apinkburst/buildNumber.properties index 6be298e..5e707c1 100644 --- a/snake-themes/snake-theme-apinkburst/buildNumber.properties +++ b/snake-themes/snake-theme-apinkburst/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Thu Feb 04 01:12:58 GMT 2021 -buildNumber=123 +#Sun Feb 07 22:19:17 GMT 2021 +buildNumber=131 diff --git a/snake-themes/snake-theme-apurplehaze/buildNumber.properties b/snake-themes/snake-theme-apurplehaze/buildNumber.properties index 526038f..5e707c1 100644 --- a/snake-themes/snake-theme-apurplehaze/buildNumber.properties +++ b/snake-themes/snake-theme-apurplehaze/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Thu Feb 04 01:12:59 GMT 2021 -buildNumber=123 +#Sun Feb 07 22:19:17 GMT 2021 +buildNumber=131 diff --git a/snake-themes/snake-theme-aredsky/buildNumber.properties b/snake-themes/snake-theme-aredsky/buildNumber.properties index 6be298e..5e707c1 100644 --- a/snake-themes/snake-theme-aredsky/buildNumber.properties +++ b/snake-themes/snake-theme-aredsky/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Thu Feb 04 01:12:58 GMT 2021 -buildNumber=123 +#Sun Feb 07 22:19:17 GMT 2021 +buildNumber=131 diff --git a/snake-themes/snake-theme-awhitelight/buildNumber.properties b/snake-themes/snake-theme-awhitelight/buildNumber.properties index b13404c..dd0c726 100644 --- a/snake-themes/snake-theme-awhitelight/buildNumber.properties +++ b/snake-themes/snake-theme-awhitelight/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Thu Feb 04 01:12:57 GMT 2021 -buildNumber=123 +#Sun Feb 07 22:19:16 GMT 2021 +buildNumber=131 diff --git a/snake-themes/snake-theme-ayellowdwarf/buildNumber.properties b/snake-themes/snake-theme-ayellowdwarf/buildNumber.properties index 6be298e..5e707c1 100644 --- a/snake-themes/snake-theme-ayellowdwarf/buildNumber.properties +++ b/snake-themes/snake-theme-ayellowdwarf/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Thu Feb 04 01:12:58 GMT 2021 -buildNumber=123 +#Sun Feb 07 22:19:17 GMT 2021 +buildNumber=131 diff --git a/snake-ui-linux/buildNumber.properties b/snake-ui-linux/buildNumber.properties index b13404c..dd0c726 100644 --- a/snake-ui-linux/buildNumber.properties +++ b/snake-ui-linux/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Thu Feb 04 01:12:57 GMT 2021 -buildNumber=123 +#Sun Feb 07 22:19:16 GMT 2021 +buildNumber=131 diff --git a/snake-ui/buildNumber.properties b/snake-ui/buildNumber.properties index 834f74a..5ad9a8e 100644 --- a/snake-ui/buildNumber.properties +++ b/snake-ui/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Thu Feb 04 01:12:57 GMT 2021 -buildNumber=124 +#Sun Feb 07 22:19:16 GMT 2021 +buildNumber=132 diff --git a/snake-ui/src/main/java/uk/co/bithatch/snake/ui/App.java b/snake-ui/src/main/java/uk/co/bithatch/snake/ui/App.java index 1a92502..99d8be1 100644 --- a/snake-ui/src/main/java/uk/co/bithatch/snake/ui/App.java +++ b/snake-ui/src/main/java/uk/co/bithatch/snake/ui/App.java @@ -467,11 +467,6 @@ else if (evt.getKey().equals(Configuration.PREF_TRANSPARENCY)) { PlatformService.get().setStartOnLogin(true); PREFS.putBoolean("installed", true); } - - addOnManager.start(); - effectManager.open(); - - new DesktopNotifications(this); } private void clearControllers() { @@ -525,6 +520,11 @@ private void createMainScene() throws IOException { try { if (!backendInited) { initBackend(); + + addOnManager.start(); + effectManager.open(); + + new DesktopNotifications(this); } if (!macroManager.isStarted()) @@ -535,6 +535,7 @@ private void createMainScene() throws IOException { } else { push(Overview.class, Direction.FADE); } + } catch (Exception e) { LOG.log(Level.ERROR, "Failed to initialize.", e); Error fc = openScene(Error.class, null); diff --git a/snake-ui/src/main/java/uk/co/bithatch/snake/ui/AudioOptions.java b/snake-ui/src/main/java/uk/co/bithatch/snake/ui/AudioOptions.java index 7be6411..f0b4063 100644 --- a/snake-ui/src/main/java/uk/co/bithatch/snake/ui/AudioOptions.java +++ b/snake-ui/src/main/java/uk/co/bithatch/snake/ui/AudioOptions.java @@ -67,13 +67,17 @@ protected void onConfigure() throws Exception { gain.setValue(cfg.getAudioGain()); gain.valueProperty().addListener((e, o, n) -> cfg.setAudioGain(n.floatValue())); + checkAudioState(context, this); + + } + + public static void checkAudioState(App context, AbstractController controller) { if (context.getAudioManager().getError() != null) { - notifyMessage(MessagePersistence.EVERYTIME, MessageType.DANGER, null, + controller.notifyMessage(MessagePersistence.EVERYTIME, MessageType.DANGER, null, MessageFormat.format(bundle.getString("error.noAudioSystem"), context.getAudioManager().getError().getLocalizedMessage()), 60); } - } @Override diff --git a/snake-ui/src/main/java/uk/co/bithatch/snake/ui/Cache.java b/snake-ui/src/main/java/uk/co/bithatch/snake/ui/Cache.java index db5ecd1..db7f21d 100644 --- a/snake-ui/src/main/java/uk/co/bithatch/snake/ui/Cache.java +++ b/snake-ui/src/main/java/uk/co/bithatch/snake/ui/Cache.java @@ -85,7 +85,10 @@ public String getCachedImage(String image) { resolved.put(image, cacheFile.toURI().toURL().toExternalForm()); } } catch (IOException ioe) { - LOG.log(Level.ERROR, "Failed to cache image.", ioe); + if(LOG.isLoggable(Level.DEBUG)) + LOG.log(Level.ERROR, "Failed to cache image.", ioe); + else + LOG.log(Level.ERROR, "Failed to cache image. " + ioe.getMessage()); resolved.put(image, image); return; } diff --git a/snake-ui/src/main/java/uk/co/bithatch/snake/ui/addons/AddOnManager.java b/snake-ui/src/main/java/uk/co/bithatch/snake/ui/addons/AddOnManager.java index fff7783..8998303 100644 --- a/snake-ui/src/main/java/uk/co/bithatch/snake/ui/addons/AddOnManager.java +++ b/snake-ui/src/main/java/uk/co/bithatch/snake/ui/addons/AddOnManager.java @@ -383,7 +383,7 @@ public void start() { try { startDeviceEffects(effect); } catch (Exception e) { - LOG.log(Level.ERROR, "Failed to start script.", e); + LOG.log(Level.ERROR, "Failed to start custom effects.", e); } } context.getBackend().addListener(this); diff --git a/snake-ui/src/main/java/uk/co/bithatch/snake/ui/audio/AudioManager.java b/snake-ui/src/main/java/uk/co/bithatch/snake/ui/audio/AudioManager.java index 03835ec..be180fb 100644 --- a/snake-ui/src/main/java/uk/co/bithatch/snake/ui/audio/AudioManager.java +++ b/snake-ui/src/main/java/uk/co/bithatch/snake/ui/audio/AudioManager.java @@ -100,7 +100,7 @@ public String toString() { private ScheduledFuture grabTask; private Configuration cfg; private ScheduledExecutorService queue; - private Exception error; + private Throwable error; public AudioManager(App context) { this.context = context; @@ -164,7 +164,7 @@ public List getSinks() { return backend == null ? Collections.emptyList() : backend.getSinks(); } - public Exception getError() { + public Throwable getError() { return error; } @@ -285,7 +285,64 @@ public void preferenceChange(PreferenceChangeEvent evt) { } protected AudioBackend createBackend() { - return new JImpulseAudioBackend(this); + try { + return new JImpulseAudioBackend(this); + } catch (UnsatisfiedLinkError | Exception e) { + error = e; + if (LOG.isLoggable(Level.DEBUG)) + LOG.log(Level.ERROR, "Failed to setup audio backend. Do you have libfftw-3 installed?", e); + else + LOG.log(Level.ERROR, + "Failed to setup audio backend. Do you have libfftw-3 installed? " + e.getLocalizedMessage()); + return new AudioBackend() { + + @Override + public void setSourceIndex(int index) { + } + + @Override + public void init() { + } + + @Override + public void stop() { + } + + @Override + public double[] getSnapshot(boolean audioFFT) { + return null; + } + + @Override + public List getSources() { + return Collections.emptyList(); + } + + @Override + public List getSinks() { + return Collections.emptyList(); + } + + @Override + public int getVolume(AudioSink sink) { + return 0; + } + + @Override + public void setVolume(AudioSink sink, int volume) { + } + + @Override + public boolean isMuted(AudioSink sink) { + return false; + } + + @Override + public void setMuted(AudioSink sink, boolean muted) { + } + + }; + } } @SuppressWarnings("resource") diff --git a/snake-ui/src/main/java/uk/co/bithatch/snake/ui/effects/EffectManager.java b/snake-ui/src/main/java/uk/co/bithatch/snake/ui/effects/EffectManager.java index 3f004ca..0da0be7 100644 --- a/snake-ui/src/main/java/uk/co/bithatch/snake/ui/effects/EffectManager.java +++ b/snake-ui/src/main/java/uk/co/bithatch/snake/ui/effects/EffectManager.java @@ -324,7 +324,12 @@ public void add(Device device, EffectHandler handler) { public void open() { context.getBackend().addListener(this); - context.getBackend().setSync(context.getPreferences().getBoolean(PREF_SYNC, false)); + try { + context.getBackend().setSync(context.getPreferences().getBoolean(PREF_SYNC, false)); + } + catch(Exception e) { + LOG.log(Level.ERROR, "Failed to set sync state.", e); + } } public void addListener(Listener listener) { diff --git a/snake-ui/src/main/java/uk/co/bithatch/snake/ui/tray/Tray.java b/snake-ui/src/main/java/uk/co/bithatch/snake/ui/tray/Tray.java index 7af920b..83fa21d 100644 --- a/snake-ui/src/main/java/uk/co/bithatch/snake/ui/tray/Tray.java +++ b/snake-ui/src/main/java/uk/co/bithatch/snake/ui/tray/Tray.java @@ -1,5 +1,6 @@ package uk.co.bithatch.snake.ui.tray; + import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; @@ -17,6 +18,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.lang.System.Logger.Level; import java.net.URL; import java.text.MessageFormat; import java.util.ArrayList; @@ -39,6 +41,7 @@ import dorkbox.systemTray.MenuItem; import dorkbox.systemTray.Separator; import dorkbox.systemTray.SystemTray; +import dorkbox.systemTray.util.SystemTrayFixes; import javafx.application.Platform; import uk.co.bithatch.macrolib.MacroSystem.RecordingListener; import uk.co.bithatch.macrolib.RecordingSession; @@ -66,6 +69,8 @@ public class Tray implements AutoCloseable, BackendListener, Listener, PreferenceChangeListener, RecordingListener { + final static System.Logger LOG = System.getLogger(Tray.class.getName()); + final static ResourceBundle bundle = ResourceBundle.getBundle(Tray.class.getName()); private Configuration cfg; @@ -107,6 +112,7 @@ public void close() throws Exception { Menu addDevice(Device device, Menu toMenu) throws IOException { var img = context.getDefaultImage(device.getType(), context.getCache().getCachedImage(device.getImage())); + Menu menu = null; if (img.startsWith("http:") || img.startsWith("https:")) { var url = new URL(img); var path = url.getPath(); @@ -119,13 +125,26 @@ Menu addDevice(Device device, Menu toMenu) throws IOException { try (var fos = new FileOutputStream(tf)) { try (InputStream is = url.openStream()) { is.transferTo(fos); + img = tf.getAbsolutePath(); + } + } catch(IOException ioe) { + try(InputStream in = SystemTrayFixes.class.getResource("error_32.png").openStream()) { + menu = new Menu(device.getName(), in); } + if(LOG.isLoggable(Level.DEBUG)) + LOG.log(Level.WARNING, "Failed to load device image.", ioe); + else + LOG.log(Level.WARNING, "Failed to load device image. " + ioe.getMessage() ); } - img = tf.getAbsolutePath(); } else if (img.startsWith("file:")) { img = img.substring(5); } - var menu = toMenu == null ? new Menu(device.getName(), img) : toMenu; + if(toMenu == null) { + if(menu == null) + menu = new Menu(device.getName(), img); + } + else + menu = toMenu; /* Open */ var openDev = new MenuItem(bundle.getString("open"), (e) -> Platform.runLater(() -> { diff --git a/snake-ui/src/main/resources/uk/co/bithatch/snake/ui/AudioOptions.properties b/snake-ui/src/main/resources/uk/co/bithatch/snake/ui/AudioOptions.properties index d2056b0..a73becc 100644 --- a/snake-ui/src/main/resources/uk/co/bithatch/snake/ui/AudioOptions.properties +++ b/snake-ui/src/main/resources/uk/co/bithatch/snake/ui/AudioOptions.properties @@ -15,4 +15,4 @@ audioEffectMode.ExpandAudioEffectMode=Growy audioEffectMode.BlobbyAudioEffectMode=Blobby audioEffectMode.BurstyAudioEffectMode=Bursty audioEffectMode.LineyAudioEffectMode=Liney -error.noAudioSystem=No audio system is available. {0}. \ No newline at end of file +error.noAudioSystem=No audio system is available. {0}. Do you have libpulse and libfftw-3 installed? \ No newline at end of file diff --git a/snake-updater/buildNumber.properties b/snake-updater/buildNumber.properties index a69a465..494ba43 100644 --- a/snake-updater/buildNumber.properties +++ b/snake-updater/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Thu Feb 04 01:13:01 GMT 2021 -buildNumber=122 +#Sun Feb 07 22:19:20 GMT 2021 +buildNumber=130 diff --git a/snake-widgets/buildNumber.properties b/snake-widgets/buildNumber.properties index 36d9b9f..6c8fc8a 100644 --- a/snake-widgets/buildNumber.properties +++ b/snake-widgets/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Thu Feb 04 01:12:54 GMT 2021 -buildNumber=150 +#Sun Feb 07 22:19:13 GMT 2021 +buildNumber=158 diff --git a/target/CHANGES.md b/target/CHANGES.md index 081c5c6..f0e7177 100644 --- a/target/CHANGES.md +++ b/target/CHANGES.md @@ -1,4 +1,4 @@ -# 1.0.0-SNAPSHOT-137 +# 1.0.0-SNAPSHOT-145 * Audio lighting effects. Requires `libpulse` and `libfftw-3` to be installed.