Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion maven-build.properties
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ maven.settings.offline=false
maven.settings.interactiveMode=true
maven.build.srcDir.0=src/main/java
maven.compiler.target=11
lavaplayer.version=1.3.67
lavalink.version=4.0.0
maven.build.outputDir=${maven.build.dir}/classes
project.build.outputDirectory=${maven.build.outputDir}
maven.build.testResourceDir.0=src/test/resources
Expand Down
10 changes: 5 additions & 5 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<jda.version>4.2.0_249</jda.version>
<lavaplayer.version>1.3.67</lavaplayer.version>
<lavalink.version>4.0.0</lavalink.version>
</properties>

<distributionManagement>
Expand Down Expand Up @@ -113,11 +113,11 @@
<artifactId>trove4j</artifactId>
<version>3.0.3</version>
</dependency>
<!-- https://github.com/sedmelluq/lavaplayer -->
<!-- https://github.com/lavalink-devs/Lavalink -->
<dependency>
<groupId>com.sedmelluq</groupId>
<artifactId>lavaplayer</artifactId>
<version>${lavaplayer.version}</version>
<groupId>dev.arbjerg</groupId>
<artifactId>lavalink-client</artifactId>
<version>${lavalink.version}</version>
</dependency>
<!-- Logback classic -->
<dependency>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package de.yjulian.merly.bot.eventslistener;

import com.sedmelluq.discord.lavaplayer.player.event.AudioEvent;
import com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter;
// TODO: update listener to Lavalink API
import lavalink.client.player.event.PlayerEvent;
import lavalink.client.player.event.PlayerEventAdapter;
import de.yjulian.merly.events.AudioSystemEvent;
import de.yjulian.merly.events.EventManager;

