From e0230718598e3c6f0999be49a95ca71dec26d5be Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Helge=20Stenstr=C3=B6m?=
Date: Tue, 24 Sep 2019 22:58:24 +0200
Subject: [PATCH 01/23] Update StreamPlayer.java
Slight reformatting
---
.../com/goxr3plus/streamplayer/stream/StreamPlayer.java | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/main/java/com/goxr3plus/streamplayer/stream/StreamPlayer.java b/src/main/java/com/goxr3plus/streamplayer/stream/StreamPlayer.java
index f0ee979..d932ef3 100644
--- a/src/main/java/com/goxr3plus/streamplayer/stream/StreamPlayer.java
+++ b/src/main/java/com/goxr3plus/streamplayer/stream/StreamPlayer.java
@@ -214,9 +214,9 @@ public void reset() {
*/
private String generateEvent(final Status status, final int encodedStreamPosition, final Object description) {
try {
- return eventsExecutorService
- .submit(new StreamPlayerEventLauncher(this, status, encodedStreamPosition, description, listeners))
- .get();
+ StreamPlayerEventLauncher task = new StreamPlayerEventLauncher(this, status, encodedStreamPosition, description, listeners);
+ Future submit = eventsExecutorService.submit(task);
+ return submit.get();
} catch (InterruptedException | ExecutionException ex) {
logger.log(Level.WARNING, "Problem in StreamPlayer generateEvent() method", ex);
}
@@ -574,7 +574,7 @@ public void play() throws StreamPlayerException {
// Proceed only if we have not problems
logger.info("Submitting new StreamPlayer Thread");
- streamPlayerExecutorService.submit(this);
+ Future submit = streamPlayerExecutorService.submit(this);
// Update the status
status = Status.PLAYING;
From dfd34cd2d199e22bbe112cc9066af2bdf2d8ca48 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Helge=20Stenstr=C3=B6m?=
Date: Tue, 24 Sep 2019 23:16:37 +0200
Subject: [PATCH 02/23] Remove unneeded thread
Executors.newSingleThreadExecutor(new ThreadFactoryWithNamePrefix("StreamPlayerEvent"))); is not needed
---
.../streamplayer/stream/StreamPlayer.java | 26 ++++---------------
1 file changed, 5 insertions(+), 21 deletions(-)
diff --git a/src/main/java/com/goxr3plus/streamplayer/stream/StreamPlayer.java b/src/main/java/com/goxr3plus/streamplayer/stream/StreamPlayer.java
index d932ef3..cee6f22 100644
--- a/src/main/java/com/goxr3plus/streamplayer/stream/StreamPlayer.java
+++ b/src/main/java/com/goxr3plus/streamplayer/stream/StreamPlayer.java
@@ -41,7 +41,6 @@
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
@@ -120,11 +119,6 @@ public class StreamPlayer implements StreamPlayerInterface, Callable {
private final ExecutorService streamPlayerExecutorService;
private Future future;
- /**
- * This executor service is used in order the playerState events to be executed
- * in an order
- */
- private final ExecutorService eventsExecutorService;
/** Holds a list of Linteners to be notified about Stream PlayerEvents */
private final ArrayList listeners;
@@ -154,20 +148,17 @@ public StreamPlayer() {
*/
public StreamPlayer(Logger logger) {
this(logger,
- Executors.newSingleThreadExecutor(new ThreadFactoryWithNamePrefix("StreamPlayer")),
- Executors.newSingleThreadExecutor(new ThreadFactoryWithNamePrefix("StreamPlayerEvent")));
+ Executors.newSingleThreadExecutor(new ThreadFactoryWithNamePrefix("StreamPlayer")));
}
/**
* Constructor with settable logger and executor services.
* @param logger The logger that will be used by the player
* @param streamPlayerExecutorService Executor service for the stream player
- * @param eventsExecutorService Executor service for events.
*/
- public StreamPlayer(Logger logger, ExecutorService streamPlayerExecutorService, ExecutorService eventsExecutorService) {
+ public StreamPlayer(Logger logger, ExecutorService streamPlayerExecutorService) {
this.logger = logger;
this.streamPlayerExecutorService = streamPlayerExecutorService;
- this.eventsExecutorService = eventsExecutorService;
listeners = new ArrayList<>();
outlet = new Outlet(logger);
reset();
@@ -210,17 +201,10 @@ public void reset() {
* @param encodedStreamPosition in the stream when the event occurs.
* @param description the description
*
- * @return A String Describing if any problem occurred
*/
- private String generateEvent(final Status status, final int encodedStreamPosition, final Object description) {
- try {
- StreamPlayerEventLauncher task = new StreamPlayerEventLauncher(this, status, encodedStreamPosition, description, listeners);
- Future submit = eventsExecutorService.submit(task);
- return submit.get();
- } catch (InterruptedException | ExecutionException ex) {
- logger.log(Level.WARNING, "Problem in StreamPlayer generateEvent() method", ex);
- }
- return "Problem in StreamPlayer generateEvent() method";
+ private void generateEvent(final Status status, final int encodedStreamPosition, final Object description) {
+ new StreamPlayerEventLauncher(this, status, encodedStreamPosition, description, listeners).call();
+
}
/**
From 664fa3be5ebd1a14126f81cb520423e73484d5e9 Mon Sep 17 00:00:00 2001
From: GOXR3PLUS STUDIO
Date: Wed, 25 Sep 2019 10:52:17 +0300
Subject: [PATCH 03/23] Create PULL_REQUEST_TEMPLATE.md
---
PULL_REQUEST_TEMPLATE.md | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
create mode 100644 PULL_REQUEST_TEMPLATE.md
diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..2cbedd9
--- /dev/null
+++ b/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,28 @@
+# Description
+
+Please include a summary of the change and which issue is fixed.
+List any dependencies that are required for this change.
+
+Fixes # (issue)
+
+## Type of change
+
+Please delete options that are not relevant.
+
+- [ ] Bug fix (non-breaking change which fixes an issue)
+- [ ] New feature (non-breaking change which adds functionality)
+- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
+- [ ] This change requires a documentation update
+
+# Has This Been Tested?
+
+# Checklist:
+
+- [X] My code follows the style guidelines of this project
+- [X] I have performed a self-review of my own code
+- [X] I have commented my code, particularly in hard-to-understand areas
+- [X] I have made corresponding changes to the documentation
+- [X] My changes generate no new warnings
+- [X] I have added tests that prove my fix is effective or that my feature works
+- [X] New and existing unit tests pass locally with my changes
+- [X] Any dependent changes have been merged and published in downstream modules
From 87f0f5955bb9889add3ed1ea235f5c927df962e6 Mon Sep 17 00:00:00 2001
From: GOXR3PLUS STUDIO
Date: Wed, 25 Sep 2019 10:57:16 +0300
Subject: [PATCH 04/23] Update PULL_REQUEST_TEMPLATE.md
---
PULL_REQUEST_TEMPLATE.md | 22 +++++++++++++++++++---
1 file changed, 19 insertions(+), 3 deletions(-)
diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md
index 2cbedd9..1a0ae91 100644
--- a/PULL_REQUEST_TEMPLATE.md
+++ b/PULL_REQUEST_TEMPLATE.md
@@ -3,19 +3,35 @@
Please include a summary of the change and which issue is fixed.
List any dependencies that are required for this change.
-Fixes # (issue)
+
-## Type of change
+
+
-Please delete options that are not relevant.
+**What kind of change does this PR introduce?** (check at least one)
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
+- [ ] Code style update
+- [ ] Refactor
+- [ ] Build-related changes
- [ ] This change requires a documentation update
+- [ ] Other, please describe:
+
+**Does this PR introduce a breaking change?** (check one)
+
+- [ ] Yes
+- [ ] No
# Has This Been Tested?
+- [ ] Yes
+- [ ] No
+
# Checklist:
- [X] My code follows the style guidelines of this project
From 75f289a964a5f590b4a3569b3b3b9ca95c7c2d8f Mon Sep 17 00:00:00 2001
From: GOXR3PLUS STUDIO
Date: Tue, 26 Nov 2019 09:40:03 +0200
Subject: [PATCH 05/23] Update README.md
---
README.md | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/README.md b/README.md
index d852172..e222bcc 100644
--- a/README.md
+++ b/README.md
@@ -1,13 +1,19 @@
+
Java Stream Player
+
+🎶
+
+
+
+Java Audio Controller Library with (skip,skipTo,start,stop,pause,play,restart features)
+This is the next version of [JavaZoom BasicPlayer](http://www.javazoom.net/jlgui/api.html)" target="_blank">Download
+
+
+
[](https://github.com/goxr3plus/java-stream-player/releases)
[](http://hits.dwyl.io/goxr3plus/java-stream-player)
-
-# Java-stream-player
-Java Audio Controller Library with (skip,skipTo,start,stop,pause,play,restart features)
-This is the next version of [JavaZoom BasicPlayer](http://www.javazoom.net/jlgui/api.html)
-
### What audio formats it supports?
It supports **WAV, AU, AIFF, MP3, OGG VORBIS, FLAC, MONKEY's AUDIO and SPEEX audio formats** , using some external libraries . Although more will be added in future releases.
From b1e1fbe252be5073e74486d5ee9c53b75963a070 Mon Sep 17 00:00:00 2001
From: GOXR3PLUS STUDIO
Date: Tue, 26 Nov 2019 09:40:55 +0200
Subject: [PATCH 06/23] Update README.md
---
README.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/README.md b/README.md
index e222bcc..4234c41 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
+---
Java Stream Player
🎶
@@ -9,6 +10,8 @@ This is the next version of [JavaZoom BasicPlayer](http://www.javazoom.net/jlgui
+
+
[](https://github.com/goxr3plus/java-stream-player/releases)
[](http://hits.dwyl.io/goxr3plus/java-stream-player)
From 06b357ca35d2a3d6854fe2bef70c3bbae206cf21 Mon Sep 17 00:00:00 2001
From: GOXR3PLUS STUDIO
Date: Tue, 26 Nov 2019 09:41:10 +0200
Subject: [PATCH 07/23] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 4234c41..4fde380 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@ This is the next version of [JavaZoom BasicPlayer](http://www.javazoom.net/jlgui
-Java Audio Controller Library with (skip,skipTo,start,stop,pause,play,restart features)
-This is the next version of [JavaZoom BasicPlayer](http://www.javazoom.net/jlgui/api.html)" target="_blank">Download
+Java Audio Controller Library with (skip,skipTo,start,stop,pause,play,restart)
+ This is the next version of JavaZoom BasicPlayer
From fb6651f1a05748a4c44345c55a2fceaeaaeaf1c4 Mon Sep 17 00:00:00 2001
From: GOXR3PLUS STUDIO
Date: Tue, 26 Nov 2019 10:14:38 +0200
Subject: [PATCH 11/23] Update README.md
---
README.md | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 8862c83..fb81e54 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,18 @@
### What audio formats it supports?
-It supports **WAV, AU, AIFF, MP3, OGG VORBIS, FLAC, MONKEY's AUDIO and SPEEX audio formats** , using some external libraries . Although more will be added in future releases.
+- **Fully Supported ✔️**
+ - WAV
+ - MP3
+- **Partially not full tested 🚧**
+ - OGG VORBIS
+ - FLAC
+ - MONKEY's AUDIO
+ - SPEEX
+- **Not Supported Yet ❌**
+ - AAC
+ - THEORA
+ - ... all the others
### Step 1. Add the JitPack repository to your build file
From 987d0cddcb394fa5d3a430ee79dd4c7f7b8cb142 Mon Sep 17 00:00:00 2001
From: GOXR3PLUS STUDIO
Date: Fri, 29 Nov 2019 21:43:54 +0200
Subject: [PATCH 12/23] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index fb81e54..8860bd0 100644
--- a/README.md
+++ b/README.md
@@ -33,7 +33,7 @@
- ... all the others
-### Step 1. Add the JitPack repository to your build file
+### Step 1. Add the JitPack repository to your build file
https://jitpack.io/private#goxr3plus/java-stream-player
``` XML
From 6a00a79f32bf324f7d6232182d93745da64bee0b Mon Sep 17 00:00:00 2001
From: GOXR3PLUS STUDIO
Date: Mon, 9 Dec 2019 10:30:02 +0200
Subject: [PATCH 13/23] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 8860bd0..f780dc1 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
---
-
Java Stream Player ( Library )
+
Java Stream Player ( Library )
🎶
From 719d370aac524836099cf093c7f96e1f135eee71 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Helge=20Stenstr=C3=B6m?=
Date: Wed, 18 Dec 2019 22:43:22 +0100
Subject: [PATCH 14/23] minor JavaDoc and readability improvement
---
.../goxr3plus/streamplayer/stream/StreamPlayer.java | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/src/main/java/com/goxr3plus/streamplayer/stream/StreamPlayer.java b/src/main/java/com/goxr3plus/streamplayer/stream/StreamPlayer.java
index f0ee979..3cbf3e3 100644
--- a/src/main/java/com/goxr3plus/streamplayer/stream/StreamPlayer.java
+++ b/src/main/java/com/goxr3plus/streamplayer/stream/StreamPlayer.java
@@ -1067,12 +1067,18 @@ public float getMinimumGain() {
/**
* Returns Pan precision.
+ *
+ * Obtains the resolution or granularity of the control, in the units that the control measures.
+ * The precision is the size of the increment between discrete valid values for this control,
+ * over the set of supported floating-point values.
*
- * @return The Precision Value
+ * @return The Precision Value for the pan control, if it exists, otherwise 0.0.
*/
@Override
public float getPrecision() {
- return !outlet.hasControl(FloatControl.Type.PAN, outlet.getPanControl()) ? 0.0F : outlet.getPanControl().getPrecision();
+ return !outlet.hasControl(FloatControl.Type.PAN, outlet.getPanControl())
+ ? 0
+ : outlet.getPanControl().getPrecision();
}
From 0ef3d2ff7dea0712edeba317de0ad6d73a85a261 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Helge=20Stenstr=C3=B6m?=
Date: Wed, 18 Dec 2019 22:43:48 +0100
Subject: [PATCH 15/23] Update StreamPlayerMethodsTest.java
Some unit tests are improved, but there are more to be done.
---
.../stream/StreamPlayerMethodsTest.java | 96 +++++++++++++++----
1 file changed, 75 insertions(+), 21 deletions(-)
diff --git a/src/test/java/com/goxr3plus/streamplayer/stream/StreamPlayerMethodsTest.java b/src/test/java/com/goxr3plus/streamplayer/stream/StreamPlayerMethodsTest.java
index 4cfbc5b..ba43454 100644
--- a/src/test/java/com/goxr3plus/streamplayer/stream/StreamPlayerMethodsTest.java
+++ b/src/test/java/com/goxr3plus/streamplayer/stream/StreamPlayerMethodsTest.java
@@ -4,8 +4,10 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import javax.sound.sampled.SourceDataLine;
+import javax.sound.sampled.*;
import java.io.File;
+import java.io.IOException;
+import java.util.List;
import java.util.logging.Logger;
import static org.junit.jupiter.api.Assertions.*;
@@ -191,9 +193,11 @@ void totalBytes() {
@Test
void stopped() {
- player.isStopped();
- fail("Test not done");
+ assertFalse(player.isStopped());
+
+ player.stop();
+ assertTrue(player.isStopped());
}
@Test
@@ -225,10 +229,17 @@ void pausedOrPlaying() {
}
@Test
- void paused() {
- player.isPaused();
+ void paused() throws StreamPlayerException {
+ assertFalse(player.isPaused());
- fail("Test not done");
+ player.open(audioFile);
+ assertFalse(player.isPaused());
+
+ player.play();
+ assertFalse(player.isPaused());
+
+ player.pause();
+ assertTrue(player.isPaused());
}
@Test
@@ -277,10 +288,21 @@ void play() throws StreamPlayerException {
}
@Test
- void resume() {
- player.resume();
+ void resume() throws StreamPlayerException {
+ assertFalse(player.isPlaying());
- fail("Test not done");
+ player.open(audioFile);
+ assertFalse(player.isPlaying());
+
+ player.play();
+ assertTrue(player.isPlaying());
+
+ player.pause();
+ assertFalse(player.isPlaying());
+
+
+ player.resume();
+ assertTrue(player.isPlaying());
}
@Test
@@ -310,9 +332,15 @@ void pan() throws StreamPlayerException {
player.setPan(pan);
assertEquals(pan, player.getPan(), delta);
+ // If we set the pan outside the permitted range, it will not change
+ // The permitted range is undefined.
double outsideRange = 1.1;
player.setPan(outsideRange);
assertEquals(pan, player.getPan(), delta);
+
+ float precision = player.getPrecision();
+ assertNotEquals(0, precision);
+ assertEquals(3f, 1.0/precision);
}
@Test
@@ -332,14 +360,18 @@ void open() throws StreamPlayerException {
@Test
void mixers() {
- player.getMixers();
-
- fail("Test not done");
+ List mixers = player.getMixers();
+ // TODO: Make this method player.getMixers() private, remove it from the interface.
+ // There is nothing that can be done with the information outside the private scope.
}
@Test
void seekBytes() throws StreamPlayerException {
- player.seekBytes(0);
+ player.open(audioFile);
+ int positionByte1 = player.getPositionByte();
+
+ player.seekBytes(100);
+ int positionByte2 = player.getPositionByte();
fail("Test not done");
}
@@ -376,17 +408,22 @@ void positionByte() {
}
@Test
- void precision() {
- player.getPrecision();
+ void precision() throws StreamPlayerException {
+ assertEquals(0f, player.getPrecision());
- fail("Test not done");
+ player.open(audioFile);
+ player.play();
+
+ assertNotEquals(0f, player.getPrecision());
+ // On one computer the precision = 1/128. There are no guarantees.
}
@Test
- void opened() {
- player.isOpened();
+ void opened() throws StreamPlayerException {
+ assertFalse(player.isOpened());
- fail("Test not done");
+ player.open(audioFile);
+ assertTrue(player.isOpened());
}
@Test
@@ -404,8 +441,25 @@ void removeStreamPlayerListener() {
}
@Test
- void seekTo() throws StreamPlayerException {
- player.seekTo(1000);
+ void seekTo() throws StreamPlayerException, IOException, UnsupportedAudioFileException {
+
+ // Some tests before we do the real tests
+ AudioFileFormat audioFileFormat = AudioSystem.getAudioFileFormat(audioFile);
+
+
+ // Setup
+ player.open(audioFile);
+ player.play();
+ player.pause();
+ int positionByte1 = player.getPositionByte();
+ assertNotEquals(AudioSystem.NOT_SPECIFIED, positionByte1, "If we cannot check the position, how can we verify seek?");
+
+ // Execute
+ player.seekTo(10);
+
+ // Verify
+ int positionByte2 = player.getPositionByte();
+ assertNotEquals(positionByte2, positionByte1);
fail("Test not done");
}
From afb30bc1a818ec3f74f0746983ac259858433434 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Helge=20Stenstr=C3=B6m?=
Date: Thu, 19 Dec 2019 08:08:50 +0100
Subject: [PATCH 16/23] AudioSystem.getMixerInfo() will not return null, so we
don't have to check for it.
---
.../streamplayer/stream/StreamPlayer.java | 25 ++++++++-----------
1 file changed, 10 insertions(+), 15 deletions(-)
diff --git a/src/main/java/com/goxr3plus/streamplayer/stream/StreamPlayer.java b/src/main/java/com/goxr3plus/streamplayer/stream/StreamPlayer.java
index f0ee979..e6b26f4 100644
--- a/src/main/java/com/goxr3plus/streamplayer/stream/StreamPlayer.java
+++ b/src/main/java/com/goxr3plus/streamplayer/stream/StreamPlayer.java
@@ -35,11 +35,7 @@
import java.net.URL;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
@@ -994,17 +990,16 @@ public List getMixers() {
// audio mixers that are currently installed on the system.
final Mixer.Info[] mixerInfos = AudioSystem.getMixerInfo();
- if (mixerInfos != null)
- Arrays.stream(mixerInfos).forEach(mInfo -> {
- // line info
- final Line.Info lineInfo = new Line.Info(SourceDataLine.class);
- final Mixer mixer = AudioSystem.getMixer(mInfo);
+ Arrays.stream(mixerInfos).forEach(mInfo -> {
+ // line info
+ final Line.Info lineInfo = new Line.Info(SourceDataLine.class);
+ final Mixer mixer = AudioSystem.getMixer(mInfo);
- // if line supported
- if (mixer.isLineSupported(lineInfo))
- mixers.add(mInfo.getName());
+ // if line supported
+ if (mixer.isLineSupported(lineInfo))
+ mixers.add(mInfo.getName());
- });
+ });
return mixers;
}
@@ -1023,7 +1018,7 @@ private Mixer getMixer(final String name) {
// audio mixers that are currently installed on the system.
final Mixer.Info[] mixerInfos = AudioSystem.getMixerInfo();
- if (name != null && mixerInfos != null)
+ if (name != null)
for (Mixer.Info mixerInfo : mixerInfos)
if (mixerInfo.getName().equals(name)) {
mixer = AudioSystem.getMixer(mixerInfo);
From 68c67ca20e6d025a89d4dbc02931331e126c6c48 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Helge=20Stenstr=C3=B6m?=
Date: Fri, 20 Dec 2019 23:17:22 +0100
Subject: [PATCH 17/23] Improved and re-structured unit tests
---
.../StreamPlayerFutureImprovementTest.java | 47 +++++
.../stream/StreamPlayerMethodsTest.java | 166 +++++++++++++-----
2 files changed, 172 insertions(+), 41 deletions(-)
create mode 100644 src/test/java/com/goxr3plus/streamplayer/stream/StreamPlayerFutureImprovementTest.java
diff --git a/src/test/java/com/goxr3plus/streamplayer/stream/StreamPlayerFutureImprovementTest.java b/src/test/java/com/goxr3plus/streamplayer/stream/StreamPlayerFutureImprovementTest.java
new file mode 100644
index 0000000..807c4d9
--- /dev/null
+++ b/src/test/java/com/goxr3plus/streamplayer/stream/StreamPlayerFutureImprovementTest.java
@@ -0,0 +1,47 @@
+package com.goxr3plus.streamplayer.stream;
+
+import com.goxr3plus.streamplayer.enums.Status;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import javax.sound.sampled.AudioFileFormat;
+import javax.sound.sampled.AudioSystem;
+import javax.sound.sampled.SourceDataLine;
+import javax.sound.sampled.UnsupportedAudioFileException;
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.logging.Logger;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.mock;
+
+/**
+ * Tests of all or most of the public methods of StreamPlayer.
+ * These unit tests are written primarily as documentation of the behavior and as example use case,
+ * not as a part of test driven development.
+ */
+public class StreamPlayerFutureImprovementTest {
+ StreamPlayer player;
+ private File audioFile;
+
+ @BeforeEach
+ void setup() {
+ final Logger logger = mock(Logger.class);
+ player = new StreamPlayer(logger);
+ audioFile = new File("Logic - Ballin [Bass Boosted].mp3");
+ }
+
+ /**
+ * This test fails if it's permitted to add a null to the StreamPlayer listener list.
+ */
+ @Test
+ void addStreamPlayerListener_dontAcceptNull() {
+ // Currently, we can add a null to the list of stream player listeners.
+ // Should that really be allowed?
+ assertThrows(Exception.class, () -> player.addStreamPlayerListener(null));
+
+ fail("Test not done");
+ }
+
+}
diff --git a/src/test/java/com/goxr3plus/streamplayer/stream/StreamPlayerMethodsTest.java b/src/test/java/com/goxr3plus/streamplayer/stream/StreamPlayerMethodsTest.java
index ba43454..98dcab0 100644
--- a/src/test/java/com/goxr3plus/streamplayer/stream/StreamPlayerMethodsTest.java
+++ b/src/test/java/com/goxr3plus/streamplayer/stream/StreamPlayerMethodsTest.java
@@ -3,15 +3,18 @@
import com.goxr3plus.streamplayer.enums.Status;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
import java.util.List;
+import java.util.Map;
import java.util.logging.Logger;
import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.*;
/**
* Tests of all or most of the public methods of StreamPlayer.
@@ -87,7 +90,7 @@ void status() throws StreamPlayerException {
@Test
void gain() throws StreamPlayerException, InterruptedException {
// Setup
- final double gain1 = 0.99;
+ final double gain1_dB = 0.5;
final double gain2 = 0.2;
final double delta = 0.05;
final boolean listen = false;
@@ -97,8 +100,8 @@ void gain() throws StreamPlayerException, InterruptedException {
player.open(audioFile);
player.seekTo(30);
player.play();
- player.setGain(gain1);
- final float actualGain1First = player.getGainValue();
+ player.setGain(gain1_dB);
+ final float actualGain0 = player.getGainValue();
if (listen) Thread.sleep(2000);
final float actualGain1 = player.getGainValue();
@@ -106,16 +109,19 @@ void gain() throws StreamPlayerException, InterruptedException {
if (listen) Thread.sleep(2000);
final float actualGain2 = player.getGainValue();
- player.setGain(gain1);
+ player.setGain(gain1_dB);
if (listen) Thread.sleep(2000);
player.stop();
// Verify
assertEquals(0, initialGain);
- assertEquals(actualGain1First, actualGain1);
- assertEquals(gain1, actualGain1, delta); // TODO: Investigate probable bug.
- // fail("Test not done");
+ assertEquals(actualGain0, actualGain1);
+ assertEquals(20.0 * Math.log10(gain1_dB), actualGain1, delta);
+
+ // TODO: Consider changing the API. setGain() and getGainValue() have different scales.
+ // setGain(linear scale),
+ // whereas getGainValue() returns a logarithmic dB scale value. This is inconsistent.
}
/**
@@ -185,10 +191,17 @@ void maximumGain() throws StreamPlayerException {
}
@Test
- void totalBytes() {
- player.getTotalBytes();
+ void totalBytes() throws StreamPlayerException, InterruptedException {
+ int expectedLengthOfExampleAudioFile = 5877062;
- fail("Test not done");
+
+ assertEquals(-1, player.getTotalBytes());
+
+ player.open(audioFile);
+ assertEquals(expectedLengthOfExampleAudioFile, player.getTotalBytes());
+
+ player.play();
+ assertEquals(expectedLengthOfExampleAudioFile, player.getTotalBytes());
}
@Test
@@ -213,19 +226,36 @@ void sourceDataLine() throws StreamPlayerException {
}
@Test
- void playing() {
- final boolean playing = player.isPlaying();
+ void playing() throws StreamPlayerException {
+
+ assertFalse(player.isPlaying());
- assertFalse(playing);
+ player.open(audioFile);
+ assertFalse(player.isPlaying());
- fail("Test not done");
+ player.play();
+ assertTrue(player.isPlaying());
+
+ player.pause();
+ assertFalse(player.isPlaying());
}
@Test
- void pausedOrPlaying() {
- player.isPausedOrPlaying();
+ void pausedOrPlaying() throws StreamPlayerException {
- fail("Test not done");
+ assertFalse(player.isPausedOrPlaying());
+
+ player.open(audioFile);
+ assertFalse(player.isPausedOrPlaying());
+
+ player.play();
+ assertTrue(player.isPausedOrPlaying());
+
+ player.pause();
+ assertTrue(player.isPausedOrPlaying());
+
+ player.stop();
+ assertFalse(player.isPausedOrPlaying());
}
@Test
@@ -243,34 +273,76 @@ void paused() throws StreamPlayerException {
}
@Test
- void addStreamPlayerListener_dontAcceptNull() {
- assertThrows(Exception.class, () -> player.addStreamPlayerListener(null));
+ void addStreamPlayerListener() throws StreamPlayerException, InterruptedException {
+ // Setup
+ final StreamPlayerListener listener = mock(StreamPlayerListener.class);
- fail("Test not done");
- }
+ ArgumentCaptor