Skip to content

Commit f69d3ed

Browse files
authored
[api] Allow to set volume as a relative step count (#273)
1 parent e5a8ae7 commit f69d3ed

3 files changed

Lines changed: 50 additions & 20 deletions

File tree

api/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ All the endpoints will respond with `200` if successful or:
1717
- `POST /player/next` Skip to next track.
1818
- `POST /player/prev` Skip to previous track.
1919
- `POST /player/seek` Seek to a given position in ms specified by `pos`.
20-
- `POST /player/set-volume` Set volume to a given `volume` value from 0 to 65536.
20+
- `POST /player/set-volume` Either set volume to a given `volume` value (from 0 to 65536), or change it by a `step` count (positive or negative).
2121
- `POST /player/volume-up` Up the volume a little bit.
2222
- `POST /player/volume-down` Lower the volume a little bit.
2323
- `POST /player/current` Retrieve information about the current track (metadata and time).

api/src/main/java/xyz/gianlu/librespot/api/handlers/PlayerHandler.java

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -24,26 +24,48 @@ public PlayerHandler(@NotNull PlayerWrapper wrapper) {
2424
super(wrapper);
2525
}
2626

27-
private static void setVolume(HttpServerExchange exchange, @NotNull Player player, @Nullable String valStr) {
28-
if (valStr == null) {
29-
Utils.invalidParameter(exchange, "volume");
30-
return;
31-
}
27+
private static void setVolume(HttpServerExchange exchange, @NotNull Player player, @Nullable String valStr, @Nullable String stepStr) {
28+
if (valStr != null && stepStr != null) {
29+
// Reject requests with both parameters
30+
Utils.invalidParameter(exchange, "step", "Cannot be passed alongside volume");
31+
} else if (valStr != null) {
32+
// Absolute volume change
33+
int val;
34+
try {
35+
val = Integer.parseInt(valStr);
36+
} catch (Exception ex) {
37+
Utils.invalidParameter(exchange, "volume", "Not an integer");
38+
return;
39+
}
3240

33-
int val;
34-
try {
35-
val = Integer.parseInt(valStr);
36-
} catch (Exception ex) {
37-
Utils.invalidParameter(exchange, "volume", "Not an integer");
38-
return;
39-
}
41+
if (val < 0 || val > Player.VOLUME_MAX) {
42+
Utils.invalidParameter(exchange, "volume", "Must be >= 0 and <= " + Player.VOLUME_MAX);
43+
return;
44+
}
45+
46+
player.setVolume(val);
47+
} else if (stepStr != null) {
48+
// Relative volume change in number of steps
49+
int val;
50+
try {
51+
val = Integer.parseInt(stepStr);
52+
} catch (Exception ex) {
53+
Utils.invalidParameter(exchange, "step", "Not an integer");
54+
return;
55+
}
4056

41-
if (val < 0 || val > Player.VOLUME_MAX) {
42-
Utils.invalidParameter(exchange, "volume", "Must be >= 0 and <= " + Player.VOLUME_MAX);
57+
if (val > 0) {
58+
player.volumeUp(val);
59+
} else if (val < 0) {
60+
player.volumeDown(Math.abs(val));
61+
} else {
62+
Utils.invalidParameter(exchange, "step", "Must be non zero");
63+
return;
64+
}
65+
} else {
66+
Utils.invalidParameter(exchange, "volume");
4367
return;
4468
}
45-
46-
player.setVolume(val);
4769
}
4870

4971
private static void load(HttpServerExchange exchange, @NotNull Player player, @Nullable String uri, boolean play) {
@@ -168,7 +190,7 @@ protected void handleRequest(@NotNull HttpServerExchange exchange, @NotNull Sess
168190
current(exchange, player);
169191
return;
170192
case SET_VOLUME:
171-
setVolume(exchange, player, Utils.getFirstString(params, "volume"));
193+
setVolume(exchange, player, Utils.getFirstString(params, "volume"), Utils.getFirstString(params, "step"));
172194
return;
173195
case VOLUME_UP:
174196
player.volumeUp();

player/src/main/java/xyz/gianlu/librespot/player/Player.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,21 @@ private void initState() {
8686
// ================================ //
8787

8888
public void volumeUp() {
89+
this.volumeUp(1);
90+
}
91+
92+
public void volumeUp(int steps) {
8993
if (state == null) return;
90-
setVolume(Math.min(Player.VOLUME_MAX, state.getVolume() + oneVolumeStep()));
94+
setVolume(Math.min(Player.VOLUME_MAX, state.getVolume() + steps * oneVolumeStep()));
9195
}
9296

9397
public void volumeDown() {
98+
this.volumeDown(1);
99+
}
100+
101+
public void volumeDown(int steps) {
94102
if (state == null) return;
95-
setVolume(Math.max(0, state.getVolume() - oneVolumeStep()));
103+
setVolume(Math.max(0, state.getVolume() - steps * oneVolumeStep()));
96104
}
97105

98106
private int oneVolumeStep() {

0 commit comments

Comments
 (0)