Commit graph

77 commits

Author SHA1 Message Date
Roderick van Domburg
7921f23927
Improve format handling and support MP3
- Switch from `lewton` to `Symphonia`. This is a pure Rust demuxer
  and decoder in active development that supports a wide range of
  formats, including Ogg Vorbis, MP3, AAC and FLAC for future HiFi
  support. At the moment only Ogg Vorbis and MP3 are enabled; all
  AAC files are DRM-protected.

- Bump MSRV to 1.51, required for `Symphonia`.

- Filter out all files whose format is not specified.

- Not all episodes seem to be encrypted. If we can't get an audio
  key, try and see if we can play the file without decryption.

- After seeking, report the actual position instead of the target.

- Remove the 0xa7 bytes offset from `Subfile`, `Symphonia` does
  not balk at Spotify's custom Ogg packet before it. This also
  simplifies handling of formats other than Ogg Vorbis.

- When there is no next track to load, signal the UI that the
  player has stopped. Before, the player would get stuck in an
  infinite reloading loop when there was only one track in the
  queue and that track could not be loaded.
2022-01-03 00:13:28 +01:00
Guillaume Desmottes
3ce9854df5 player: ensure load threads are done when dropping PlayerInternal
Fix a race where the load operation was trying to use a disposed tokio
context, resulting in panic.
2021-12-29 16:00:45 +01:00
Roderick van Domburg
b4f7a9e35e
Change to parking_lot and remove remaining panics 2021-12-26 23:02:02 +01:00
Roderick van Domburg
62461be1fc
Change panics into Result<_, librespot_core::Error> 2021-12-26 21:18:42 +01:00
Roderick van Domburg
f03a7e95c1
Merge remote-tracking branch 'librespot-org/dev' into new-api-wip 2021-12-08 19:11:53 +01:00
Roderick van Domburg
47badd61e0
Update tokio and fix build 2021-11-27 14:26:13 +01:00
Roderick van Domburg
0e6b1ba9dc
Update version numbers to 0.3.1 2021-10-24 20:12:33 +02:00
Roderick van Domburg
ff3648434b
Change hand-picked RNGs back to SmallRng
While `Xoshiro256+` is faster on 64-bit, it has low linear complexity in the
lower three bits, which *are* used when generating dither.

