001: /*
002: * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
003: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
004: *
005: * This program is free software; you can redistribute it and/or
006: * modify it under the terms of the GNU General Public License version
007: * 2 only, as published by the Free Software Foundation.
008: *
009: * This program is distributed in the hope that it will be useful, but
010: * WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * General Public License version 2 for more details (a copy is
013: * included at /legal/license.txt).
014: *
015: * You should have received a copy of the GNU General Public License
016: * version 2 along with this work; if not, write to the Free Software
017: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
018: * 02110-1301 USA
019: *
020: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
021: * Clara, CA 95054 or visit www.sun.com if you need additional
022: * information or have any questions.
023: */
024: package javax.microedition.media;
025:
026: import java.util.Vector;
027: import java.io.IOException;
028: import java.io.InputStream;
029:
030: import java.util.Enumeration;
031: import java.util.Hashtable;
032: import com.sun.mmedia.TonePlayer;
033: import com.sun.mmedia.Configuration;
034:
035: import com.sun.mmedia.ABBBasicPlayer;
036:
037: /**
038: * This class is defined by the JSR-135 specification
039: * <em>Mobile Media API,
040: * Version 1.2.</em>
041: */
042: // JAVADOC COMMENT ELIDED
043: public final class Manager {
044: private static Configuration config = Configuration
045: .getConfiguration();
046: private static TonePlayer tonePlayer;
047: private static Object createLock = new Object();
048:
049: // JAVADOC COMMENT ELIDED
050: public final static String TONE_DEVICE_LOCATOR = "device://tone";
051:
052: private final static String DS_ERR = "Cannot create a DataSource for: ";
053:
054: private final static String PL_ERR = "Cannot create a Player for: ";
055:
056: private final static String REDIRECTED_MSG = " with exception message: ";
057:
058: /**
059: * This private constructor keeps anyone from actually
060: * getting a <CODE>Manager</CODE>.
061: */
062: private Manager() {
063: }
064:
065: // JAVADOC COMMENT ELIDED
066: public static String[] getSupportedContentTypes(String protocol) {
067: return config.getSupportedContentTypes(protocol);
068: }
069:
070: // JAVADOC COMMENT ELIDED
071: public static String[] getSupportedProtocols(String content_type) {
072: return config.getSupportedProtocols(content_type);
073: }
074:
075: // JAVADOC COMMENT ELIDED
076: public static Player createPlayer(String locator)
077: throws IOException, MediaException {
078:
079: if (locator == null) {
080: throw new IllegalArgumentException();
081: }
082:
083: String locStr = locator.toLowerCase();
084: String validLoc;
085:
086: if (locStr.equals(validLoc = TONE_DEVICE_LOCATOR)) {
087:
088: ABBBasicPlayer p;
089:
090: // separate device & encodings
091: int encInd = locator.indexOf('?');
092: String encStr = null;
093: if (encInd > 0) {
094: encStr = locator.substring(encInd + 1);
095: locStr = locStr.substring(0, encInd);
096: /*
097: * TBD: check case when '?' is the last Locator symbol:
098: *Will encStr be == "", or it will be == null ?
099: */
100: } else {
101: /*
102: * detect invalid locator case:
103: * if no '?' found then locStr & validLoc shall be
104: * equivalent strings, but since they have already passed
105: * char-to-char comparison, we to check lengths only...
106: */
107: if (locStr.length() != validLoc.length())
108: throw new MediaException("Malformed locator");
109: encStr = "";
110: }
111: String className = config.getHandler(locStr);
112: try {
113: // Try and instance the player ....
114: Class protoClass = Class.forName(className);
115: p = (ABBBasicPlayer) protoClass.newInstance();
116: // Pass encStr to created Player as argument
117: if (!p.initFromURL(encStr)) {
118: throw new MediaException(
119: "Invalid locator media encodings");
120: }
121: ;
122: //System.out.println("DEBUG: Manager.createPlayer(" + locator + ") returned#1 " + p);
123: return p;
124: } catch (Exception e) {
125: throw new MediaException(PL_ERR + locator
126: + REDIRECTED_MSG + e.getMessage());
127: }
128: } else {
129: // not in the list of predefined locators,
130: // find handler by extension
131:
132: String theProtocol = null;
133: int idx = locStr.indexOf(':');
134:
135: if (idx != -1) {
136: theProtocol = locStr.substring(0, idx);
137: } else {
138: throw new MediaException("Malformed locator");
139: }
140:
141: String[] supported = getSupportedProtocols(config
142: .ext2Mime(locStr));
143: boolean found = false;
144: for (int i = 0; i < supported.length; i++) {
145: if (theProtocol.equals(supported[i])) {
146: found = true;
147: break;
148: }
149: }
150:
151: if (!found) {
152: throw new MediaException(PL_ERR + locator);
153: }
154:
155: Player pp = null;
156:
157: throw new MediaException("Not supported");
158:
159: //System.out.println("DEBUG: Manager.createPlayer(" + locator + ") returned#2 " + pp);
160: // return pp;
161: }
162: }
163:
164: // JAVADOC COMMENT ELIDED
165: public static Player createPlayer(InputStream stream, String type)
166: throws IOException, MediaException {
167:
168: if (stream == null) {
169: throw new IllegalArgumentException();
170: }
171:
172: if (type == null) {
173: throw new MediaException(PL_ERR + "NULL content-type");
174: }
175:
176: throw new MediaException("Not supported");
177: }
178:
179: // JAVADOC COMMENT ELIDED
180: public static void playTone(int note, int duration, int volume)
181: throws MediaException {
182:
183: if (note < 0 || note > 127 || duration <= 0) {
184: throw new IllegalArgumentException("bad param");
185: }
186:
187: if (duration == 0 || volume == 0) {
188: return;
189: }
190:
191: synchronized (createLock) {
192: if (tonePlayer == null) {
193: tonePlayer = config.getTonePlayer();
194: }
195: }
196:
197: if (tonePlayer != null) {
198: tonePlayer.playTone(note, duration, volume);
199: } else {
200: throw new MediaException("no tone player");
201: }
202: }
203: }
|