src/share/classes/com/sun/media/sound/AbstractMixer.java

Print this page




  73      * if this mixer had been opened manually with open()
  74      * If it was, then it won't be closed automatically,
  75      * only when close() is called manually.
  76      */
  77     private boolean manuallyOpened = false;
  78 
  79 
  80     /**
  81      * Supported formats for the mixer.
  82      */
  83     //$$fb DELETE
  84     //protected Vector formats = new Vector();
  85 
  86 
  87     // STATE VARIABLES
  88 
  89 
  90     /**
  91      * Source lines (ports) currently open
  92      */
  93     private final Vector sourceLines = new Vector();
  94 
  95 
  96     /**
  97      * Target lines currently open.
  98      */
  99     private final Vector targetLines = new Vector();
 100 
 101 
 102     /**
 103      * Constructs a new AbstractMixer.
 104      * @param mixer the mixer with which this line is associated
 105      * @param controls set of supported controls
 106      */
 107     protected AbstractMixer(Mixer.Info mixerInfo,
 108                             Control[] controls,
 109                             Line.Info[] sourceLineInfo,
 110                             Line.Info[] targetLineInfo) {
 111 
 112         // Line.Info, AbstractMixer, Control[]
 113         super(new Line.Info(Mixer.class), null, controls);
 114 
 115         // setup the line part
 116         this.mixer = this;
 117         if (controls == null) {
 118             controls = new Control[0];
 119         }


 134 
 135 
 136     public final Line.Info[] getSourceLineInfo() {
 137         Line.Info[] localArray = new Line.Info[sourceLineInfo.length];
 138         System.arraycopy(sourceLineInfo, 0, localArray, 0, sourceLineInfo.length);
 139         return localArray;
 140     }
 141 
 142 
 143     public final Line.Info[] getTargetLineInfo() {
 144 
 145         Line.Info[] localArray = new Line.Info[targetLineInfo.length];
 146         System.arraycopy(targetLineInfo, 0, localArray, 0, targetLineInfo.length);
 147         return localArray;
 148     }
 149 
 150 
 151     public final Line.Info[] getSourceLineInfo(Line.Info info) {
 152 
 153         int i;
 154         Vector vec = new Vector();
 155 
 156         for (i = 0; i < sourceLineInfo.length; i++) {
 157 
 158             if (info.matches(sourceLineInfo[i])) {
 159                 vec.addElement(sourceLineInfo[i]);
 160             }
 161         }
 162 
 163         Line.Info[] returnedArray = new Line.Info[vec.size()];
 164         for (i = 0; i < returnedArray.length; i++) {
 165             returnedArray[i] = (Line.Info)vec.elementAt(i);
 166         }
 167 
 168         return returnedArray;
 169     }
 170 
 171 
 172     public final Line.Info[] getTargetLineInfo(Line.Info info) {
 173 
 174         int i;
 175         Vector vec = new Vector();
 176 
 177         for (i = 0; i < targetLineInfo.length; i++) {
 178 
 179             if (info.matches(targetLineInfo[i])) {
 180                 vec.addElement(targetLineInfo[i]);
 181             }
 182         }
 183 
 184         Line.Info[] returnedArray = new Line.Info[vec.size()];
 185         for (i = 0; i < returnedArray.length; i++) {
 186             returnedArray[i] = (Line.Info)vec.elementAt(i);
 187         }
 188 
 189         return returnedArray;
 190     }
 191 
 192 
 193     public final boolean isLineSupported(Line.Info info) {
 194 
 195         int i;
 196 
 197         for (i = 0; i < sourceLineInfo.length; i++) {
 198 
 199             if (info.matches(sourceLineInfo[i])) {
 200                 return true;
 201             }
 202         }
 203 
 204         for (i = 0; i < targetLineInfo.length; i++) {
 205 
 206             if (info.matches(targetLineInfo[i])) {


 214 
 215     public abstract Line getLine(Line.Info info) throws LineUnavailableException;
 216 
 217     public abstract int getMaxLines(Line.Info info);
 218 
 219     protected abstract void implOpen() throws LineUnavailableException;
 220     protected abstract void implStart();
 221     protected abstract void implStop();
 222     protected abstract void implClose();
 223 
 224 
 225     public final Line[] getSourceLines() {
 226 
 227         Line[] localLines;
 228 
 229         synchronized(sourceLines) {
 230 
 231             localLines = new Line[sourceLines.size()];
 232 
 233             for (int i = 0; i < localLines.length; i++) {
 234                 localLines[i] = (Line)sourceLines.elementAt(i);
 235             }
 236         }
 237 
 238         return localLines;
 239     }
 240 
 241 
 242     public final Line[] getTargetLines() {
 243 
 244         Line[] localLines;
 245 
 246         synchronized(targetLines) {
 247 
 248             localLines = new Line[targetLines.size()];
 249 
 250             for (int i = 0; i < localLines.length; i++) {
 251                 localLines[i] = (Line)targetLines.elementAt(i);
 252             }
 253         }
 254 
 255         return localLines;
 256     }
 257 
 258 
 259     /**
 260      * Default implementation always throws an exception.
 261      */
 262     public final void synchronize(Line[] lines, boolean maintainSync) {
 263         throw new IllegalArgumentException("Synchronization not supported by this mixer.");
 264     }
 265 
 266 
 267     /**
 268      * Default implementation always throws an exception.
 269      */
 270     public final void unsynchronize(Line[] lines) {
 271         throw new IllegalArgumentException("Synchronization not supported by this mixer.");


 436             started = true;
 437         }
 438 
 439         if (Printer.trace) Printer.trace("<< AbstractMixer: start(" + line + ") succeeded");
 440     }
 441 
 442 
 443     /**
 444      * Stops the mixer if this was the last running line.
 445      */
 446     final synchronized void stop(Line line) {
 447 
 448         if (Printer.trace) Printer.trace(">> AbstractMixer: stop(" + line + ")");
 449 
 450         // $$kk: 06.11.99: ignore ourselves for now
 451         if (this.equals(line)) {
 452             if (Printer.trace) Printer.trace("<< AbstractMixer: stop(" + line + ") nothing done");
 453             return;
 454         }
 455 
 456         Vector localSourceLines = (Vector)sourceLines.clone();

 457         for (int i = 0; i < localSourceLines.size(); i++) {
 458 
 459             // if any other open line is running, return
 460 
 461             // this covers clips and source data lines
 462             if (localSourceLines.elementAt(i) instanceof AbstractDataLine) {
 463                 AbstractDataLine sourceLine = (AbstractDataLine)localSourceLines.elementAt(i);
 464                 if ( sourceLine.isStartedRunning() && (!sourceLine.equals(line)) ) {
 465                     if (Printer.trace) Printer.trace("<< AbstractMixer: stop(" + line + ") found running sourceLine: " + sourceLine);
 466                     return;
 467                 }
 468             }
 469         }
 470 
 471         Vector localTargetLines = (Vector)targetLines.clone();

 472         for (int i = 0; i < localTargetLines.size(); i++) {
 473 
 474             // if any other open line is running, return
 475             // this covers target data lines
 476             if (localTargetLines.elementAt(i) instanceof AbstractDataLine) {
 477                 AbstractDataLine targetLine = (AbstractDataLine)localTargetLines.elementAt(i);
 478                 if ( targetLine.isStartedRunning() && (!targetLine.equals(line)) ) {
 479                     if (Printer.trace) Printer.trace("<< AbstractMixer: stop(" + line + ") found running targetLine: " + targetLine);
 480                     return;
 481                 }
 482             }
 483         }
 484 
 485         // otherwise, stop
 486         if (Printer.debug) Printer.debug("AbstractMixer: stop(line): stopping the mixer");
 487         started = false;
 488         implStop();
 489 
 490         if (Printer.trace) Printer.trace("<< AbstractMixer: stop(" + line + ") succeeded");
 491     }




  73      * if this mixer had been opened manually with open()
  74      * If it was, then it won't be closed automatically,
  75      * only when close() is called manually.
  76      */
  77     private boolean manuallyOpened = false;
  78 
  79 
  80     /**
  81      * Supported formats for the mixer.
  82      */
  83     //$$fb DELETE
  84     //protected Vector formats = new Vector();
  85 
  86 
  87     // STATE VARIABLES
  88 
  89 
  90     /**
  91      * Source lines (ports) currently open
  92      */
  93     private final Vector<Line> sourceLines = new Vector<>();
  94 
  95 
  96     /**
  97      * Target lines currently open.
  98      */
  99     private final Vector<Line> targetLines = new Vector<>();
 100 
 101 
 102     /**
 103      * Constructs a new AbstractMixer.
 104      * @param mixer the mixer with which this line is associated
 105      * @param controls set of supported controls
 106      */
 107     protected AbstractMixer(Mixer.Info mixerInfo,
 108                             Control[] controls,
 109                             Line.Info[] sourceLineInfo,
 110                             Line.Info[] targetLineInfo) {
 111 
 112         // Line.Info, AbstractMixer, Control[]
 113         super(new Line.Info(Mixer.class), null, controls);
 114 
 115         // setup the line part
 116         this.mixer = this;
 117         if (controls == null) {
 118             controls = new Control[0];
 119         }


 134 
 135 
 136     public final Line.Info[] getSourceLineInfo() {
 137         Line.Info[] localArray = new Line.Info[sourceLineInfo.length];
 138         System.arraycopy(sourceLineInfo, 0, localArray, 0, sourceLineInfo.length);
 139         return localArray;
 140     }
 141 
 142 
 143     public final Line.Info[] getTargetLineInfo() {
 144 
 145         Line.Info[] localArray = new Line.Info[targetLineInfo.length];
 146         System.arraycopy(targetLineInfo, 0, localArray, 0, targetLineInfo.length);
 147         return localArray;
 148     }
 149 
 150 
 151     public final Line.Info[] getSourceLineInfo(Line.Info info) {
 152 
 153         int i;
 154         Vector<Line.Info> vec = new Vector<>();
 155 
 156         for (i = 0; i < sourceLineInfo.length; i++) {
 157 
 158             if (info.matches(sourceLineInfo[i])) {
 159                 vec.addElement(sourceLineInfo[i]);
 160             }
 161         }
 162 
 163         Line.Info[] returnedArray = new Line.Info[vec.size()];
 164         for (i = 0; i < returnedArray.length; i++) {
 165             returnedArray[i] = vec.elementAt(i);
 166         }
 167 
 168         return returnedArray;
 169     }
 170 
 171 
 172     public final Line.Info[] getTargetLineInfo(Line.Info info) {
 173 
 174         int i;
 175         Vector<Line.Info> vec = new Vector<>();
 176 
 177         for (i = 0; i < targetLineInfo.length; i++) {
 178 
 179             if (info.matches(targetLineInfo[i])) {
 180                 vec.addElement(targetLineInfo[i]);
 181             }
 182         }
 183 
 184         Line.Info[] returnedArray = new Line.Info[vec.size()];
 185         for (i = 0; i < returnedArray.length; i++) {
 186             returnedArray[i] = vec.elementAt(i);
 187         }
 188 
 189         return returnedArray;
 190     }
 191 
 192 
 193     public final boolean isLineSupported(Line.Info info) {
 194 
 195         int i;
 196 
 197         for (i = 0; i < sourceLineInfo.length; i++) {
 198 
 199             if (info.matches(sourceLineInfo[i])) {
 200                 return true;
 201             }
 202         }
 203 
 204         for (i = 0; i < targetLineInfo.length; i++) {
 205 
 206             if (info.matches(targetLineInfo[i])) {


 214 
 215     public abstract Line getLine(Line.Info info) throws LineUnavailableException;
 216 
 217     public abstract int getMaxLines(Line.Info info);
 218 
 219     protected abstract void implOpen() throws LineUnavailableException;
 220     protected abstract void implStart();
 221     protected abstract void implStop();
 222     protected abstract void implClose();
 223 
 224 
 225     public final Line[] getSourceLines() {
 226 
 227         Line[] localLines;
 228 
 229         synchronized(sourceLines) {
 230 
 231             localLines = new Line[sourceLines.size()];
 232 
 233             for (int i = 0; i < localLines.length; i++) {
 234                 localLines[i] = sourceLines.elementAt(i);
 235             }
 236         }
 237 
 238         return localLines;
 239     }
 240 
 241 
 242     public final Line[] getTargetLines() {
 243 
 244         Line[] localLines;
 245 
 246         synchronized(targetLines) {
 247 
 248             localLines = new Line[targetLines.size()];
 249 
 250             for (int i = 0; i < localLines.length; i++) {
 251                 localLines[i] = targetLines.elementAt(i);
 252             }
 253         }
 254 
 255         return localLines;
 256     }
 257 
 258 
 259     /**
 260      * Default implementation always throws an exception.
 261      */
 262     public final void synchronize(Line[] lines, boolean maintainSync) {
 263         throw new IllegalArgumentException("Synchronization not supported by this mixer.");
 264     }
 265 
 266 
 267     /**
 268      * Default implementation always throws an exception.
 269      */
 270     public final void unsynchronize(Line[] lines) {
 271         throw new IllegalArgumentException("Synchronization not supported by this mixer.");


 436             started = true;
 437         }
 438 
 439         if (Printer.trace) Printer.trace("<< AbstractMixer: start(" + line + ") succeeded");
 440     }
 441 
 442 
 443     /**
 444      * Stops the mixer if this was the last running line.
 445      */
 446     final synchronized void stop(Line line) {
 447 
 448         if (Printer.trace) Printer.trace(">> AbstractMixer: stop(" + line + ")");
 449 
 450         // $$kk: 06.11.99: ignore ourselves for now
 451         if (this.equals(line)) {
 452             if (Printer.trace) Printer.trace("<< AbstractMixer: stop(" + line + ") nothing done");
 453             return;
 454         }
 455 
 456         @SuppressWarnings("unchecked")
 457         Vector<Line> localSourceLines = (Vector<Line>)sourceLines.clone();
 458         for (int i = 0; i < localSourceLines.size(); i++) {
 459 
 460             // if any other open line is running, return
 461 
 462             // this covers clips and source data lines
 463             if (localSourceLines.elementAt(i) instanceof AbstractDataLine) {
 464                 AbstractDataLine sourceLine = (AbstractDataLine)localSourceLines.elementAt(i);
 465                 if ( sourceLine.isStartedRunning() && (!sourceLine.equals(line)) ) {
 466                     if (Printer.trace) Printer.trace("<< AbstractMixer: stop(" + line + ") found running sourceLine: " + sourceLine);
 467                     return;
 468                 }
 469             }
 470         }
 471 
 472         @SuppressWarnings("unchecked")
 473         Vector<Line> localTargetLines = (Vector<Line>)targetLines.clone();
 474         for (int i = 0; i < localTargetLines.size(); i++) {
 475 
 476             // if any other open line is running, return
 477             // this covers target data lines
 478             if (localTargetLines.elementAt(i) instanceof AbstractDataLine) {
 479                 AbstractDataLine targetLine = (AbstractDataLine)localTargetLines.elementAt(i);
 480                 if ( targetLine.isStartedRunning() && (!targetLine.equals(line)) ) {
 481                     if (Printer.trace) Printer.trace("<< AbstractMixer: stop(" + line + ") found running targetLine: " + targetLine);
 482                     return;
 483                 }
 484             }
 485         }
 486 
 487         // otherwise, stop
 488         if (Printer.debug) Printer.debug("AbstractMixer: stop(line): stopping the mixer");
 489         started = false;
 490         implStop();
 491 
 492         if (Printer.trace) Printer.trace("<< AbstractMixer: stop(" + line + ") succeeded");
 493     }