/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package webcamstudio.channels;
import java.util.ArrayList;
import webcamstudio.streams.SourceChannel;
import webcamstudio.streams.Stream;
import webcamstudio.util.Tools;
/**
*
* @author patrick (modified by karl)
*/
public class MasterChannels {
static MasterChannels instance = null;
public static MasterChannels getInstance() {
if (instance==null){
instance = new MasterChannels();
}
return instance;
}
ArrayList<String> channelNames = new ArrayList<>();
ArrayList<Stream> streams = new ArrayList<>();
int rmAddIndex = 0;
ArrayList<SourceChannel> tempSC = null;
private MasterChannels(){
}
public void register(Stream s){
String streamName =s.getClass().getName();
streamName = streamName.replace("webcamstudio.streams.", "");
if (!s.getClass().toString().contains("Sink")){
System.out.println(streamName + " registered.");
}
streams.add(s);
}
public void unregister(Stream s){
if (!s.getClass().toString().contains("Sink")){
System.out.println(s.getName() + " unregistered.");
}
streams.remove(s);
}
public void addChannel(String name){
channelNames.add(name);
for (Stream s : streams){
s.addChannel(SourceChannel.getChannel(name, s));
}
}
public void addChTransitions(String name){
for (Stream s : streams){
for (SourceChannel sc : s.getChannels()) {
if (!sc.getName().equals(name)) {
// System.out.println("Adding to channel: "+sc.getName());
sc.startTransitions.clear();
sc.startTransitions.addAll(s.getStartTransitions());
sc.endTransitions.clear();
sc.endTransitions.addAll(s.getEndTransitions());
}
}
}
}
public void addToChannels(String name){
channelNames.add(name);
}
public void addChannelAt(String name, int index){
channelNames.add(index, name);
}
public void updateChannel(String name){
for (Stream s : streams){
String streamName =s.getClass().getName();
SourceChannel sc = null;
ArrayList<SourceChannel> sourceCh =s.getChannels();
int x = 0;
for (int i=0; i < sourceCh.size(); i++){
if (sourceCh.get(i).getName().equals(name)){
sc=sourceCh.get(i);
x = i;
break;
}
}
if (!streamName.contains("Sink")){
if (sc!=null){
s.removeChannelAt(x);
}
s.addChannelAt(SourceChannel.getChannel(name, s),x);
x=0;
}
}
}
public void insertStudio(String name){
for (Stream s : streams){
int co = 0;
for (SourceChannel ssc : s.getChannels()){
if (ssc.getName().equals(name)){
co++;
}
}
if (co == 0){
boolean backState = false;
if (s.isPlaying()){
s.setIsPlaying(false);
backState = true;
}
s.addChannel(SourceChannel.getChannel(name, s));
if (backState){
s.setIsPlaying(true);
}
} else {
ArrayList<String> allChan = new ArrayList<>();
for (String scn : MasterChannels.getInstance().getChannels()){
allChan.add(scn);
}
for (SourceChannel scc3 : s.getChannels()){
String removech = scc3.getName();
allChan.remove(removech);
}
for (String ssc2 : allChan) {
s.addChannel(SourceChannel.getChannel(ssc2, s));
}
}
}
}
public void removeChannel(String name){
channelNames.remove(name);
for (Stream s : streams){
SourceChannel toRemove = null;
for (SourceChannel sc : s.getChannels()){
if (sc.getName().equals(name)){
toRemove=sc;
}
}
if (toRemove!=null){
s.removeChannel(toRemove);
}
}
}
public void removeChannelAt(String name){
channelNames.remove(name);
}
public void removeChannelIndex(int index){
channelNames.remove(index);
}
public void selectChannel(String name){
for (Stream stream : streams){
for (SourceChannel sc : stream.getChannels()){
if (sc.getName().equals(name)){
sc.apply(stream);
break;
}
}
}
}
public ArrayList<String> getChannels(){
return channelNames;
}
public void stopAllStream(){
for (Stream s : streams){
// System.out.println("Stream stopped: "+s);
if (s.getLoop()) {
s.setLoop(false);
Tools.sleep(30);
s.stop();
s.setLoop(true);
} else {
Tools.sleep(30);
s.stop();
}
}
}
public void endAllStream(){
for (Stream s : streams){
if (s.getLoop()) {
s.setLoop(false);
Tools.sleep(30);
s.stop();
} else {
Tools.sleep(30);
s.stop();
}
}
}
public void stopTextCDown(){
for (Stream s : streams){
String streamName =s.getClass().getName();
if (!streamName.contains("Sink")){
if (streamName.endsWith("SourceText")) {
if (s.getIsACDown()) {
s.stop();
s.updateStatus();
}
}
}
}
}
public void stopOnlyStream(){
for (Stream s : streams){
String streamName =s.getClass().getName();
if (!streamName.contains("Sink")){
if (s.getLoop()) {
s.setLoop(false);
Tools.sleep(30);
s.stop();
s.setLoop(true);
} else {
Tools.sleep(30);
s.stop();
}
}
}
}
public ArrayList<Stream> getStreams(){
return streams;
}
}