From: https://github.com/bluegaspode/ickstream-java-common/commit/5f9a8c0a47d3a3778597ae040ec0798ffcd4d812?w=1
PlayerCommandService is using a "syncObject" now.
All access to 'playerStatus' will be synchronized against this syncObject.
It is assumed that a PlayerManager will do likewise manipulate the 'playerStatus' on its own thread based on the actual playerstate.
By using the syncObject it can be guaranteed that remote calls and internal state changes don't get into each others way.
From: https://github.com/bluegaspode/ickstream-java-common/commit/79908a64cfde0b98f2523d23cf35dedbf92bbbf2
code-cleanup: extract local variables for complex boolean operations
https://github.com/bluegaspode/ickstream-java-common/commit/c21e5b943ae747e7b8e494c00bfff8bcef8e2864
bugfix: avoid ArrayOutOfIndexException, when currentPos=0 and queue is
From: https://github.com/bluegaspode/ickstream-java-common/commit/8a963a72d80567efbf4586edb75eef42d14b7f1b
bugfix: calling setPlaybackQueueMode(QUEUE_SHUFFLE | QUEUE_SHUFFLE_REPEAT) didn't send a PlayerStatusChanged-Notification
when no track (or only one) track existed in the queue.

Fix as follows:
- new 'internalShuffleTracks' method that doesn't send events
- 'shuffleTracks' does send events (playbackQueueChanged +
playerStatusChanged) on its own (only when tracks were shuffled)
- 'setPlaybackQueueMode(QUEUE_SHUFFLE)' always sends a
playerStatusChanged. Sends playbackQueueChanged only when tracks were
actually shuffled.
From: https://github.com/bluegaspode/ickstream-java-common/commit/3fd09f794cbdb28973566bf36b1b446b7ed5126d
bugfix: setPlaybackQueuePos(QUEUE|QUEUE_REPEAT) reverts the playlist to the originally ordered playlist. It didn't send the corresponding playlistQueueChanged and playerStatusChanged notifications. This has been fixed.
Added 3 new testcases to confirm that a playerStatusChangedNotification
is sent when changing the playbackQueueMode on an empty playbackQueue
Reformatted code