////////////////////////////////////////////////////////////////////////////////
// Copyright 2013 Michael Schmalle - Teoti Graphix, LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License
//
// Author: Michael Schmalle, Principal Architect
// mschmalle at teotigraphix dot com
////////////////////////////////////////////////////////////////////////////////
package com.teotigraphix.caustk.controller;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.androidtransfuse.event.EventObserver;
import com.teotigraphix.caustk.application.Dispatcher;
import com.teotigraphix.caustk.application.ICaustkApplication;
import com.teotigraphix.caustk.application.ICaustkConfiguration;
import com.teotigraphix.caustk.application.IDeviceFactory;
import com.teotigraphix.caustk.application.IDispatcher;
import com.teotigraphix.caustk.controller.command.CommandManager;
import com.teotigraphix.caustk.controller.command.ICommand;
import com.teotigraphix.caustk.controller.command.ICommandManager;
import com.teotigraphix.caustk.controller.command.OSCMessage;
import com.teotigraphix.caustk.core.CtkDebug;
import com.teotigraphix.caustk.library.ILibraryManager;
import com.teotigraphix.caustk.library.LibraryManager;
import com.teotigraphix.caustk.pattern.IPatternManager;
import com.teotigraphix.caustk.pattern.PatternManager;
import com.teotigraphix.caustk.project.IProjectManager;
import com.teotigraphix.caustk.project.ProjectManager;
import com.teotigraphix.caustk.sequencer.ISongManager;
import com.teotigraphix.caustk.sequencer.ISongSequencer;
import com.teotigraphix.caustk.sequencer.ISystemSequencer;
import com.teotigraphix.caustk.sequencer.SongManager;
import com.teotigraphix.caustk.sequencer.SongSequencer;
import com.teotigraphix.caustk.sequencer.SystemSequencer;
import com.teotigraphix.caustk.service.ISerializeService;
import com.teotigraphix.caustk.service.SerializeService;
import com.teotigraphix.caustk.sound.ISoundGenerator;
import com.teotigraphix.caustk.sound.ISoundMixer;
import com.teotigraphix.caustk.sound.ISoundSource;
import com.teotigraphix.caustk.sound.SoundMixer;
import com.teotigraphix.caustk.sound.SoundSource;
import com.teotigraphix.caustk.system.IMemoryManager;
import com.teotigraphix.caustk.system.ISystemState;
import com.teotigraphix.caustk.system.Memory.Type;
import com.teotigraphix.caustk.system.MemoryManager;
import com.teotigraphix.caustk.system.SystemState;
/**
* @author Michael Schmalle
*/
public class CaustkController implements ICaustkController {
//--------------------------------------------------------------------------
// Public Property API
//--------------------------------------------------------------------------
private Map<Class<? extends IControllerComponent>, IControllerComponent> api = new HashMap<Class<? extends IControllerComponent>, IControllerComponent>();
@Override
public void addComponent(Class<? extends IControllerComponent> clazz,
IControllerComponent instance) {
api.put(clazz, instance);
}
@Override
public <T extends IControllerComponent> T getComponent(Class<T> clazz) {
return clazz.cast(api.get(clazz));
}
@Override
public <T> void register(Class<T> eventType, final EventObserver<T> observer) {
getDispatcher().register(eventType, observer);
}
//----------------------------------
// application
//----------------------------------
private ICaustkApplication application;
@Override
public ICaustkApplication getApplication() {
return application;
}
//----------------------------------
// applicationConfiguration
//----------------------------------
@Override
public ICaustkConfiguration getConfiguration() {
return application.getConfiguration();
}
//----------------------------------
// dispatcher
//----------------------------------
private IDispatcher dispatcher;
@Override
public IDispatcher getDispatcher() {
return dispatcher;
}
//----------------------------------
// factory
//----------------------------------
private IDeviceFactory factory;
@Override
public IDeviceFactory getDeviceFactory() {
return factory;
}
//----------------------------------
// projectManager
//----------------------------------
private IProjectManager projectManager;
@Override
public IProjectManager getProjectManager() {
return projectManager;
}
//----------------------------------
// serializeService
//----------------------------------
private ISerializeService serializeService;
@Override
public ISerializeService getSerializeService() {
return serializeService;
}
//----------------------------------
// songManager
//----------------------------------
private ISongManager songManager;
@Override
public ISongManager getSongManager() {
return songManager;
}
//----------------------------------
// songSequencer
//----------------------------------
private ISongSequencer songSequencer;
@Override
public ISongSequencer getSongSequencer() {
return songSequencer;
}
//----------------------------------
// libraryManager
//----------------------------------
private ILibraryManager libraryManager;
@Override
public ILibraryManager getLibraryManager() {
return libraryManager;
}
//----------------------------------
// commandManager
//----------------------------------
private ICommandManager commandManager;
@Override
public ICommandManager getCommandManager() {
return commandManager;
}
/**
* Executes an {@link ICommand} against a registered message.
*
* @param message The message without the controller/applicationId.
* @param args Arguments to pass to the created {@link OSCMessage} that will
* be created.
* @see #sendOSCCommand(OSCMessage)
*/
@Override
public void execute(String message, Object... args) {
commandManager.execute(message, args);
}
@Override
public void undo() {
commandManager.undo();
}
@Override
public void redo() {
commandManager.redo();
}
//----------------------------------
// soundGenerator
//----------------------------------
private ISoundGenerator soundGenerator;
@Override
public ISoundGenerator getSoundGenerator() {
return soundGenerator;
}
//----------------------------------
// soundSource
//----------------------------------
private ISoundSource soundSource;
@Override
public ISoundSource getSoundSource() {
return soundSource;
}
//----------------------------------
// soundSource
//----------------------------------
private ISoundMixer soundMixer;
@Override
public ISoundMixer getSoundMixer() {
return soundMixer;
}
//----------------------------------
// systemSequencer
//----------------------------------
private ISystemSequencer systemSequencer;
@Override
public ISystemSequencer getSystemSequencer() {
return systemSequencer;
}
//----------------------------------
// systemSequencer
//----------------------------------
private ISystemState systemState;
@Override
public ISystemState getSystemState() {
return systemState;
}
//----------------------------------
// patternManager
//----------------------------------
private IPatternManager patternManager;
@Override
public IPatternManager getPatternManager() {
return patternManager;
}
//----------------------------------
// memoryManager
//----------------------------------
private IMemoryManager memoryManager;
@Override
public IMemoryManager getMemoryManager() {
return memoryManager;
}
//--------------------------------------------------------------------------
// Constructor
//--------------------------------------------------------------------------
/**
* Constructor, creates the {@link IDeviceFactory}, {@link IDispatcher}.
* <p>
* {@link #initialize()} creates all sub components of the
* {@link ICaustkController}.
*
* @param application The main application.
*/
public CaustkController(ICaustkApplication application) {
this.application = application;
factory = getConfiguration().createDeviceFactory(this);
dispatcher = new Dispatcher();
}
//--------------------------------------------------------------------------
// ICausticEngine API
//--------------------------------------------------------------------------
// we proxy the actual OSC impl so we can stop, or reroute
@Override
public float sendMessage(String message) {
return soundGenerator.sendMessage(message);
}
@Override
public String queryMessage(String message) {
return soundGenerator.queryMessage(message);
}
//--------------------------------------------------------------------------
// ISystemController API
//--------------------------------------------------------------------------
@Override
public void initialize() {
CtkDebug.log("Controller: Create app root dir if not created");
File applicationRoot = getConfiguration().getApplicationRoot();
if (!applicationRoot.exists())
applicationRoot.mkdirs();
CtkDebug.log("!!! Controller: Create all Sub controllers");
// sub composites will add their ICommands in their constructors
serializeService = new SerializeService(this);
commandManager = new CommandManager(this);
projectManager = new ProjectManager(this);
libraryManager = new LibraryManager(this);
songManager = new SongManager(this);
songSequencer = new SongSequencer(this);
soundGenerator = getConfiguration().createSoundGenerator(this);
soundGenerator.initialize();
soundSource = new SoundSource(this);
soundMixer = new SoundMixer(this);
systemSequencer = new SystemSequencer(this);
systemState = new SystemState(this);
patternManager = new PatternManager(this);
memoryManager = new MemoryManager(this);
memoryManager.setSelectedMemoryType(Type.USER);
projectManager.initialize();
}
@Override
public void start() {
}
@Override
public void save() throws IOException {
CtkDebug.log("Controller.save()");
projectManager.save();
}
@Override
public void close() {
CtkDebug.log("Controller.close()");
soundGenerator.close();
}
}