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 } |