Releases: Deep-Symmetry/beat-link
0.6.0
Added
- Support for the XDJ-XZ, which reports multiple devices on a single IP address. This broke assumptions in many places in the code, and required a more sophisticated approach to device matching. Thanks to
patient and detailed reports, experiments, packet captures, and videos from Teo Tormo.
Fixed
- A race condition which caused
CrateDigger
to retain incorrect track information when a player was removed from the network while it had a mounted USB, then returned to the network with a different USB, has been resolved. Thanks to @ben-xo for discovering and reporting this!
Changed
tempoChanged
events are no longer sent to theMasterListener
interface when the tempo is meaningless (i.e. the new master has no track loaded).
0.5.5
Improved robustness in the face of players powered on after Beat Link is online, new kinds of data found in rekordbox exports, and a better build process. Supports new releases of beat-link-trigger, beat-carabiner, and the planned open-beat-control.
Fixed
- CDJs which were powered on after Beat Link was already running would not ever get assigned a valid
dbserver
port by theConnectionManager
so theMetadataFinder
would not be able to perform metadata requests to them withoutCrateDigger
. This seems to have been caused by the players not being quite ready to respond to the port number query right after booting, so we now try again a few times. - Some extended cue entries encountered by users were missing the color bytes, which prevented Crate Digger from parsing
EXT
files and accessing color waveforms. These values are now treated as optional. - Eliminated spurious warnings in the log for cue entries with rekordbox color code 0 which also had explicit green color values stored for nxs2 players.
- Now builds properly under current JDKs, including Amazon Corretto 11 (which is a long-term support release). The minimum JDK for building is now Java 9, but the resulting build is still compatible back to Java 1.6. Building under Java 11 results in much nicer JavaDoc, with search support.
0.5.2
Adds features based on new discoveries in the protocol and database, and to support the forthcoming release of Beat Link Trigger.
Added
CueList
entries can now include nxs2-style DJ comments when they are present, along with colors and hot cues beyond C.- Helper functions to search
CueList
entries for the closest cue before or after a specific time in a track. - The
WaveformPreviewComponent
can return itsCueList
for the convenience of code that wants to add informative tool tips. - The
WaveformDetailComponent
draws labels for hot cues and for any cue or loop that has been assigned a comment. MountListener
instances registered with theMetadataFinder
will be examined to see if they also implementMediaDetailsListener
. If they do, they will be informed when details are available for newly-mounted media.
0.5.1
This is a small release to fix some issues that showed up in 0.5.0 when more people started using it. (What, not everyone tries out the preview releases? 😁)
Fixed
- The
SignatureFinder
would crash trying to calculate signatures for tracks without artists.
Added
- The
MenuLoader
now supports loading tracks from the Label, Bit Rate, Original Artist, and Remixer menus. - Track Metadata now includes bit rate, when applicable.
0.5.0
This is a major release which incorporates many new capabilities thanks to an increasing number of contributors and fellow-travelers around the world (as well as a lot of hard work, of course! 😄)
⚠️ These are breaking API changes. Code that used some cache-related and metadata methods will need to be rewritten.
- The handling of metadata cache files has been moved out of the
MetadataFinder
into a new class focused on this task. It also implements a new interface that can be used by client objects to offer cached metadata to Beat Link (for example track cue lists that group metadata from multiple different media sources). - Track comments and dates added are just plain strings, not searchable items, so the API has been changed to reflect this.
WaveformPreviewComponent
andWaveformDetailComponent
have been generalized to support tracking multiple simultaneous playback positions, so they can be used in the context of a Beat Link Trigger
show file, where a track can be loaded and even playing on multiple players at once.- It is now possible to construct a fully-functional
WaveformPreviewComponent
orWaveformDetailComponent
even if you don’t have access to actualTrackMetadata
objects, as long as you pass them the few individual pieces of information they need. Again, this supports the needs of the new Beat Link Trigger show interface.
Added
- We now can use Crate Digger to reliably obtain metadata even when there are four players on the network, and we are using player number 5.
- We can now retrieve and display the full-color waveforms used by nxs2 players and rekordbox, and prefer them when available. This can be turned off through a
WaveformFinder
property. - When going online, the
VirtualCdj
now reports information about the chosen network interface to help with troubleshooting problematic network environments. - There is a new interface,
TrackPositionBeatListener
, that can be registered with theTimeFinder
in order to learn about new beats as soon as they happen, along with the actual beat number within the track represented by the beat (which is missing from the raw beat packet available through theBeatFinder
). - The
TimeFinder
takes advantage of track metadata, (when it is available) to detect when the DJ has jumped to a cue, or when a track has loaded with auto-cue to a memory point, so it can more accurately infer where the player has stopped. MenuLoader
supports loading several more menu types from the dbserver.- We can offer track years as part of the metadata when rekordbox is indexing that.
- When disconnecting from a player’s dbserver, we politely send a teardown message and let it close the connection from its side.
- A few new methods that can help troubleshoot problematic network topologies are available. Beat Link Trigger uses them to provide better help at startup.
Fixed
- A mistake in the
TimeFinder
which could trap theVirtualCdj
packet delivery thread in an infinite loop, which would then cause client applications to lose touch with what was happening on the players, with no recourse except going offline and back online (and even this would gradually waste more and more CPU time on each occurrence). Thanks to @Kevinnns for the thread dumps which helped finally find this! - The code that was supposed to notice computers running rekordbox and report their media collections as being available on the network had always been broken, but was easy enough to fix. Now Beat Link Trigger can tell players to load tracks from rekordbox and rekordbox mobile.
- The various metadata finders were supposed to report the loss of associated metadata when a player disappeared from the network, but they were not doing so.
- At some point (possibly when adding the ability to show multiple player locations in a waveform) the memory point and hot cue markers stopped being displayed in the waveform preview. They have been restored.
- Cue Lists were not being sorted into the correct order when they were loaded from Crate Digger. Now they are sorted regardless of how we obtain them.
- The colors used for playback position markers were inconsistent between the waveform preview and waveform detail (one used red when the other used white for playing/stopped). Now they both use the constants defined in the WaveformDetailComponent, which also adds a bit of transparency to the preview markers.
- It turns out that rekordbox mobile does not report meaningful values for its media name or creation date, so we no longer attempt to parse them.
- It seems rekordbox sometimes sends mixer status packets with a different subtype structure which was causing us to log warnings about a length mismatch. We now properly recognize this packet subtype.
0.4.1
This was actually released on 2018-10-28, but the tag and release record were forgotten about until working on the release of 0.5.0.
Added
- Metadata caches now store the details of the media from which they were created to more easily and reliably auto-attach them and survive small changes.
Fixed
- When a Nexus player is reporting that it is pre-loading hot cues, we no longer incorrectly consider it to be playing.
- When scanning metadata caches to consider them for auto-attachment, we were not closing the ones which failed to match. This was probably eventually being taken care of by the garbage collector and
finalizers, but there is no guarantee if or when that would actually happen. - When handling a Fader Start command, a missing
break
statement caused theBeatFinder
to log warning which incorrectly reported that the command had not been recognized. This no longer happens.
0.4.0
This is a major release which contains a great many new features and fixes that were developed while waiting for other libraries to be ready for a final Java-9+ compatible release of Beat Link Trigger.
Added
- Metadata can now be retrieved for non-rekordbox tracks, including unanalyzed files in the media slots, and on audio CDs and data discs.
- The mounting and removal of discs is reported to registered media mount listeners.
- Details about all mounted media slots can be discovered, including the name assigned in rekordbox, creation date, number of rekordbox tracks and playlists (and whether there is a rekordbox database at all, which is needed to correctly request the root menu for that slot), size, and free space.
- The number of tracks on a disc can be discovered.
- The
VirtualCdj
can send status and beat packets, simulate playing, and become the tempo master. - The
VirtualCdj
has new methods allowing you to tell other devices to turn sync mode on or off, or to become the tempo master. - The
VirtualCdj
has a new method allowing you to tell other players to start or stop playing. - The
VirtualCdj
has a new method allowing you to tell other players to load a particular track from any rekordbox database on the network (in a player's media slot, or on a laptop running rekordbox). - The
VirtualCdj
has a new method allowing you to tell players whether they are on or off the air in the absence of a DJM mixer. - The
Message.KnownType
enum has many new entries describing menu requests we now know how to perform. - The
Message.MenuItemType
enum has new entries for the menus that can appear in the root menu response. - A new class,
MenuLoader
, provides methods for navigating the menu hierarchies served by players. - A new
Enum
which captures all known packet types, to improve the readability and compactness of code that works with them.
Fixed
- Waveform details are properly loaded for tracks that are found on multiple players on the network. This affected time-remaining calculations too.
- Now assembles entire dbserver messages into a buffer to write them to the network as a single operation, avoiding the chance of them being split into multiple packets, because Windows rekordbox can't handle when they are.
- Removed a potential source of crashes in the waveform rendering code.
- Improved the clarity of an exception thrown when trying to ask for metadata from a player for which we did not find a db server port.
- Improved protection against problems that can occur when delivering events (status updates, beats, etc.) to registered listeners; previously we were only catching exceptions, but some kinds of problems in the listener classes would lead to other kinds of throwables, which could kill our event delivery loops.
- The count parameter is now passed in menu render requests in a way that is more consistent with the way CDJs do it, although this has not seemed to cause any problems.
Changed
- We no longer simply reject packets with unexpected lengths; if they are longer than the minimum value we expect, we try to process them after logging a warning. If they are too short, we just log the warning.
- More use of ByteBuffers to efficiently assemble and compare packets.
- The
TRACK_LIST_REQ
message type has been renamedTRACK_MENU_REQ
to fit in with the large number of other menus that have been added.
0.3.7
This is a small release to help address an issue discovered as the audience for Beat Link Trigger has expanded greatly in response to a DJ TechTools article.
Fixed
- Although the
TrackMetadata
object received the Album field, and would display it in thetoString()
method, there was no accessor by which the value could be obtained and used by other code!
0.3.6
This is a small release to help address an issue discovered as the audience for Beat Link Trigger has expanded greatly in response to a DJ TechTools article.
Fixed
- When looping a track that has audio data that extends well past the
final beat in the beat grid, players sometimes report playing a beat
that does not exist in the beat grid. This previously caused an
exception in the log, and the reported playback position would keep
growing without bound as long as the loop continued. This situation
is now handled better by interpolating missing beats at the end of
the beat grid, so there is no exception and the looping of the
player is properly reflected by theTimeFinder
.
0.3.5
This is a small release to help address an issue discovered as the audience for Beat Link Trigger has expanded greatly in response to a DJ TechTools article.
Fixed
- Creating a metadata cache would fail if a playlist contained more
than one copy of the same track, as it would try to create the same
ZIP file entry more than once. Now redundant copies of the same track
are skipped.