/* * Copyright (c) 2008, 2014, Oracle and/or its affiliates. * All rights reserved. Use is subject to license terms. * * This file is available and licensed under the following license: * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * - Neither the name of Oracle Corporation nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package ensemble.samples.charts.bar.audio; import javafx.application.Application; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.chart.BarChart; import javafx.scene.chart.CategoryAxis; import javafx.scene.chart.NumberAxis; import javafx.scene.chart.XYChart; import javafx.scene.media.AudioSpectrumListener; import javafx.scene.media.Media; import javafx.scene.media.MediaPlayer; import javafx.stage.Stage; /** * Bar chart that shows audio spectrum of a music file being played. * * @sampleName Audio Bar Chart * @preview preview.png * @see javafx.scene.chart.BarChart * @see javafx.scene.chart.Chart * @see javafx.scene.chart.CategoryAxis * @see javafx.scene.chart.NumberAxis * @see javafx.scene.chart.XYChart * @see javafx.scene.media.AudioSpectrumListener * @see javafx.scene.media.Media * @see javafx.scene.media.MediaPlayer * @conditionalFeatures WEB, MEDIA */ public class AudioBarChartApp extends Application { private XYChart.Data[] series1Data; private AudioSpectrumListener audioSpectrumListener; private static final String AUDIO_URI = System.getProperty("demo.audio.url", "http://download.oracle.com/otndocs/products/javafx/oow2010-2.flv"); private MediaPlayer audioMediaPlayer; private static final boolean PLAY_AUDIO = Boolean.parseBoolean( System.getProperty("demo.play.audio", "true")); public AudioBarChartApp() { audioSpectrumListener = (double timestamp, double duration, float[] magnitudes, float[] phases) -> { for (int i = 0; i < series1Data.length; i++) { series1Data[i].setYValue(magnitudes[i] + 60); } }; } public void play() { this.startAudio(); } @Override public void stop() { this.stopAudio(); } public Parent createContent() { final CategoryAxis xAxis = new CategoryAxis(); final NumberAxis yAxis = new NumberAxis(0, 50, 10); final BarChart bc = new BarChart<>(xAxis, yAxis); bc.getStylesheets().add(AudioBarChartApp.class.getResource("AudioBarChart.css").toExternalForm()); bc.setLegendVisible(false); bc.setAnimated(false); bc.setBarGap(0); bc.setCategoryGap(1); bc.setVerticalGridLinesVisible(false); // setup chart bc.setTitle("Live Audio Spectrum Data"); xAxis.setLabel("Frequency Bands"); yAxis.setLabel("Magnitudes"); yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxis, null, "dB")); // add starting data XYChart.Series series1 = new XYChart.Series<>(); series1.setName("Data Series 1"); //noinspection unchecked series1Data = new XYChart.Data[128]; String[] categories = new String[128]; for (int i = 0; i < series1Data.length; i++) { categories[i] = Integer.toString(i + 1); series1Data[i] = new XYChart.Data(categories[i], 50); series1.getData().add(series1Data[i]); } bc.getData().add(series1); return bc; } private void startAudio() { if (PLAY_AUDIO) { getAudioMediaPlayer() .setAudioSpectrumListener(audioSpectrumListener); getAudioMediaPlayer().play(); } } private void stopAudio() { if (getAudioMediaPlayer().getAudioSpectrumListener() == audioSpectrumListener) { getAudioMediaPlayer().pause(); } } private MediaPlayer getAudioMediaPlayer() { if (audioMediaPlayer == null) { Media audioMedia = new Media(AUDIO_URI); audioMediaPlayer = new MediaPlayer(audioMedia); audioMediaPlayer.setCycleCount(MediaPlayer.INDEFINITE); } return audioMediaPlayer; } @Override public void start(Stage primaryStage) throws Exception { primaryStage.setScene(new Scene(createContent())); primaryStage.show(); play(); } /** * Java main for when running without JavaFX launcher * @param args command line arguments */ public static void main(String[] args) { launch(args); } }