001package andesite.player.filter;
002
003import com.github.natanbc.lavadsp.karaoke.KaraokePcmAudioFilter;
004import com.sedmelluq.discord.lavaplayer.filter.AudioFilter;
005import com.sedmelluq.discord.lavaplayer.filter.FloatPcmAudioFilter;
006import com.sedmelluq.discord.lavaplayer.format.AudioDataFormat;
007import io.vertx.core.json.JsonObject;
008
009import javax.annotation.Nonnull;
010import javax.annotation.Nullable;
011
012public class KaraokeConfig implements Config {
013    private float level = 1f;
014    private float monoLevel = 1f;
015    private float filterBand = 220f;
016    private float filterWidth = 100f;
017    
018    public float level() {
019        return level;
020    }
021    
022    public void setLevel(float level) {
023        this.level = level;
024    }
025    
026    public float monoLevel() {
027        return monoLevel;
028    }
029    
030    public void setMonoLevel(float monoLevel) {
031        this.monoLevel = monoLevel;
032    }
033    
034    public float filterBand() {
035        return filterBand;
036    }
037    
038    public void setFilterBand(float filterBand) {
039        this.filterBand = filterBand;
040    }
041    
042    public float filterWidth() {
043        return filterWidth;
044    }
045    
046    public void setFilterWidth(float filterWidth) {
047        this.filterWidth = filterWidth;
048    }
049    
050    @Nonnull
051    @Override
052    public String name() {
053        return "karaoke";
054    }
055    
056    @Override
057    public boolean enabled() {
058        return Config.isSet(level, 1f) || Config.isSet(monoLevel, 1f) ||
059                Config.isSet(filterBand, 220f) || Config.isSet(filterWidth, 100f);
060    }
061    
062    @Nullable
063    @Override
064    public AudioFilter create(AudioDataFormat format, FloatPcmAudioFilter output) {
065        return new KaraokePcmAudioFilter(output, format.channelCount, format.sampleRate)
066            .setLevel(level)
067            .setMonoLevel(monoLevel)
068            .setFilterBand(filterBand)
069            .setFilterWidth(filterWidth);
070    }
071    
072    @Nonnull
073    @Override
074    public JsonObject encode() {
075        return new JsonObject()
076            .put("level", level)
077            .put("monoLevel", monoLevel)
078            .put("filterBand", filterBand)
079            .put("filterWidth", filterWidth);
080    }
081}