📄 playercanvas.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.*;import javax.microedition.rms.*;/** * The component for AudioPlayer. * It will create a player for the selected url, play and display * some properties of the player. * * Use star key to increase the volume, pound key to decrease the volume * **/public class PlayerCanvas extends Canvas implements Runnable, CommandListener { private static final String RECORD_STORE_NAME = "adrms"; private Player player; private Thread dThread; private Object dThreadLock = new Object(); private Object pauseLock = new Object(); private boolean interrupted; private boolean paused; private Image logo = null; private 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, 10); private String title; private String url; private String mtime; public PlayerCanvas(Display parentDisplay) { super(); this.parentDisplay = parentDisplay; initialize(); } private void initialize() { this.addCommand(backCommand); this.addCommand(pauseCommand); 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"); } } /* * simple implementation, not reflected actual state * of player. */ public void commandAction(Command c, Displayable s) { if (s == this) { if (c == backCommand) { stopSound(); removeCommand(playCommand); addCommand(pauseCommand); parentDisplay.setCurrent(AudioPlayer.getList()); } else if (c == playCommand) { playSound(); removeCommand(playCommand); addCommand(pauseCommand); } else if (c == pauseCommand) { pauseSound(); removeCommand(pauseCommand); addCommand(playCommand); } } } public void setParam(String url) { this.url = url; int idx = url.lastIndexOf('/'); title = url.substring(idx + 1); } public void playSound() { if ((title == null) || (url == null)) { return; } // player was paused if (player != null) { // wake up paused thread synchronized (pauseLock) { paused = false; pauseLock.notify(); } try { player.start(); } catch (MediaException me) { me.printStackTrace(); } return; } // start new player synchronized (dThreadLock) { stopSound(); interrupted = false; paused = false; mtime = ""; dThread = new Thread(this); dThread.start(); } } public void stopSound() { synchronized (dThreadLock) { try { interrupted = true; // wake up thread if it is paused synchronized (pauseLock) { pauseLock.notify(); } if (dThread != null) { dThreadLock.wait(); } } catch (InterruptedException ie) { // nothing } } } void pauseSound() { try { if (player != null) { // pause player player.stop(); paused = true; } } catch (MediaException ex) { ex.printStackTrace(); } } public boolean isPlaying() { return (player != null) && (player.getState() >= Player.STARTED); } 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; } void createPlayer() { try { if (url.startsWith("http:")) { player = Manager.createPlayer(url); } else if (url.startsWith("resource")) { int idx = url.indexOf(':'); String loc = url.substring(idx + 1); InputStream is = getClass().getResourceAsStream(loc); String ctype = guessContentType(url); player = Manager.createPlayer(is, ctype); } else if (url.startsWith("rms:")) { boolean created = false; InputStream stream = null; while (stream == null) { try { RecordStore rs = RecordStore.openRecordStore(RECORD_STORE_NAME, false); byte[] adata = rs.getRecord(1); rs.closeRecordStore(); stream = new ByteArrayInputStream(adata); break; // exit while loop } catch (Exception ex) { // record store not found } if (created) { // already tried to create record store! throw new Exception("Could not create and open record store!"); } created = true; createMyRecordStore(url, RECORD_STORE_NAME); } String ctype = guessContentType(url); player = Manager.createPlayer(stream, ctype); } player.setLoopCount(-1); } catch (Exception ex) { if (player != null) { player.close(); player = null; } Alert alert = new Alert("Warning", "Cannot create player", null, null); alert.setTimeout(1000); parentDisplay.setCurrent(alert); } } /** * Create a record store for the given url */ private void createMyRecordStore(String url, String name) { try { int idx = url.indexOf(':'); String loc = url.substring(idx + 1); InputStream is = getClass().getResourceAsStream(loc); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] tmp = new byte[1024]; int nread; while ((nread = is.read(tmp, 0, 1024)) > 0) { baos.write(tmp, 0, nread); } byte[] data = baos.toByteArray(); is.close(); // create a RecordStore RecordStore rs = RecordStore.openRecordStore(name, true); rs.addRecord(data, 0, data.length); rs.closeRecordStore(); System.out.println("created record store '" + name + "' with contents of " + loc); } catch (Exception ex) { ex.printStackTrace(); } } public void paint(Graphics g) { int w = getWidth(); int h = getHeight(); g.setColor(0); g.fillRect(0, 0, w, h); g.setColor(0xFF7f00); g.drawString("Audio Player", w / 2, 8, Graphics.TOP | Graphics.HCENTER); if (logo != null) { g.drawImage(logo, w / 2, 30, Graphics.TOP | Graphics.HCENTER); } g.setColor(0xFF7f00); g.drawString("Audio Player", w / 2, 8, Graphics.TOP | Graphics.HCENTER); g.drawString(title, w / 2, 84, Graphics.TOP | Graphics.HCENTER); g.drawString(mtime, 0, 150, Graphics.TOP | Graphics.LEFT); } public void run() { /* * method playSound() runs on GUI thread. * Manager.createPlayer() will potentially invoke a blocking * I/O. This is not the good practice recommended by MIDP * programming style. So here we will create the * Player in a separate thread. */ createPlayer(); if (player == null) { // can't create player synchronized (dThreadLock) { dThread = null; dThreadLock.notify(); return; } } try { player.realize(); long dur = player.getDuration(); if (dur != -1) { title = title + " [" + timeFM(dur) + "]"; } player.start(); } catch (Exception ex) { } // mtime update loop while (!interrupted) { try { mtime = timeFM(player.getMediaTime()); repaint(0, 110, 100, 170); Thread.sleep(100); } catch (Exception ex) { } // pause the loop if player paused synchronized (pauseLock) { if (paused) { try { pauseLock.wait(); } catch (InterruptedException ie) { // nothing } } } } // terminating player and the thread player.close(); player = null; synchronized (dThreadLock) { dThread = null; dThreadLock.notify(); } } 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 (player != null) { vc = (VolumeControl)player.getControl("VolumeControl"); if (vc != null) { int cv = vc.getLevel(); cv += diff; cv = vc.setLevel(cv); } } } private String timeFM(long val) { String ret = ""; int mval = (int)(val / 1000); int sec = mval / 1000; int min = sec / 60; if (min >= 10) { ret = ret + min + ":"; } else if (min > 0) { ret = "0" + min + ":"; } else { ret = "00:"; } if (sec >= 10) { ret = ret + sec + "."; } else if (sec > 0) { ret = ret + "0" + sec + "."; } else { ret = ret + "00."; } mval = (mval % 1000) / 100; ret = ret + mval; return (ret); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -