r701 - in trunk: sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util sammoa-ui-swing/src/main/resources/i18n
Author: sbavencoff Date: 2014-06-05 10:01:34 +0200 (Thu, 05 Jun 2014) New Revision: 701 Url: http://forge.codelutin.com/projects/sammoa/repository/revisions/701 Log: fixes #4762 : disable soumd meter if system does not support, and show error message Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/AudioCheck.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SoundMeter.java trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java 2014-06-03 16:02:35 UTC (rev 700) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java 2014-06-05 08:01:34 UTC (rev 701) @@ -71,6 +71,86 @@ private static final Logger logger = LoggerFactory.getLogger(SammoaAudioRecorder.class); + public static boolean isMultiRecord() { + boolean multiRecord = true; + + AudioFormat audioFormat = new AudioFormat(8000.0f, 8, 1, true, true); + + DataLine.Info dataLineInfo = new DataLine.Info( + TargetDataLine.class, audioFormat); + + TargetDataLine line1 = null; + TargetDataLine line2 = null; + + try { + line1 = (TargetDataLine) AudioSystem.getLine(dataLineInfo); + line1.open(audioFormat); + line1.start(); + + line2 = (TargetDataLine) AudioSystem.getLine(dataLineInfo); + line2.open(audioFormat); + line2.start(); + + } catch (LineUnavailableException e) { + + multiRecord = false; + if (logger.isDebugEnabled()) { + logger.debug("Can't record multiple file at the same time", e); + } + if (logger.isInfoEnabled()) { + logger.info("Can't record multiple file at the same time, 0 " + + "second delay between recording must be used"); + } + + + } finally { + if (line1 != null) { + line1.stop(); + line1.close(); + } + if (line2 != null) { + line2.stop(); + line2.close(); + } + } + + return multiRecord; + + } + + public static boolean isCanAddRecord() { + boolean canAddRecord = true; + + AudioFormat audioFormat = new AudioFormat(8000.0f, 8, 1, true, true); + + DataLine.Info dataLineInfo = new DataLine.Info( + TargetDataLine.class, audioFormat); + + TargetDataLine line1 = null; + + try { + line1 = (TargetDataLine) AudioSystem.getLine(dataLineInfo); + line1.open(audioFormat); + line1.start(); + + } catch (LineUnavailableException e) { + canAddRecord = false; + + if (logger.isDebugEnabled()) { + logger.debug("Can't add new record", e); + } + + } finally { + if (line1 != null) { + line1.stop(); + line1.close(); + } + } + + return canAddRecord; + + } + protected AudioConfig config; protected AudioFormat audioFormat; Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/AudioCheck.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/AudioCheck.java 2014-06-03 16:02:35 UTC (rev 700) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/AudioCheck.java 2014-06-05 08:01:34 UTC (rev 701) @@ -32,17 +32,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.sound.sampled.LineUnavailableException; -import javax.swing.BorderFactory; -import javax.swing.Box; -import javax.swing.ButtonGroup; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JRadioButton; -import javax.swing.JTextArea; -import javax.swing.JTextField; +import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; @@ -50,7 +40,6 @@ import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; -import java.io.IOException; import java.util.Date; //import javax.media.CannotRealizeException; @@ -293,47 +282,27 @@ } protected void checkMultiRecord() { - SammoaAudioRecorder r1 = new SammoaAudioRecorder(8000, 16, "", 2); - SammoaAudioRecorder r2 = new SammoaAudioRecorder(8000, 16, "", 2); - try { - File f1 = File.createTempFile("sammoa-audioCheck-", ".wav"); - f1.deleteOnExit(); - File f2 = File.createTempFile("sammoa-audioCheck-", ".wav"); - f2.deleteOnExit(); + if (SammoaAudioRecorder.isMultiRecord()) { - r1.record(f1, true); - - r2.record(f2, true); - - r1.stop(); - r2.stop(); delay = 5; + if (logger.isInfoEnabled()) { logger.info("The recording delay is set to 5 seconds between " + - "each recording, you can update this value from" + - " configuration interface"); + "each recording, you can update this value from" + + " configuration interface"); } - } catch(IOException ex) { - if (logger.isErrorEnabled()) { - logger.error("Can't check audio line", ex); - } - SammoaUtil.showErrorMessage(this, "Can't check audio line : " + ex.getMessage()); + } else { - } catch(LineUnavailableException ex) { delay = 0; - if (logger.isDebugEnabled()) { - logger.debug("Can't record multiple file at the same time", ex); - } + if (logger.isInfoEnabled()) { logger.info("Can't record multiple file at the same time, 0 " + - "second delay between recording must be used"); + "second delay between recording must be used"); } - } finally { - r1.close(); - r2.close(); } + updateConfigInfo(); } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java 2014-06-03 16:02:35 UTC (rev 700) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java 2014-06-05 08:01:34 UTC (rev 701) @@ -32,6 +32,7 @@ import fr.ulr.sammoa.application.device.audio.AudioConfig; import fr.ulr.sammoa.application.device.audio.AudioReader; import fr.ulr.sammoa.application.device.audio.AudioRecorder; +import fr.ulr.sammoa.application.device.audio.SammoaAudioRecorder; import fr.ulr.sammoa.application.device.gps.GpsConfig; import fr.ulr.sammoa.application.device.gps.GpsHandler; import fr.ulr.sammoa.application.flightController.FlightController; @@ -57,9 +58,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.swing.*; +import javax.swing.JComponent; +import javax.swing.JOptionPane; +import javax.swing.UIManager; import javax.swing.plaf.BorderUIResource; -import java.awt.*; +import java.awt.Color; +import java.awt.Desktop; import java.io.File; import java.net.URL; import java.util.Calendar; @@ -125,7 +129,7 @@ //SwingUtil.getLayer(ui.getBody()).setUI(new BetaLayerUI()); UIManager.put("Table.focusCellHighlightBorder", - new BorderUIResource.LineBorderUIResource(Color.BLACK)); + new BorderUIResource.LineBorderUIResource(Color.BLACK)); setScreen(SammoaScreen.HOME); } @@ -391,8 +395,12 @@ } public void showAudioCheck() { - AudioCheck frame = new AudioCheck(); - frame.setVisible(true); + if (SammoaAudioRecorder.isCanAddRecord()) { + AudioCheck frame = new AudioCheck(); + frame.setVisible(true); + } else { + JOptionPane.showMessageDialog(ui, t("sammoa.audioCheck.unavailable"), t("sammoa.audioCheck.error"), JOptionPane.ERROR_MESSAGE); + } } protected void closeCurrentBody() { Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SoundMeter.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SoundMeter.java 2014-06-03 16:02:35 UTC (rev 700) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SoundMeter.java 2014-06-05 08:01:34 UTC (rev 701) @@ -24,6 +24,7 @@ import fr.ulr.sammoa.application.SammoaTechnicalException; import fr.ulr.sammoa.application.device.audio.AudioLevel; +import fr.ulr.sammoa.application.device.audio.SammoaAudioRecorder; import javax.sound.sampled.LineUnavailableException; import javax.swing.*; @@ -31,6 +32,8 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static org.nuiton.i18n.I18n.t; + /** * @author Sylvain Bavencoff <bavencoff@codelutin.com> */ @@ -55,31 +58,45 @@ protected Timer timer; public SoundMeter() { - try { - audioLevel = new AudioLevel(); - } catch (LineUnavailableException e) { - throw new SammoaTechnicalException(e); - } - timer = new Timer (REFRESH_TIME, new ActionListener(){ - public void actionPerformed (ActionEvent e) { - if (audioLevel != null) { - level = audioLevel.getLevel(); - } - repaint(); + if (SammoaAudioRecorder.isMultiRecord()) { + try { + audioLevel = new AudioLevel(); + } catch (LineUnavailableException e) { + throw new SammoaTechnicalException(e); } - }); + timer = new Timer(REFRESH_TIME, new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (audioLevel != null) { + level = audioLevel.getLevel(); + } + repaint(); + } + }); + } else { + setToolTipText(t("sammoa.toolTip.soundMeter.unavailable")); + setEnabled(false); + } + setBorder(BorderFactory.createLoweredBevelBorder()); } public void start() { - timer.start(); + if (timer != null) { + timer.start(); + } } public void stop() { - audioLevel.stop(); - timer.stop(); + if (audioLevel != null) { + audioLevel.stop(); + } + + if (timer != null) { + timer.stop(); + } + level = 0; repaint(); } @@ -87,40 +104,42 @@ public void paint (Graphics g) { super.paint(g); - Dimension d = getSize(); + if (isEnabled()) { + Dimension d = getSize(); - int borderThickness = 2; + int borderThickness = 2; - int height = d.height - (borderThickness * 2); - int width = d.width - (borderThickness * 2); + int height = d.height - (borderThickness * 2); + int width = d.width - (borderThickness * 2); - if (level > 0) { - if (level >= SATURATE_LEVEL) { - g.setColor(SATURATE_COLOR); - } else if (level >= WARNING_LEVEL) { - g.setColor(WARNING_COLOR); - } else { - g.setColor(LEVEL_COLOR); + if (level > 0) { + if (level >= SATURATE_LEVEL) { + g.setColor(SATURATE_COLOR); + } else if (level >= WARNING_LEVEL) { + g.setColor(WARNING_COLOR); + } else { + g.setColor(LEVEL_COLOR); + } + + int widthLevel = (int) (level * (float) width); + g.fillRect(borderThickness, borderThickness, widthLevel, height); } - int widthLevel = (int) (level * (float) width); - g.fillRect(borderThickness, borderThickness, widthLevel, height); - } + // echele + g.setColor(Color.black); + for (int step = 1; step < 10; step++) { + int x = borderThickness + step * width / 10; + g.drawLine(x, borderThickness + height * 3 / 4, x, borderThickness + height); + } - // echele - g.setColor(Color.black); - for (int step = 1; step < 10; step++) { - int x = borderThickness + step * width / 10; - g.drawLine(x, borderThickness + height * 3 / 4, x, borderThickness + height); + g.setColor(WARNING_COLOR); + int x = borderThickness + (int) (WARNING_LEVEL * width); + g.drawLine(x, borderThickness, x, borderThickness + height); + + g.setColor(SATURATE_COLOR); + x = borderThickness + (int) (SATURATE_LEVEL * width); + g.drawLine(x, borderThickness, x, borderThickness + height); } - - g.setColor(WARNING_COLOR); - int x = borderThickness + (int) (WARNING_LEVEL * width); - g.drawLine(x, borderThickness, x, borderThickness + height); - - g.setColor(SATURATE_COLOR); - x = borderThickness + (int) (SATURATE_LEVEL * width); - g.drawLine(x, borderThickness, x, borderThickness + height); } } Modified: trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties =================================================================== --- trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2014-06-03 16:02:35 UTC (rev 700) +++ trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2014-06-05 08:01:34 UTC (rev 701) @@ -64,6 +64,8 @@ sammoa.action.validTransect=Transect sammoa.action.validTransect.tip=Validate the selected transect and all its routes and sightings sammoa.action.validation=Validation +sammoa.audioCheck.error=Audio check Error +sammoa.audioCheck.unavailable=Your system does not support multiple audio recording sammoa.config.category.applications=Application sammoa.config.category.applications.description=Application sammoa.config.category.audio=Audio @@ -287,6 +289,7 @@ sammoa.title.flight=System %1$s - Campaign %2$s - Region %3$s - Flight n°%4$d sammoa.title.home=Home sammoa.title.importApplication=Application import +sammoa.toolTip.soundMeter.unavailable=Your system does not support sound meter sammoa.validable.flight=flight sammoa.validable.observation=sighting sammoa.validable.route=route
participants (1)
-
sbavencoff@users.forge.codelutin.com