📄 mixcanvas.java
字号:
/* * * Copyright (c) 2007, Sun Microsystems, Inc. * * All rights reserved. * * 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 Sun Microsystems 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 example.audiodemo;import java.io.*;import javax.microedition.lcdui.*;import javax.microedition.media.*;import javax.microedition.media.control.*;import javax.microedition.midlet.*;public class MixCanvas extends Canvas implements CommandListener { private static final String TITLE_TEXT = "Mix Demo"; private static final int[] notes = { 69, 70, 71, 72, 73, 74, 75, 76 }; static Player wavPlayer = null; static Player tonePlayer = null; static Image logo = null; private int idx = 0; private int ip = 0; Display parentDisplay; private Command backCommand = new Command("Back", Command.BACK, 1); private Command playCommand = new Command("Play", Command.ITEM, 1); private Command pauseCommand = new Command("Pause", Command.ITEM, 1); private Command toneCommand = new Command("Tone", Command.ITEM, 1); private Alert alert; //In case the user ended the player using the back command //or the 'End' button (the red one), if the WavPlayer did not //start yet there is a possibility that it will start after a while. //stopSound is here to catch this case and avoid playing the sound. private boolean stopSound = false; public MixCanvas(Display parentDisplay) { super(); this.idx = 0; this.parentDisplay = parentDisplay; initialize(); } void initialize() { addCommand(backCommand); setCommandListener(this); try { logo = Image.createImage("/icons/Duke.png"); } catch (Exception ex) { logo = null; } if (logo == null) { System.out.println("can not load Duke.png"); } alert = new Alert("Warning", "Can not create player", null, null); alert.setTimeout(1000); } /* * Respond to commands, including back */ public void commandAction(Command c, Displayable s) { if (s == this) { if (c == backCommand) { stopSound(); parentDisplay.setCurrent(MixTest.getList()); } else if (c == toneCommand) { try { Manager.playTone(notes[ip], 1000, 100); ip++; if (ip >= 8) { ip = 0; } } catch (Exception ex) { System.out.println("get an exception for tone"); } } else if (c == playCommand) { playSound(); } else if (c == pauseCommand) { pauseSound(); } } } public void setIndex(int idx) { this.idx = idx; } private void createWavPlayer() { try { if (wavPlayer == null) { if (MixTest.wavUrl.startsWith("resource")) { int idx = MixTest.wavUrl.indexOf(':'); String loc = MixTest.wavUrl.substring(idx + 1); InputStream is = getClass().getResourceAsStream(loc); String ctype = guessContentType(MixTest.wavUrl); wavPlayer = Manager.createPlayer(is, ctype); } else { wavPlayer = Manager.createPlayer(MixTest.wavUrl); } wavPlayer.setLoopCount(-1); } if (stopSound) { return; } wavPlayer.start(); } catch (Exception ex) { // ex.printStackTrace(); if (wavPlayer != null) { wavPlayer.close(); wavPlayer = null; } parentDisplay.setCurrent(alert); } } private static String guessContentType(String url) throws Exception { String ctype; // some simple test for the content type if (url.endsWith("wav")) { ctype = "audio/x-wav"; } else if (url.endsWith("jts")) { ctype = "audio/x-tone-seq"; } else if (url.endsWith("mid")) { ctype = "audio/midi"; } else { throw new Exception("Cannot guess content type from URL: " + url); } return ctype; } private void createTonePlayer() { byte d = 8; byte C4 = ToneControl.C4; byte D4 = ToneControl.C4 + 2; // a whole step byte E4 = ToneControl.C4 + 4; // a major third byte G4 = ToneControl.C4 + 7; // a fifth byte rest = ToneControl.SILENCE; // eighth-note rest byte[] mySequence = new byte[] { ToneControl.VERSION, 1, ToneControl.TEMPO, 30, ToneControl.BLOCK_START, 0, E4, d, D4, d, C4, d, D4, d, E4, d, E4, d, E4, d, rest, d, ToneControl.BLOCK_END, 0, ToneControl.PLAY_BLOCK, 0, D4, d, D4, d, D4, d, rest, d, E4, d, G4, d, G4, d, rest, d, //play "B" section ToneControl.PLAY_BLOCK, 0, // content of "A" section D4, d, D4, d, E4, d, D4, d, C4, d, rest, d // play "C" section }; try { if (tonePlayer == null) { tonePlayer = Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR); tonePlayer.setLoopCount(-1); tonePlayer.realize(); ToneControl tc = (ToneControl)tonePlayer.getControl( "javax.microedition.media.control.ToneControl"); tc.setSequence(mySequence); } if ((tonePlayer != null) && !stopSound) { tonePlayer.start(); } } catch (Exception ex) { // ex.printStackTrace(); if (tonePlayer != null) { tonePlayer.close(); tonePlayer = null; } parentDisplay.setCurrent(alert); } } public void playSound() { stopSound = false; switch (idx) { case 0: // wave + tone addCommand(toneCommand); removeCommand(pauseCommand); removeCommand(playCommand); createWavPlayer(); break; case 1: // toneseq + tone addCommand(toneCommand); removeCommand(pauseCommand); removeCommand(playCommand); createTonePlayer(); break; case 2: // toneseq + wave removeCommand(playCommand); removeCommand(toneCommand); addCommand(pauseCommand); createWavPlayer(); createTonePlayer(); break; } } public void stopSound() { stopSound = true; if (tonePlayer != null) { tonePlayer.close(); tonePlayer = null; } if (wavPlayer != null) { wavPlayer.close(); wavPlayer = null; } removeCommand(toneCommand); removeCommand(pauseCommand); removeCommand(playCommand); } public void pauseSound() { removeCommand(pauseCommand); addCommand(playCommand); try { if (wavPlayer != null) { wavPlayer.stop(); } } catch (MediaException me) { System.err.println(me); } try { if (tonePlayer != null) { tonePlayer.stop(); } } catch (MediaException me) { System.err.println(me); } } public boolean isPlaying() { return ((tonePlayer != null) && (tonePlayer.getState() >= Player.STARTED)) || ((wavPlayer != null) && (wavPlayer.getState() >= Player.STARTED)); } public void paint(Graphics g) { int w = getWidth(); int h = getHeight(); String cname = ""; switch (idx) { case 0: cname = "test-wav.wav"; break; case 1: cname = "tone seq"; break; case 2: cname = "wave+toneseq"; break; } g.setColor(0); g.fillRect(0, 0, w, h); if (logo != null) { g.drawImage(logo, w / 2, 30, Graphics.TOP | Graphics.HCENTER); } g.setColor(0xFF7f00); g.drawString(TITLE_TEXT, w / 2, 8, Graphics.TOP | Graphics.HCENTER); g.drawString(cname, 0, 84, Graphics.TOP | Graphics.LEFT); } protected void keyPressed(int keycode) { switch (keycode) { case KEY_STAR: changeVolume(-10); break; case KEY_POUND: changeVolume(10); break; } } private void changeVolume(int diff) { VolumeControl vc; if (wavPlayer != null) { vc = (VolumeControl)wavPlayer.getControl("VolumeControl"); if (vc != null) { int cv = vc.getLevel(); cv += diff; cv = vc.setLevel(cv); } } if (tonePlayer != null) { vc = (VolumeControl)tonePlayer.getControl("VolumeControl"); if (vc != null) { int cv = vc.getLevel(); cv += diff; cv = vc.setLevel(cv); } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -