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