further optimized music selection screen

This commit is contained in:
Harrison Deng 2018-08-29 23:18:49 -05:00
parent 97afc449b2
commit 8e68157273

View File

@ -131,7 +131,6 @@ public class MusicSelectionPage extends Page implements Observer {
if (frameUsed) { if (frameUsed) {
frameUsed = false; frameUsed = false;
simpleDebug("New frame.");
} }
if (down) { if (down) {
@ -259,7 +258,7 @@ public class MusicSelectionPage extends Page implements Observer {
private Thread thread; private Thread thread;
private String name = "Music-Selection-Loader-Thread"; private String name = "Music-Selection-Loader-Thread";
private volatile boolean work = true; private volatile boolean work = true;
private LinkedBlockingQueue<AudioMetadata> queue; private LinkedBlockingQueue<MusicSelectable> queue;
public musicSelectionLoaderThread() { public musicSelectionLoaderThread() {
queue = new LinkedBlockingQueue<>(); queue = new LinkedBlockingQueue<>();
} }
@ -267,11 +266,15 @@ public class MusicSelectionPage extends Page implements Observer {
@Override @Override
public void run() { public void run() {
while (work) { while (work) {
AudioMetadata metadata;
try { try {
metadata = queue.take(); MusicSelectable selectable = queue.take();
metadata.loadAlbumCover(); if (!selectable.isOffScreen()) {
simpleDebug("Loading " + metadata.getTitle()); selectable.getMetadata().loadAlbumCover();
selectable.loadAttempted();
simpleDebug("Loaded " + selectable.getMetadata().getTitle());
} else {
simpleDebug("Skipping " + selectable.getMetadata().getTitle());
}
} catch (InterruptedException e) { } catch (InterruptedException e) {
simpleDebug("Thread was interupted."); simpleDebug("Thread was interupted.");
} }
@ -300,8 +303,8 @@ public class MusicSelectionPage extends Page implements Observer {
queue.clear(); queue.clear();
} }
public void queue(AudioMetadata metadata) { public void queue(MusicSelectable selectable) {
queue.add(metadata); queue.add(selectable);
} }
} }
@ -312,12 +315,11 @@ public class MusicSelectionPage extends Page implements Observer {
private Table informationTable; private Table informationTable;
private Label name, artist; private Label name, artist;
private Label time; private Label time;
private boolean offScreen;
private float timeSinceChanged; private float timeSinceChanged;
private AudioMetadata metadata; private AudioMetadata metadata;
private Texture defaultAlbumArt; private Texture defaultAlbumArt;
private TextureRegion albumArtTexture; private TextureRegion albumArtTexture;
private boolean albumArtDisplayed, albumArtAttempted; private volatile boolean offScreen, albumArtDisplayed, albumArtQueued, noReset;
public MusicSelectable(AudioMetadata metadata) { public MusicSelectable(AudioMetadata metadata) {
super(skin, "selectable-button"); super(skin, "selectable-button");
@ -353,7 +355,7 @@ public class MusicSelectionPage extends Page implements Observer {
actualCoords.x = getX() + getParent().getX(); actualCoords.x = getX() + getParent().getX();
actualCoords.y = getY() + getParent().getY(); actualCoords.y = getY() + getParent().getY();
if ((actualCoords.y < 0 - getHeight() - getStage().getHeight()*1.5f || actualCoords.y > getStage().getHeight()*2.5f) && selectables.getChecked() != this) { if ((actualCoords.y < 0 - getHeight() - getStage().getHeight()*0.5f || actualCoords.y > getStage().getHeight()*1.5f) && selectables.getChecked() != this) {
offScreenAct(delta); offScreenAct(delta);
} else { } else {
onScreenAct(delta); onScreenAct(delta);
@ -370,16 +372,16 @@ public class MusicSelectionPage extends Page implements Observer {
if (offScreen) { if (offScreen) {
offScreen = false; offScreen = false;
timeSinceChanged = 0; timeSinceChanged = 0;
} else if (timeSinceChanged < 0.075f) { } else if (timeSinceChanged < 0.05f) {
timeSinceChanged += delta; timeSinceChanged += delta;
} else { } else {
if (!frameUsed && metadata.getAlbumCover() != null && !albumArtDisplayed) { if (!frameUsed && metadata.getAlbumCover() != null && !albumArtDisplayed) {
updateAlbumArtImage(metadata.getAlbumCover()); updateAlbumArtImage(metadata.getAlbumCover());
albumArtDisplayed = true; albumArtDisplayed = true;
frameUsed = true; frameUsed = true;
} else if (!albumArtAttempted) { } else if (!albumArtQueued) {
selectionLoaderThread.queue(metadata); selectionLoaderThread.queue(this);
albumArtAttempted = true; albumArtQueued = true;
} }
} }
} }
@ -401,7 +403,8 @@ public class MusicSelectionPage extends Page implements Observer {
updateAlbumArtImage(defaultAlbumArt); updateAlbumArtImage(defaultAlbumArt);
metadata.unloadAlbumCover(); metadata.unloadAlbumCover();
albumArtDisplayed = false; albumArtDisplayed = false;
albumArtAttempted = false; albumArtQueued = false;
noReset = false;
} }
} }
} }
@ -427,6 +430,18 @@ public class MusicSelectionPage extends Page implements Observer {
public TextureRegion getAlbumArtTexture() { public TextureRegion getAlbumArtTexture() {
return albumArtTexture; return albumArtTexture;
} }
public boolean isOffScreen() {
if (offScreen && !noReset) {
albumArtDisplayed = false;
albumArtQueued = false;
}
return offScreen;
}
public void loadAttempted() {
noReset = true;
}
} }
private class MusicSelectableButtonGroup extends ButtonGroup<MusicSelectable> { private class MusicSelectableButtonGroup extends ButtonGroup<MusicSelectable> {