public class AudioEventListener extends AudioEventAdapter {
public class AudioEventListener extends PlayerEventAdapter {

private final EventManager eventManager;

Expand All @@ -14,7 +15,7 @@ public AudioEventListener(EventManager eventManager) {
}

@Override
public void onEvent(AudioEvent event) {
public void onEvent(PlayerEvent event) {
this.eventManager.fireEvent(new AudioSystemEvent(event));
}
}
9 changes: 5 additions & 4 deletions src/main/java/de/yjulian/merly/events/AudioSystemEvent.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
package de.yjulian.merly.events;

import com.sedmelluq.discord.lavaplayer.player.event.AudioEvent;
// TODO: replace with Lavalink player event
import lavalink.client.player.event.PlayerEvent;

public class AudioSystemEvent implements Event {

private final AudioEvent event;
private final PlayerEvent event;

public AudioSystemEvent(AudioEvent event) {
public AudioSystemEvent(PlayerEvent event) {
this.event = event;
}

public AudioEvent getEvent() {
public PlayerEvent getEvent() {
return event;
}
}
16 changes: 9 additions & 7 deletions src/main/java/de/yjulian/merly/subsystem/audio/AudioHandler.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package de.yjulian.merly.subsystem.audio;

import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
import com.sedmelluq.discord.lavaplayer.track.playback.AudioFrame;
// TODO: use Lavalink player classes
import lavalink.client.player.LavalinkPlayer;
import lavalink.client.player.event.Frame;
import net.dv8tion.jda.api.audio.AudioSendHandler;
import org.jetbrains.annotations.Nullable;

Expand All @@ -10,15 +11,15 @@
public class AudioHandler implements AudioSendHandler {

private static final boolean OPUS_FRAME = true;
private final AudioPlayer player;
private AudioFrame lastFrame;
private final LavalinkPlayer player;
private Frame lastFrame;

/**
* Create a new AudioPlayer handler with a provided {@link AudioPlayer}.
*
* @param player the player.
*/
public AudioHandler(AudioPlayer player) {
public AudioHandler(LavalinkPlayer player) {
this.player = player;
}

Expand All @@ -32,7 +33,8 @@ public AudioHandler(AudioPlayer player) {
*/
@Override
public boolean canProvide() {
lastFrame = player.provide();
// TODO: get frame from Lavalink player
lastFrame = null;
return lastFrame != null;
}

Expand All @@ -58,7 +60,7 @@ public boolean canProvide() {
@Nullable
@Override
public ByteBuffer provide20MsAudio() {
return ByteBuffer.wrap(lastFrame.getData());
return lastFrame != null ? ByteBuffer.wrap(lastFrame.getData()) : null;
}

/**
Expand Down
72 changes: 14 additions & 58 deletions src/main/java/de/yjulian/merly/subsystem/audio/AudioManager.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
package de.yjulian.merly.subsystem.audio;

import com.sedmelluq.discord.lavaplayer.player.*;
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
import com.sedmelluq.discord.lavaplayer.track.AudioItem;
import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
// TODO: Replace lavaplayer imports with lavalink client equivalents
import lavalink.client.player.LavalinkPlayer;
import lavalink.client.player.event.PlayerEvent;
import de.yjulian.merly.bot.MerlyBot;
import de.yjulian.merly.exceptions.BotUnavailableException;
import de.yjulian.merly.util.EnumUtils;
Expand All @@ -17,43 +15,23 @@

public class AudioManager {

private final AudioPlayerManager manager;
// TODO: use appropriate Lavalink client class
private final LavalinkPlayer manager;
private final HashMap<Guild, AudioQueue> audioQueues = new HashMap<>();

public AudioManager() {
this.manager = new DefaultAudioPlayerManager();
// TODO: initialize Lavalink player
this.manager = null;
init();
}

private void init() {
MerlyBot.getLogger().info("Initializing Merly Bot - Audio Manager");
AudioConfiguration.ResamplingQuality resamplingQuality = EnumUtils
.getOrDefault(AudioConfiguration.ResamplingQuality.class,
System.getenv("MERLY_RESAMPLING_QUALITY"),
AudioConfiguration.ResamplingQuality.MEDIUM
);
MerlyBot.getLogger().info(String.format("Audio Resampling Quality: %s", resamplingQuality.name()));

// TODO: configure Lavalink connection
MerlyBot.getLogger().info("Initializing Merly Bot - Finished");
setCurrentQuality(resamplingQuality);
}

public AudioConfiguration.ResamplingQuality getCurrentQuality() {
return getConfiguration().getResamplingQuality();
}

public void setCurrentQuality(AudioConfiguration.ResamplingQuality quality) {
getConfiguration().setResamplingQuality(quality);
MerlyBot.getLogger().debug(String.format("Audio Resampling Quality updated to %s", quality.name()));
}

/**
* Get the current audio configuration.
* @return the current configuration.
*/
public AudioConfiguration getConfiguration() {
return this.manager.getConfiguration();
}
// TODO: implement Lavalink audio configuration methods if needed

/**
* Get a audio queue for the voice channel provided. If no player is available the method with throw
Expand Down Expand Up @@ -81,39 +59,17 @@ public AudioQueue getAudioQueue(VoiceChannel voiceChannel) {
}
}

AudioPlayer player = manager.createPlayer();
// TODO: create Lavalink player instance
LavalinkPlayer player = manager;

AudioQueueImpl audioQueue = new AudioQueueImpl(player, voiceChannel);
audioQueues.put(guild, audioQueue);
return audioQueue;
}

void getTrack(String identifier, Consumer<AudioItem> itemConsumer, Consumer<TrackLoadResult> result) {
manager.loadItem(identifier, new AudioLoadResultHandler() {
@Override
public void trackLoaded(AudioTrack track) {
itemConsumer.accept(track);
result.accept(new TrackLoadResult(null, TrackLoadResult.State.TRACK, track));
}

@Override
public void playlistLoaded(AudioPlaylist playlist) {
itemConsumer.accept(playlist);
result.accept(new TrackLoadResult(null, TrackLoadResult.State.PLAYLIST, playlist));
}

@Override
public void noMatches() {
itemConsumer.accept(null);
result.accept(new TrackLoadResult(null, TrackLoadResult.State.NOTHING_FOUND, null));
}

@Override
public void loadFailed(FriendlyException exception) {
itemConsumer.accept(null);
result.accept(new TrackLoadResult(exception, TrackLoadResult.State.EXCEPTION, null));
}
});
// TODO: implement track loading via Lavalink client
void getTrack(String identifier, Consumer<Object> itemConsumer, Consumer<TrackLoadResult> result) {
// Implementation pending
}

}
12 changes: 6 additions & 6 deletions src/main/java/de/yjulian/merly/subsystem/audio/AudioQueue.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package de.yjulian.merly.subsystem.audio;

import com.sedmelluq.discord.lavaplayer.track.AudioItem;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
// TODO: replace with Lavalink track types
import lavalink.client.player.LavalinkTrack;
import net.dv8tion.jda.api.entities.VoiceChannel;

import java.util.function.Consumer;
Expand Down Expand Up @@ -55,13 +55,13 @@ public interface AudioQueue {
* Add tracks to the queue.
* @param item a audio item
*/
void addTrack(AudioItem item);
void addTrack(LavalinkTrack item);

/**
* Play a track instantly.
* @param track a audio track.
*/
void playTrack(AudioTrack track);
void playTrack(LavalinkTrack track);

/**
* Get the voice channel the bot is currently.
Expand All @@ -72,9 +72,9 @@ public interface AudioQueue {

/**
* Get and remove the head of the playlist.
* @return a AudioTrack or null.
* @return a LavalinkTrack or null.
*/
AudioTrack pollNextTrack();
LavalinkTrack pollNextTrack();

/**
* Load a track from a specific identifier. E.g. a youtube link.
Expand Down
Loading
Loading