* Added `rating`, `play_count`, `last_played`, `date_added`, and `date_updated` columns to the `tracks` table and updated `tracks_view` accordingly.
* Added `MarkTrackPlayedQuery` and use it in `PlaybackService` to update `play_count` and `last_played` automatically.
* Added `SetTrackRatingQuery` and use it in `TrackListView` to update `rating`
* Updated `IndexerTrack` to update `date_added` and `date_updated` when appropriate
* Added the ability to change the default sort order in the tracks search layout.
* Abstracted track row rendering into new `TrackRowRenderers` source unit
* Tweaked `TrackRowRenderers` to draw track rating data when the viewport is large enough
* Added working AIF and WAV decoding to FfmpegDecoder.
* Added metadata parsing for wav and aif files.
* Fixed return values for FfmpegEncoder and FfmpegDecoder AVIO seek
callbacks.
This was a more comprehensive set of changes than a simple bug fix. The original issue highlighted a pretty nasty issue in the way we were dealing with multi-frame packets. The entire plugin was refactored, and now uses modern, non-deprecated APIs like `avcodec_send_packet` and `avcodec_receive_frame`, and also utilizes `AVAudioFifo` and `av_audio_fifo_*` APIs to ensure stable buffer sizes are returned to the caller.
* Added new `FffmpegEncoder` and removed old `OggEncoder`. The new `FfmpegEncoder` can be used to encode to `ogg`, `flac`, `opus`, `wavepack`, and `wma` formats.
* Created new `IStreamingEncoder` and `IBlockingEncoder` interfaces that both extend `IEncoder`. The former is preferred, but not always possible depending on how the output format works.
* Updated `IDataStream::Open` interface to take `OpenFlags` bitmask. Plumbed this change through multiple layers of the system.
* Updated `LocalFileStream` to allow for opening files in `OpenFlags::Write` and `OpenFlags::Read | OpenFlags::Write` modes. This is used for plugins that want to write files and share file handles.
* Added `HttpServer` auth bypass via new environment variable `MUSIKCUBE_DISABLE_HTTP_SERVER_AUTH=1`. This is useful for testing encoders without requiring client auth.
* Bumped SDK's version to `17`.