142 lines
3.7 KiB
Java

package com.bernard.sboard;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import com.bernard.sboard.config.SBoardConfig;
import com.bernard.sboard.effects.EffectsBox;
import com.bernard.sboard.osc.OscServer;
import com.bernard.sboard.osc.OscUtils;
import com.bernard.sboard.osc.SOscMessage;
import com.fasterxml.jackson.databind.DatabindException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
public class SBoard {
public SBoardConfig config;
public Random random;
public static final String configFilename = System.getProperty("user.home")+"/.config/sboard.yml";
public Logger log = LogManager.getLogger(SBoard.class);
EffectsBox ebox;
RepeatBox rbox;
SoundBox sbox;
MixerBox mbox;
JackController jackc;
OscServer oscserv;
public SBoard(SBoardConfig config) {
this.config = config;
this.random = new Random();
ebox = new EffectsBox(this, config.effects);
ebox.setup();
rbox = new RepeatBox();
sbox = new SoundBox();
mbox = new MixerBox();
jackc = new JackController(config, ebox, rbox, sbox, mbox);
jackc.setup();
oscserv = new OscServer(this, config.osc);
try {
oscserv.setup();
} catch (IOException e) {
log.error("Could not start the oscserver",e);
}
}
public static void main(String[] args) throws InterruptedException, IOException {
//TODO: passer sur quelque chose de plus configurable
BasicConfigurator.configure();
SBoardConfig config = readConfig(configFilename);
SBoard sboard = new SBoard(config);
Thread.sleep(100_000);
sboard.close();
System.exit(0);
}
public void close() {
try {
oscserv.close();
}catch(IOException e) {
log.error("Could not close osc server", e);
}
try{
jackc.close();
}catch(IOException e){
log.error("Could not close jack server", e);
}
ebox.close();
rbox.close();
sbox.close();
mbox.close();
}
public static SBoardConfig readConfig(String configFName) {
Logger configLog = LogManager.getLogger("Config Loader");
SBoardConfig output = null;
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
File configFile = new File(configFName);
if(!configFile.exists()) {
// On écrit le fichier
configLog.info("Création d'un nouveau fichier de configuration.");
try {
configFile.createNewFile();
mapper.writeValue(new FileOutputStream(configFile), new SBoardConfig());
} catch (DatabindException e) {
configLog.error("Le fichier écrit n'est pas un fichier de configuration valide !",e);
} catch (IOException e) {
configLog.error("Impossible d'écrire le fichier de configuration par défaut !",e);
}
}
configLog.info("Lecture du fichier de configuration.");
try {
output = mapper.readValue(configFile,SBoardConfig.class);
if(output==null)
configLog.error("Impossible de lire le fichier de configuration !");
} catch (DatabindException e) {
configLog.error("Le fichier lu n'est pas un fichier de configuration valide !",e);
} catch (IOException e) {
configLog.error("Impossible d'écrire le fichier de configuration par défaut !",e);
}
if(output==null)
System.exit(13);
return output;
}
public void dispatchOscMessage(SOscMessage message) {
if(OscUtils.addrMatch(message.getContainer(0),"effectsbox")) {
ebox.receiveOscMessage(message);
}
}
}