FileDocCategorySizeDatePackage
DSoundST.javaAPI DocJMF 2.1.1e2647Mon May 12 12:21:20 BST 2003com.sun.media.protocol.dsound

DSoundST.java

package com.sun.media.protocol.dsound;

import javax.media.format.AudioFormat;
import java.lang.reflect.Method;
import java.lang.reflect.Constructor;

import com.sun.media.JMFSecurity;
import com.sun.media.JMFSecurityManager;
import com.ms.security.PermissionID;
import com.ms.security.PolicyEngine;

public class DSoundST extends DSound implements Runnable {

    private static final int REQ_OPEN = 1;
    private static final int REQ_FLUSH = 2;
    private static final int REQ_START = 3;
    private static final int REQ_STOP = 4;
    private static final int REQ_CLOSE = 5;
    private static final int REQ_READ = 6;

    protected boolean failure = false;
    protected Thread requestThread = null;
    protected Integer requestLock = new Integer(0);
    protected int request = 0;
    protected int result;
    protected byte [] data;
    protected int offset;
    protected int len;

    
    public DSoundST(AudioFormat format, int bufferSize) {
	super(format, bufferSize);
    }

    private void waitForRequest(int req) {
	synchronized (requestLock) {
	    request = req;
	    requestLock.notifyAll();
	    while (request > 0) {
		try {
		    requestLock.wait(100);
		} catch (InterruptedException ie) {
		}
	    }
	}
    }

    public void open() {
	if (requestThread == null) {
	    requestThread = new Thread(this);
	    requestThread.start();
	}

	waitForRequest(REQ_OPEN);

	if (failure)
	    throw new Error("Error opening DSound for capture");
    }

    public void start() {
	waitForRequest(REQ_START);
    }

    public void stop() {
	waitForRequest(REQ_STOP);
    }

    public void flush() {
	waitForRequest(REQ_FLUSH);
    }

    public void close() {
	waitForRequest(REQ_CLOSE);
    }

    public int read(byte [] data, int offset, int len) {
	this.data = data;
	this.offset = offset;
	this.len = len;
	waitForRequest(REQ_READ);
	return result;
    }

    public void run() {
	boolean done = false;
	while (!done) {
	    synchronized (requestLock) {
		while (request == 0) {
		    try {
			requestLock.wait();
		    } catch (InterruptedException ie) {
		    }
		}
	    }
	    if (request > 0) {
		switch (request) {
		case REQ_OPEN:
		    try {
			super.open();
		    } catch (Error e) {
			failure = true;
		    }
		    break;
		case REQ_START:
		    super.start();
		    break;
		case REQ_STOP:
		    super.stop();
		    break;
		case REQ_READ:
		    result = super.read(data, offset, len);
		    break;
		case REQ_FLUSH:
		    super.flush();
		    break;
		case REQ_CLOSE:
		    super.close();
		    done = true;
		}
	    }
	    synchronized (requestLock) {
		request = 0;
		requestLock.notifyAll();
	    }
	}
    }
}