/*
* @(#)CaptureDeviceManager.java 1.16 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
package javax.media;
import javax.media.format.*;
import java.util.Vector;
import java.lang.reflect.*;
import java.io.IOException;
/**
* <CODE>CaptureDeviceManager</CODE> is a manager class that provides access to
* a list of the capture devices available on a system.
* <CODE>CaptureDeviceManager</CODE> uses a registry and query mechanisms
* to locate devices and return <CODE>CaptureDeviceInfo</CODE> objects for available
* devices. The <CODE>CaptureDeviceManager</CODE> is also used to register new capture devices.
* @since JMF 2.0
*/
public class CaptureDeviceManager {
private static CaptureDeviceManager cdm = null;
private static Method mGetDeviceList = null;
private static Method mGetDevice = null;
private static Method mAddDevice = null;
private static Method mRemoveDevice = null;
private static Method mCommit = null;
static {
// Look for javax.media.cdm.CaptureDeviceManager
try {
Class classCDM = Class.forName("javax.media.cdm.CaptureDeviceManager");
if (classCDM != null) {
Object tryCDM = classCDM.newInstance();
if (tryCDM instanceof CaptureDeviceManager) {
cdm = (CaptureDeviceManager) tryCDM;
mGetDeviceList =
PackageManager.getDeclaredMethod(classCDM,
"getDeviceList",
new Class[] {Format.class});
mGetDevice =
PackageManager.getDeclaredMethod(classCDM,
"getDevice",
new Class[] {String.class});
mCommit =
PackageManager.getDeclaredMethod(classCDM,
"commit", null);
mAddDevice =
PackageManager.getDeclaredMethod(classCDM,
"addDevice",
new Class[] {CaptureDeviceInfo.class});
mRemoveDevice =
PackageManager.getDeclaredMethod(classCDM,
"removeDevice",
new Class[] {CaptureDeviceInfo.class});
}
}
} catch (ClassNotFoundException cnfe) {
System.err.println(cnfe);
} catch (InstantiationException ie) {
System.err.println(ie);
} catch (IllegalAccessException iae) {
System.err.println(iae);
} catch (SecurityException se) {
System.err.println(se);
} catch (NoSuchMethodException e) {
System.err.println(e);
}
}
private static Object runMethod(Method m, Object [] params) {
try {
return m.invoke(null, params);
} catch (IllegalAccessException iae) {
System.err.println(iae);
} catch (IllegalArgumentException iare) {
System.err.println(iare);
} catch (InvocationTargetException ite) {
System.err.println(ite);
}
return null;
}
/**
* Gets a <CODE>CaptureDeviceInfo</CODE> object that corresponds to the specified device.
* @param deviceName A <CODE>String</CODE> that contains the name of the device for
* which you want to get a <CODE>CaptureDeviceInfo</CODE> object.
* For example: "SunVideo".
* @return A <CODE>CaptureDeviceInfo</CODE> object that corresponds to the specified device name.
* Returns null if the specified device could
* not be found.
*/
public static CaptureDeviceInfo getDevice(java.lang.String deviceName) {
if (cdm != null && mGetDevice != null) {
Object params[] = new Object[1];
params[0] = deviceName;
return (CaptureDeviceInfo) runMethod(mGetDevice, params);
} else
return null;
}
/**
* Gets a list of <CODE>CaptureDeviceInfo</CODE> objects that correspond to devices
* that can capture data in the specified <CODE>Format</CODE>.
* If no <CODE>Format</CODE> is specified, this method returns a list of
* <CODE>CaptureDeviceInfo</CODE> objects for all of the available capture devices.
*
* @return A <CODE>Vector</CODE> that contains <CODE>CaptureDeviceInfo</CODE> objects
* for the devices that support the specified <CODE>Format</CODE>.
*/
public static Vector getDeviceList(Format format) {
if (cdm != null && mGetDeviceList != null) {
Object params[] = new Object[1];
params[0] = format;
Vector returnVal = (Vector) runMethod(mGetDeviceList, params);
if (returnVal == null)
return new Vector(1);
else
return returnVal;
} else
return new Vector(1);
}
/**
* Adds a <CODE>CaptureDeviceInfo</CODE> object for a new capture device
* to the list of devices maintained by the
* <CODE>CaptureDeviceManager</CODE>. This information is not
* stored permanently in any registry unless <CODE>commit</CODE> is called.
* @param newDevice A <CODE>CaptureDeviceInfo</CODE> object that identifies the new device.
* @see #commit
* @return <CODE>true</CODE> if the object is added successfully, <CODE>false</CODE> if it is not.
*/
public static boolean addDevice(CaptureDeviceInfo newDevice) {
if (cdm != null && mAddDevice != null) {
Object params[] = new Object[1];
params[0] = newDevice;
Object result = runMethod(mAddDevice, params);
if (result != null)
return ((Boolean)result).booleanValue();
else
return false;
} else
return false;
}
/**
* Removes a <CODE>CaptureDeviceInfo</CODE> object from the list of devices maintained by the
* <CODE>CaptureDeviceManager</CODE>. The change is not
* stored permanently in any registry unless <CODE>commit</CODE> is called.
* @param device A <CODE>CaptureDeviceInfo</CODE> object that identifies the device to remove.
* @see #commit
* @return <CODE>true</CODE> if the object is removed successfully, <CODE>false</CODE> if it is not.
*/
public static boolean removeDevice(CaptureDeviceInfo device) {
if (cdm != null && mRemoveDevice != null) {
Object params[] = new Object[1];
params[0] = device;
Object result = runMethod(mRemoveDevice, params);
if (result != null)
return ((Boolean)result).booleanValue();
else
return false;
} else
return false;
}
/**
* Permanently stores information about the list of devices in the registry.
* Commit must be called to save changes made to the device list by calling
* <CODE>addDevice</CODE> or <CODE>removeDevice</CODE>.
* @exception IOException If the registry could not be committed to disk due
* to an IO error.
*/
public static void commit() throws IOException {
if (cdm != null && mCommit != null) {
runMethod(mCommit, null);
}
}
}
|