/*
* @(#)CaptureDeviceManager.java 1.5 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
package javax.media.cdm;
import java.util.Vector;
import java.util.Enumeration;
import java.io.IOException;
import javax.media.*;
import javax.media.format.*;
import com.sun.media.util.Registry;
/**
* This is a manager class that fetches a list of devices available
* on the system. It uses a registry mechanism and/or query mechanism
* to locate devices and return CaptureDeviceInfo objects for each available
* device. The CaptureDeviceManager can also be used to register new devices
* by adding a device and calling commit().<P>
* @since JMF 2.0
*/
public class CaptureDeviceManager extends javax.media.CaptureDeviceManager {
static Vector devices = null;
static {
readFromRegistry();
}
public CaptureDeviceManager() {
readFromRegistry();
}
/**
* Returns a list of CaptureDeviceInfo objects for each of the registered devices.
* @return a list of CaptureDeviceInfo objects for each of the registered devices.
*/
public static synchronized Vector getDeviceList() {
return getDeviceList(null);
}
/**
* Returns the CaptureDeviceInfo corresponding to the specified name of the
* device. For example: "SunVideo". Returns null if the device could
* not be found.
* @return the CaptureDeviceInfo corresponding to the specified name of theo * device.
*/
public static synchronized CaptureDeviceInfo getDevice(java.lang.String deviceName) {
if (devices == null)
return null;
Enumeration enum = devices.elements();
while (enum.hasMoreElements()) {
CaptureDeviceInfo cdi = (CaptureDeviceInfo) enum.nextElement();
if (cdi.getName().equals(deviceName))
return cdi;
}
return null;
}
/**
* Returns a list of CaptureDeviceInfo objects corresponding to devices that can capture
* data with the specified data format. If format is null then it returns all registered
* objects
* @return a list of CaptureDeviceInfo objects for the given data format.
*/
public static synchronized Vector getDeviceList(Format format) {
if (devices == null)
return null;
if (format == null)
return devices;
Vector newList = new Vector();
Enumeration enum = devices.elements();
while (enum.hasMoreElements()) {
CaptureDeviceInfo cdi = (CaptureDeviceInfo) enum.nextElement();
Format [] formats = cdi.getFormats();
for (int i = 0; i < formats.length; i++) {
if (formats[i].matches(format)) {
newList.addElement(cdi);
break;
}
}
}
if (newList.size() > 0)
return newList;
else
return null;
}
/**
* Adds a CaptureDeviceInfo object to the list. This information is not
* stored permanently in any registry. If a similar CaptureDeviceInfo
* object is already registered, then the new device is not added.
* @see #commit
* @return true if the object could be added, false otherwise.
*/
public static synchronized boolean addDevice(CaptureDeviceInfo newDevice) {
if (newDevice != null) {
if (devices == null)
devices = new Vector();
else {
Enumeration enum = devices.elements();
while (enum.hasMoreElements()) {
CaptureDeviceInfo cdi = (CaptureDeviceInfo) enum.nextElement();
if (cdi.equals(newDevice)) {
return false;
}
}
}
devices.addElement(newDevice);
return true;
}
return false;
}
/**
* Removes a CaptureDeviceInfo object from the list.
* @see #commit
*/
public static synchronized boolean removeDevice(CaptureDeviceInfo device) {
if ( devices == null ||
device == null ||
device.getName() == null)
return false;
Enumeration enum = devices.elements();
while (enum.hasMoreElements()) {
CaptureDeviceInfo cdi = (CaptureDeviceInfo) enum.nextElement();
if (cdi == device) {
devices.removeElement(cdi);
return true;
}
}
return false;
}
/**
* Permanently store information about the list of devices in a registry.
* @return false if the commit fails.
*/
public static synchronized void commit() throws IOException {
Registry r = new Registry();
r.removeGroup("CDM");
if (devices == null) {
r.set("CDM.nDevices", new Integer(0));
} else {
r.set("CDM.nDevices", new Integer(devices.size()));
int i = 0;
Enumeration enum = devices.elements();
while (enum.hasMoreElements()) {
CaptureDeviceInfo cdi = (CaptureDeviceInfo) enum.nextElement();
r.set("CDM." + i, cdi);
i++;
}
}
try {
r.commit();
} catch (Exception e) {
System.err.println("Exception on commit = " + e);
}
}
private static synchronized void readFromRegistry() {
if (devices != null)
return;
devices = new Vector();
Registry r = new Registry();
Object size = r.get("CDM.nDevices");
if (size == null || ((Integer)size).intValue() == 0)
return;
for (int i = 0; i < ((Integer)size).intValue(); i++) {
Object cdi = r.get("CDM." + i);
if (cdi != null && cdi instanceof CaptureDeviceInfo)
devices.addElement(cdi);
}
}
}
|