Skip to content
This repository has been archived by the owner on Feb 25, 2022. It is now read-only.

Commit

Permalink
updates and bulk commit because i cba to individually commit for each…
Browse files Browse the repository at this point in the history
… file lol
  • Loading branch information
LolWastedJS committed Jan 12, 2021
1 parent 3ee7a7b commit 175278e
Show file tree
Hide file tree
Showing 17 changed files with 359 additions and 164 deletions.
2 changes: 1 addition & 1 deletion LavalinkServer/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,11 @@ dependencies {
compile group: 'org.jetbrains.kotlin', name: 'kotlin-reflect', version: kotlinVersion

// Audio Sending
compile group: 'moe.kyokobot.koe', name: 'ext-udpqueue', version: koeVersion
compile (group: 'moe.kyokobot.koe', name: 'core', version: koeVersion) {
// This version of SLF4J does not recognise Logback 1.2.3
exclude group: "org.slf4j", module: "slf4j-api"
}
compile group: 'moe.kyokobot.koe', name: 'ext-udpqueue', version: koeVersion

// Transport
compile "io.netty:netty-transport-native-epoll:$nettyEpollVersion:linux-x86_64"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,12 @@

/**
* Created by napster on 08.03.19.
* - Edited by melike2d on 01.13.21
*/
@RestController
public class InfoRestHandler {

private final AppInfo appInfo;

public InfoRestHandler(AppInfo appInfo) {
this.appInfo = appInfo;
}

class InfoRestHandler(private val appInfo: AppInfo) {
@GetMapping("/version")
public String version() {
return appInfo.getVersionBuild();
fun version(): String {
return appInfo.versionBuild;
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package lavalink.server.io;

import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
class ResponseHeaderFilter : OncePerRequestFilter() {
override fun doFilterInternal(
request: HttpServletRequest,
response: HttpServletResponse,
filterChain: FilterChain
) {
response.addHeader("Lavalink-Api-Version", "3");
filterChain.doFilter(request, response);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import lavalink.server.config.ServerConfig
import lavalink.server.player.Player
import moe.kyokobot.koe.KoeClient
import moe.kyokobot.koe.KoeEventAdapter
import moe.kyokobot.koe.VoiceConnection
import moe.kyokobot.koe.MediaConnection
import org.json.JSONObject
import org.slf4j.LoggerFactory
import org.springframework.web.socket.WebSocketSession
Expand Down Expand Up @@ -96,12 +96,13 @@ class SocketContext internal constructor(
/**
* Gets or creates a voice connection
*/
fun getVoiceConnection(guild: Long): VoiceConnection {
fun getVoiceConnection(guild: Long): MediaConnection {
var conn = koe.getConnection(guild)
if (conn == null) {
conn = koe.createConnection(guild)
conn.registerListener(EventHandler(guild.toString()))
}

return conn
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,16 +93,16 @@ class WebSocketHandlers(private val contextMap: Map<String, SocketContext>) {

fun volume(context: SocketContext, json: JSONObject) {
val player = context.getPlayer(json.getString("guildId"))
player.setVolume(json.getInt("volume"))
player.setVolume(json.getFloat("volume"))
}

fun equalizer(context: SocketContext, json: JSONObject) {
if (!loggedEqualizerDeprecationWarning) log.warn("The 'equalizer' op has been deprecated in favour of the " +
"'filters' op. Please switch to use that one, as this op will get removed in v4.")

loggedEqualizerDeprecationWarning = true

val player = context.getPlayer(json.getString("guildId"))

val list = mutableListOf<Band>()
json.getJSONArray("bands").forEach { b ->
val band = b as JSONObject
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ private JSONObject trackToJSON(AudioTrack audioTrack) {
.put("uri", trackInfo.uri)
.put("isStream", trackInfo.isStream)
.put("isSeekable", audioTrack.isSeekable())
.put("source", audioTrack.getSourceManager().getSourceName())
.put("position", audioTrack.getPosition());
}

Expand Down
178 changes: 116 additions & 62 deletions LavalinkServer/src/main/java/lavalink/server/player/Player.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,24 +22,24 @@

package lavalink.server.player;

import com.sedmelluq.discord.lavaplayer.format.StandardAudioDataFormats;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
import com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason;
import com.sedmelluq.discord.lavaplayer.track.playback.AudioFrame;
import com.sedmelluq.discord.lavaplayer.track.playback.MutableAudioFrame;
import io.netty.buffer.ByteBuf;
import lavalink.server.config.ServerConfig;
import lavalink.server.io.SocketContext;
import lavalink.server.io.SocketServer;
import lavalink.server.player.filters.FilterChain;
import moe.kyokobot.koe.VoiceConnection;
import moe.kyokobot.koe.MediaConnection;
import moe.kyokobot.koe.media.OpusAudioFrameProvider;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.Nullable;
import java.nio.ByteBuffer;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

Expand All @@ -51,7 +51,7 @@ public class Player extends AudioEventAdapter {
private final String guildId;
private final AudioPlayer player;
private final AudioLossCounter audioLossCounter = new AudioLossCounter();
private AudioFrame lastFrame = null;

private ScheduledFuture<?> myFuture = null;
private FilterChain filters;

Expand All @@ -66,62 +66,129 @@ public Player(SocketContext socketContext, String guildId, AudioPlayerManager au
this.player.addListener(audioLossCounter);
}

public void play(AudioTrack track) {
player.playTrack(track);
SocketServer.Companion.sendPlayerUpdate(socketContext, this);
}

public void stop() {
player.stopTrack();
}
public JSONObject getState() {
JSONObject json = new JSONObject();

if (player.getPlayingTrack() != null)
json.put("position", player.getPlayingTrack().getPosition());
json.put("time", System.currentTimeMillis());

public void setPause(boolean b) {
player.setPaused(b);
return json;
}


public String getGuildId() {
return guildId;
}

public void seekTo(long position) {
AudioTrack track = player.getPlayingTrack();
/**
* The player update interval.
*/
private int getInterval() {
return serverConfig.getPlayerUpdateInterval();
}

if (track == null) throw new RuntimeException("Can't seek when not playing anything");
/**
* The socket context.
*/
SocketContext getSocket() {
return socketContext;
}

track.setPosition(position);
/**
* The audio loss counter.
*/
public AudioLossCounter getAudioLossCounter() {
return audioLossCounter;
}

public void setVolume(int volume) {
player.setVolume(volume);
/**
* The current audio track that is playing.
*/
@Nullable
public AudioTrack getPlayingTrack() {
return player.getPlayingTrack();
}

public JSONObject getState() {
JSONObject json = new JSONObject();
/**
* Returns the current filter chain.
*/
@Nullable
public FilterChain getFilters() {
return filters;
}

if (player.getPlayingTrack() != null)
json.put("position", player.getPlayingTrack().getPosition());
json.put("time", System.currentTimeMillis());
/**
* Configures the filter chain for this player.
* @param filterChain The filter chain to use.
*/
public void setFilters(FilterChain filterChain) {
this.filters = filterChain;

return json;
if (filterChain.isEnabled()) {
player.setFilterFactory(filterChain);
} else {
player.setFilterFactory(null);
}
}

SocketContext getSocket() {
return socketContext;
/**
* Sets the pause state.
* @param state The pause state.
*/
public void setPause(boolean state) {
player.setPaused(state);
}

@Nullable
public AudioTrack getPlayingTrack() {
return player.getPlayingTrack();
/**
* Sets the volume of this player.
* @param volume The volume to use.
*/
public void setVolume(float volume) {
filters.setVolume(volume / 100);
}

public boolean isPaused() {
return player.isPaused();

/**
* Plays an audio track.
* @param track The track to play.
*/
public void play(AudioTrack track) {
player.playTrack(track);
SocketServer.Companion.sendPlayerUpdate(socketContext, this);
}

public AudioLossCounter getAudioLossCounter() {
return audioLossCounter;
/**
* Stops the currently playing track.
*/
public void stop() {
player.stopTrack();
}

/**
* Seek to the specified position in the current playing song.
* @param position The position to seek to.
*/
public void seekTo(long position) {
AudioTrack track = getPlayingTrack();
if (track == null) {
throw new RuntimeException("Can't seek when not playing anything");
}

track.setPosition(position);
}

/**
* Whether this player has been paused.
*/
public boolean isPaused() {
return player.isPaused();
}

/**
* Whether this player is playing something.
*/
public boolean isPlaying() {
return player.getPlayingTrack() != null && !player.isPaused();
}
Expand All @@ -142,44 +209,31 @@ public void onTrackStart(AudioPlayer player, AudioTrack track) {
}
}

private int getInterval() {
return serverConfig.getPlayerUpdateInterval();
}

public void provideTo(VoiceConnection connection) {
public void provideTo(MediaConnection connection) {
connection.setAudioSender(new Provider(connection));
}

@Nullable
public FilterChain getFilters() {
return filters;
}

public void setFilters(FilterChain filters) {
this.filters = filters;

if (filters.isEnabled()) {
player.setFilterFactory(filters);
} else {
player.setFilterFactory(null);
}
}

private class Provider extends OpusAudioFrameProvider {
public Provider(VoiceConnection connection) {
/**
* The last frame that was sent.
*/
private final MutableAudioFrame lastFrame = new MutableAudioFrame();

public Provider(MediaConnection connection) {
super(connection);

ByteBuffer frameBuffer = ByteBuffer.allocate(StandardAudioDataFormats.DISCORD_OPUS.maximumChunkSize());
lastFrame.setBuffer(frameBuffer);
}

@Override
public boolean canProvide() {
lastFrame = player.provide();

if (lastFrame == null) {
var sent = player.provide(lastFrame);
if (!sent) {
audioLossCounter.onLoss();
return false;
} else {
return true;
}

return sent;
}

@Override
Expand Down
Loading

0 comments on commit 175278e

Please sign in to comment.