/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package webcamstudio.streams;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import webcamstudio.channels.transitions.Transition;
import webcamstudio.sources.effects.Effect;
import webcamstudio.util.Tools;
/**
*
* @author patrick (modified by karl)
*/
public class SourceChannel {
public static SourceChannel getChannel(String channelName, Stream stream) {
SourceChannel s = new SourceChannel();
s.x = stream.x;
// System.out.println("Channel X: "+s.x);
s.y = stream.y;
// System.out.println("Channel Y: "+s.y);
s.width = stream.width;
// System.out.println("Channel Width: "+s.width);
s.height = stream.height;
// System.out.println("Channel Height: "+s.height);
s.opacity = stream.opacity;
s.effects.addAll(stream.effects);
s.startTransitions.addAll(stream.startTransitions);
s.endTransitions.addAll(stream.endTransitions);
s.volume = stream.volume;
s.zorder = stream.zorder;
s.name = channelName;
s.isPlaying = stream.isPlaying();
s.isPaused = stream.getisPaused();
s.capHeight = stream.captureHeight;
s.capWidth = stream.captureWidth;
if (stream instanceof SourceText) {
SourceText st = (SourceText) stream;
s.capHeight = st.getTextCW();
s.capWidth = st.getTextCH();
s.isATimer = st.getIsATimer();
s.isQRCode = st.getIsQRCode();
s.isACdown = st.getIsACDown();
s.isPlayList = st.getPlayList();
s.duration = st.getDuration();
s.text = st.content;
s.font = st.fontName;
s.color = st.color;
}
// System.out.println("Channel CapWidth: "+s.capWidth);
// System.out.println("Channel CapHeight: "+s.capHeight);
return s;
}
public static SourceChannel getChannelIgnoreContent(String channelName, Stream stream) {
SourceChannel s = new SourceChannel();
s.x = stream.x;
// System.out.println("Channel X: "+s.x);
s.y = stream.y;
// System.out.println("Channel Y: "+s.y);
s.width = stream.width;
// System.out.println("Channel Width: "+s.width);
s.height = stream.height;
// System.out.println("Channel Height: "+s.height);
s.opacity = stream.opacity;
s.effects.addAll(stream.effects);
s.startTransitions.addAll(stream.startTransitions);
s.endTransitions.addAll(stream.endTransitions);
s.volume = stream.volume;
s.zorder = stream.zorder;
s.name = channelName;
s.isPlaying = stream.isPlaying();
s.isPaused = stream.getisPaused();
s.capHeight = stream.captureHeight;
s.capWidth = stream.captureWidth;
if (stream instanceof SourceText) {
SourceText st = (SourceText) stream;
s.capHeight = st.getTextCW();
s.capWidth = st.getTextCH();
s.isATimer = st.getIsATimer();
s.isQRCode = st.getIsQRCode();
s.isACdown = st.getIsACDown();
s.isPlayList = st.getPlayList();
s.font = st.fontName;
s.color = st.color;
}
// System.out.println("Channel CapWidth: "+s.capWidth);
// System.out.println("Channel CapHeight: "+s.capHeight);
// System.out.println("Duration: "+s.getDuration());
return s;
}
public static SourceChannel getChannelIgnorePlay(String channelName, Stream stream) {
SourceChannel s = new SourceChannel();
s.x = stream.x;
// System.out.println("Channel X: "+s.x);
s.y = stream.y;
// System.out.println("Channel Y: "+s.y);
s.width = stream.width;
// System.out.println("Channel Width: "+s.width);
s.height = stream.height;
// System.out.println("Channel Height: "+s.height);
s.opacity = stream.opacity;
s.effects.addAll(stream.effects);
s.startTransitions.addAll(stream.startTransitions);
s.endTransitions.addAll(stream.endTransitions);
s.volume = stream.volume;
s.zorder = stream.zorder;
s.name = channelName;
s.capHeight = stream.captureHeight;
s.capWidth = stream.captureWidth;
if (stream instanceof SourceText) {
SourceText st = (SourceText) stream;
s.capHeight = st.getTextCW();
s.capWidth = st.getTextCH();
s.isATimer = st.getIsATimer();
s.isQRCode = st.getIsQRCode();
s.isACdown = st.getIsACDown();
s.isPlayList = st.getPlayList();
s.duration = st.getDuration();
s.text = st.content;
s.font = st.fontName;
s.color = st.color;
}
// System.out.println("Channel CapWidth: "+s.capWidth);
// System.out.println("Channel CapHeight: "+s.capHeight);
return s;
}
private int x = 0;
private int y = 0;
private int capWidth = 0;
private int capHeight = 0;
private int width = 0;
private int height = 0;
private int opacity = 0;
private float volume = 0;
private int zorder = 0;
private String text = "";
private String font = "";
private int color = 0;
private String name = "";
private boolean isATimer = false;
private boolean isQRCode = false;
private boolean isACdown = false;
private boolean isPlayList = false;
private int duration = 0;
private boolean isPlaying = false;
private boolean isPaused = false;
ArrayList<Effect> effects = new ArrayList<>();
private final boolean followMouse = false;
private final int captureX = 0;
private final int captureY = 0;
public ArrayList<Transition> startTransitions = new ArrayList<>();
public ArrayList<Transition> endTransitions = new ArrayList<>();
public SourceChannel() {
}
public String getName() {
return name;
}
public void setName(String n) {
name = n;
}
public void setText(String nt) {
text = nt;
}
public void setFont(String nf) {
font = nf;
}
public synchronized void addEffects(Effect fX) {
effects.add(fX);
}
public void apply(final Stream s) {
final SourceChannel instance = this;
new Thread(new Runnable() {
@Override
public void run() {
if (!s.getClass().toString().contains("Sink")){ // Don't Update SinkStreams
ExecutorService pool = java.util.concurrent.Executors.newCachedThreadPool();
if (endTransitions != null) {
for (Transition t : s.endTransitions) {
// System.out.println("End Transition: "+t.getClass().getName());
pool.submit(t.run(instance));
}
pool.shutdown();
try {
pool.awaitTermination(10, TimeUnit.SECONDS);
} catch (InterruptedException ex) {
Logger.getLogger(SourceChannel.class.getName()).log(Level.SEVERE, null, ex);
}
}
s.zorder = getZorder();
if (isPlaying) {
if (startTransitions != null) {
pool = java.util.concurrent.Executors.newCachedThreadPool();
for (Transition t : instance.startTransitions) {
// System.out.println("Start Transition: "+t.getClass().getName());
pool.submit(t.run(instance));
}
pool.shutdown();
try {
pool.awaitTermination(10, TimeUnit.SECONDS);
} catch (InterruptedException ex) {
Logger.getLogger(SourceChannel.class.getName()).log(Level.SEVERE, null, ex);
}
}
if (!s.isPlaying()) {
if (isPaused) {
s.setisPaused(true);
s.read();
Tools.sleep(100);
s.pause();
} else {
s.setisPaused(false);
s.read();
}
} else {
if (!isPaused) {
s.setisPaused(false);
s.play();
} else {
s.setisPaused(true);
s.pause();
}
}
} else {
if (s.getisPaused()) {
if (isPaused) {
s.pause();
} else {
s.pause();
s.stop();
}
} else {
if (s.isPlaying()) {
s.stop();
}
}
}
s.x = getX();
s.y = getY();
s.width = getWidth();
s.height = getHeight();
s.opacity = getOpacity();
s.volume = getVolume();
s.captureHeight = getCapHeight();
s.captureWidth = getCapWidth();
s.effects.clear();
s.startTransitions.clear();
s.endTransitions.clear();
if (effects != null) {
s.effects.addAll(effects);
}
if (startTransitions != null){
s.startTransitions.addAll(startTransitions);
}
if (endTransitions != null) {
s.endTransitions.addAll(endTransitions);
}
if (s instanceof SourceText) {
SourceText st = (SourceText) s;
st.isATimer = getIsATimer();
st.isQRCode = getIsQRCode();
st.isACDown = getIsACDown();
st.duration = getDuration();
st.content = getText();
st.fontName = getFont();
st.color = getColor();
st.isPlayList = getPlayList();
if (st.isACDown || st.isATimer) {
st.updateLineContent(getText());
} else {
st.updateContent(getText());
}
}
s.updateStatus();
}
}
}).start();
}
/**
* @return the x
*/
public int getX() {
return x;
}
public void setX(int xp) {
x = xp;
}
/**
* @return the y
*/
public int getY() {
return y;
}
public void setY(int yp) {
y = yp;
}
/**
* @return the capWidth
*/
public int getCapWidth() {
return capWidth;
}
public void setCapWidth(int cWidth) {
capWidth = cWidth;
}
/**
* @return the capHeight
*/
public int getCapHeight() {
return capHeight;
}
public void setCapHeight(int cHeight) {
capHeight = cHeight;
}
/**
* @return the width
*/
public int getWidth() {
return width;
}
public void setWidth(int cWidth) {
width = cWidth;
}
/**
* @return the height
*/
public int getHeight() {
return height;
}
public void setHeight(int cHeight) {
height = cHeight;
}
/**
* @return the opacity
*/
public int getOpacity() {
return opacity;
}
/**
* @return the volume
*/
public float getVolume() {
return volume;
}
/**
* @return the zorder
*/
public int getZorder() {
return zorder;
}
/**
* @return the text
*/
public String getText() {
return text;
}
/**
* @return the font
*/
public String getFont() {
return font;
}
/**
* @return the color
*/
public int getColor() {
return color;
}
public boolean getIsATimer() {
return isATimer;
}
public boolean getPlayList() {
return isPlayList;
}
public boolean getIsQRCode() {
return isQRCode;
}
public boolean getIsACDown() {
return isACdown;
}
public int getDuration() {
return duration;
}
public void setDuration(int t) {
duration = t;
}
public boolean getIsPlaying() {
return this.isPlaying;
}
public void setIsPlaying(boolean b) {
this.isPlaying = b;
}
/**
* @return the followMouse
*/
public boolean isFollowMouse() {
return followMouse;
}
/**
* @return the captureX
*/
public int getCaptureX() {
return captureX;
}
/**
* @return the captureY
*/
public int getCaptureY() {
return captureY;
}
}