////////////////////////////////////////////////////////////////////////////////
// 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.sound;
import com.teotigraphix.caustk.controller.ICaustkController;
import com.teotigraphix.caustk.core.ICausticEngine;
import com.teotigraphix.caustk.core.IRestore;
import com.teotigraphix.caustk.core.osc.MasterMixerMessage;
import com.teotigraphix.caustk.service.ISerialize;
import com.teotigraphix.caustk.sound.master.MasterDelay;
import com.teotigraphix.caustk.sound.master.MasterEqualizer;
import com.teotigraphix.caustk.sound.master.MasterLimiter;
import com.teotigraphix.caustk.sound.master.MasterReverb;
import com.teotigraphix.caustk.utils.ExceptionUtils;
public class MasterMixer implements ISerialize, IRestore {
private transient ICaustkController controller;
public void setController(ICaustkController controller) {
this.controller = controller;
}
private ICausticEngine getEngine() {
return controller;
}
//----------------------------------
// equalizer
//----------------------------------
private MasterEqualizer equalizer;
public final MasterEqualizer getEqualizer() {
return equalizer;
}
public final void setEqualizer(MasterEqualizer value) {
equalizer = value;
}
//----------------------------------
// limiter
//----------------------------------
private MasterLimiter limiter;
public final MasterLimiter getLimiter() {
return limiter;
}
public final void setLimiter(MasterLimiter value) {
limiter = value;
}
//----------------------------------
// delay
//----------------------------------
private MasterDelay delay;
public final MasterDelay getDelay() {
return delay;
}
public final void setDelay(MasterDelay value) {
delay = value;
}
//----------------------------------
// reverb
//----------------------------------
private MasterReverb reverb;
public final MasterReverb getReverb() {
return reverb;
}
public final void setReverb(MasterReverb value) {
reverb = value;
}
//----------------------------------
// volume
//----------------------------------
private float volume = 1f;
public float getVolume() {
return volume;
}
float getVolume(boolean restore) {
return MasterMixerMessage.VOLUME.query(getEngine());
}
public void setVolume(float value) {
if (volume == value)
return;
if (value < 0f || value > 2f)
throw newRangeException("volume", "0..2", value);
volume = value;
MasterMixerMessage.VOLUME.send(getEngine(), value);
}
//--------------------------------------------------------------------------
// Constructor
//--------------------------------------------------------------------------
public MasterMixer() {
}
public MasterMixer(ICaustkController controller) {
this.controller = controller;
equalizer = new MasterEqualizer(controller);
limiter = new MasterLimiter(controller);
delay = new MasterDelay(controller);
reverb = new MasterReverb(controller);
}
@Override
public void restore() {
setVolume(getVolume(true));
equalizer.restore();
limiter.restore();
delay.restore();
reverb.restore();
}
@Override
public void sleep() {
}
@Override
public void wakeup(ICaustkController controller) {
this.controller = controller;
equalizer.setController(controller);
limiter.setController(controller);
delay.setController(controller);
reverb.setController(controller);
}
protected final RuntimeException newRangeException(String control, String range, Object value) {
return ExceptionUtils.newRangeException(control, range, value);
}
}