Also, while `Xoshiro128StarStar` access one less variable from the heap,
multiplication is generally slower than addition in hardware.
2021-10-21 19:31:58 +02:00
Roderick van Domburg
4c89a721ee
Improve dithering CPU usage (#866) 2021-10-19 22:33:04 +02:00
Sasha Hilton
6a3377402a Update version numbers to 0.3.0 2021-10-13 15:10:18 +01:00
Jason Gray
89577d1fc1
Improve player (#823)
* Improve error handling
* Harmonize `Seek`: Make the decoders and player use the same math for converting between samples and milliseconds
* Reduce duplicate calls: Make decoder seek in PCM, not ms
* Simplify decoder errors with `thiserror`
2021-09-20 19:29:12 +02:00
Jason Gray
9ff33980d6
Better errors in PulseAudio backend (#801)
* More meaningful error messages
* Use F32 if a user requests F64 (F64 is not supported by PulseAudio)
* Move all code that can fail to `start` where errors can be returned to prevent panics
* Use drain in `stop`
2021-06-30 21:14:23 +02:00
Jason Gray
4c77854ffe
Better errors alsa backend (#797)
Better error handling in Alsa backend

* More consistent error messages
* Bail on fatal errors in player
* Capture and log the original error as a warning when trying to write to PCM before trying to recover
2021-06-18 20:25:09 +02:00
Roderick van Domburg
d4f466ef58
Revert math::round_half_to_even
This caused quite a bump in CPU usage, which be acceptable if this
actually improved sound quality. However, it turns out that this
function only has one decimal precision, i.e. it would consider
all values from `0.50..0.60` (exclusive) as `0.5` which is in
error for our purposes.
2021-05-31 23:35:48 +02:00
Roderick van Domburg
8062bd2518
Improve sample rounding and clean up noise shaping leftovers (#771) 2021-05-29 22:53:19 +02:00
Roderick van Domburg
11dfedea3b
Remove with-vorbis and with-tremor features (#750) 2021-05-26 21:43:20 +02:00
Roderick van Domburg
bb3dd64c87
Implement dithering (#694)
Dithering lowers digital-to-analog conversion ("requantization") error, linearizing output, lowering distortion and replacing it with a constant, fixed noise level, which is more pleasant to the ear than the distortion.

Guidance:

- On S24, S24_3 and S24, the default is to use triangular dithering. Depending on personal preference you may use Gaussian dithering instead; it's not as good objectively, but it may be preferred subjectively if you are looking for a more "analog" sound akin to tape hiss.

- Advanced users who know that they have a DAC without noise shaping have a third option: high-passed dithering, which is like triangular dithering except that it moves dithering noise up in frequency where it is less audible. Note: 99% of DACs are of delta-sigma design with noise shaping, so unless you have a multibit / R2R DAC, or otherwise know what you are doing, this is not for you.

- Don't dither or shape noise on S32 or F32. On F32 it's not supported anyway (there are no integer conversions and so no rounding errors) and on S32 the noise level is so far down that it is simply inaudible even after volume normalisation and control.

New command line option:

--dither DITHER Specify the dither algorithm to use - [none, gpdf,
                tpdf, tpdf_hp]. Defaults to 'tpdf' for formats S16
                S24, S24_3 and 'none' for other formats.

Notes:

This PR also features some opportunistic improvements. Worthy of mention are:
- matching reference Vorbis sample conversion techniques for lower noise
- a cleanup of the convert API
2021-05-26 21:19:17 +02:00
Roderick van Domburg
a590b778de
Bump jack and Rodio crates 2021-05-25 22:35:35 +02:00
johannesd3
555274b5af
Move decoder to playback crate 2021-05-11 20:36:53 +02:00
dependabot[bot]
fce91f4e61
Bump jack from 0.6.6 to 0.7.0 (#720) 2021-05-09 21:03:25 +00:00
Sasha Hilton
2ef3928691 Update version numbers to 0.2.0 2021-05-04 13:05:13 +01:00
johannesd3
17b04c4b6e
Remove libc dep 2021-05-01 13:00:30 +02:00
johannesd3
26c127c2ec Merge branch 'dev' into tokio_migration 2021-04-10 12:59:47 +02:00
Roderick van Domburg
222f9bbd01 Bump playback crates to the latest supporting Rust 1.41.1
For Rodio, this fixes garbled sound on some but not all Alsa hosts.
2021-04-09 20:01:21 +02:00
Roderick van Domburg
bfca1ec15e Minor code improvements and crates bump 2021-03-27 21:13:14 +01:00
Roderick van Domburg
001d3ca1cf Bump Alsa, cpal and GStreamer crates 2021-03-19 22:28:55 +01:00
Roderick van Domburg
5257be7824 Add command-line option to set F32 or S16 bit output
Usage: `--format {F32|S16}`. Default is F32.

 - Implemented for all backends, except for JACK audio which itself
 only supports 32-bit output at this time. Setting JACK audio to S16
 will panic and instruct the user to set output to F32.

 - The F32 default works fine for Rodio on macOS, but not on Raspian 10
 with Alsa as host. Therefore users on Linux systems are warned to set
 output to S16 in case of garbled sound with Rodio. This seems an issue
 with cpal incorrectly detecting the output stream format.

 - While at it, DRY up lots of code in the backends and by that virtue,
 also enable OggData passthrough on the subprocess backend.

 - I tested Rodio, ALSA, pipe and subprocess quite a bit, and call on
 others to join in and test the other backends.
2021-03-12 23:09:15 +01:00
johannesd3
18179e73ec Remove unused dependencies and fix feature flags 2021-02-23 22:22:53 +01:00
johannesd3
45f42acb82 Refactor 'find_available_alternatives' 2021-02-23 22:22:52 +01:00
johannesd3
5aeb733ad9 Clean up dependencies in librespot-playback
* Use futures-util instead of futures
* Use tokio channels instead of futures channels
* Removed "extern crate"s
2021-02-23 22:22:52 +01:00
johannesd3
c0942f14e8 Restore rodiojack support
Probably more simple than the previous approach which
doubles the code: Instead of implementing the `Open` trait,
we simply use custom SinkBuilder, one for the default host,
and one for the "jack" host.
2021-02-23 22:22:51 +01:00
johannesd3
678d1777fd Merge branch 'dev' into tokio_migration 2021-02-23 22:22:49 +01:00
johannesd3
1fc5267a71 Revert "Merge pull request #548 from Lcchy/rodiojack-backend"
This reverts commit f483075b2c, reversing
changes made to ea8ece36d9.
2021-02-23 22:20:58 +01:00
Sasha Hilton
d8c1b491c4 Merge branch 'master' into dev 2021-02-22 00:57:45 +00:00
Sasha Hilton
b7c3609c7b Update version numbers to 0.1.6 2021-02-22 00:37:28 +00:00
Sasha Hilton
7f705ed148 Merge branch 'master' into dev 2021-02-20 23:31:04 +00:00
Sasha Hilton
2c110ca256 Update version numbers to 0.1.5 2021-02-20 23:05:56 +00:00
johannesd3
b2f1be4374 Make RodioSink Send and improve error handling 2021-02-12 19:34:28 +01:00
johannesd3
872fab62d8 Merge branch 'dev' into tokio_migration 2021-02-10 21:51:33 +01:00
Lcchy
52438b1cc2 Use rodio for jackaudio backend 2021-02-09 17:45:21 +01:00
Sasha Hilton
5e4e574f78 Bump alsa version in playback crate, remove duplicate dependency 2021-01-31 02:50:20 +00:00
johannesd3
0895f17f8a Migrated playback crate to futures 0.3 2021-01-25 09:04:33 +01:00
Lyndon Brown
8ea200088c bump sdl2 dependency (v0.32 to v0.34)
doesn't seem to have any compatibility issues - compiled cleanly with sdl2
feature after version bump.
2020-12-14 11:53:54 +00:00
Lyndon Brown
3ba05845d2 upgrade jack dependency from v0.5 to v0.6
A bunch of stuff got moved around; means of constructing audio output port
changed.

I simply used the commits, mostly from [1], to their examples to figure
out how to address the errors that resulted from compiling after the
version bump. It compiles cleanly again now.

[1]: https://github.com/RustAudio/rust-jack/pull/89
2020-12-14 11:53:54 +00:00
Lyndon Brown
594de54bec bump zerocopy dependency
doesn't seem to have any compatibility issues.
2020-12-14 11:53:54 +00:00
Lyndon Brown
21b2110da2 bump glib and gstreamer dependency versions
(needed to be done together)

there was no changelog for gstreamer and far too many commits to check
compatibility, but compiling with the gstreamer backend feature works fine
with these new versions.
2020-12-14 11:53:54 +00:00
Lyndon Brown
2f809ea6e1 bump shell-words dependency to v1.0.0
nothing has changed, as noted here:
ae583f7a19
2020-12-14 11:53:54 +00:00
Lyndon Brown
0411e69548 convert PulseAudio backend to use the available binding crates
rather than the raw 'sys' layer.
2020-12-13 17:51:41 +00:00
Lyndon Brown
28061dffe2 upgrade to newer PulseAudio crate dependency
requires adding dependency on libpulse-simple-sys since the PulseAudio
simple components were moved to their own crate (the original version
did not stick to the one crate per one system library rule).

this fixes the licensing compatibility issue discussed in #539 ([1])
(the original v0.0.0 was LGPL-3.0 licensed, while v1.11 onwards are
'MIT OR Apache-2.0').

[1]: https://github.com/librespot-org/librespot/issues/539
2020-12-13 17:50:23 +00:00
Will Stott
8ff1dc24bd Quick minimal hack to get latest rodio working. 2020-12-02 19:45:46 +00:00