| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
|
|
|
|
| |
cpal asks the ALSA "default" PCM for its default config and pipewire-alsa
answers 44.1 kHz no matter what the graph runs at, so 48 kHz material was
resampled down to 44.1 in our linear resampler and then back up to 48 by
PipeWire. The stream now opens at the track's own rate (when the device
supports it), which keeps our resampler out of the path and leaves the
conversion to PipeWire's polyphase one.
The new `sample_rate` setting forces a fixed rate instead ("auto" by
default), for anyone who would rather match the graph exactly.
|
| |
|
|
|
|
|
|
|
|
|
| |
Every command, status line and notification went through Config::load, which
reads *and* rewrites config.toml, so `rsp status` alone touched the file on
each call.
The daemon now keeps a parsed copy and only stats the file to notice outside
edits, so `rsp settings set` still takes effect immediately. Config::save
refreshes the cached copy too, and Config::config_path is shared by the loader
and the cache.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
`rsp seek 1:30`, `rsp seek +15`, `rsp seek -30` and `rsp seek` (print the
position) drive a new AudioCommand that seeks the format reader, resets the
decoder and drops the buffered samples, so the cpal stream keeps running and
playback continues from the new spot.
MPRIS gets a working Seek/SetPosition, reports CanSeek, and the state watcher
now emits Seeked when the playhead jumps (not just on track changes), which is
what clients need to move their progress bar after an external seek.
`rsp status` also reports the position (and duration when known) and says
Paused instead of Stopped when a track is loaded but not playing.
|
| |
|
|
|
|
|
|
|
|
|
| |
The queue, its shuffle order and whether playback was running are written to
~/.local/state/rsplayer/state.json whenever they change, and on shutdown, then
restored at daemon start. Tracks that disappeared from disk are dropped
instead of failing on play.
`rsp resume`/`rsp toggle` now start the restored track when nothing is loaded
into the engine yet, which is the state right after a restart with a queue
that was paused.
|
| | |
|
| |
|
|
|
|
| |
An empty artUrl is not a valid URI and makes some clients render a broken
image, and the repeat button snapped back to "None" because LoopStatus was
not stored.
|
| |
|
|
|
|
| |
Plain and unavailable lyrics now wait for a track change instead of
exiting, synced frames erase the previous region so shrinking frames do
not leave stale text, and lrclib lookups are cached next to the track.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
- read http(s) urls through a MediaSourceStream instead of failing
- register the libopus decoder and enable mkv/aac/isomp4 in symphonia
- resample to the device rate with linear interpolation
- rebuild the output stream when the backend dies instead of leaving
playback silent while the daemon still reports "Playing"
A dead pcm makes cpal call the error callback hundreds of thousands of
times per second, so errors are only counted there and reported once when
the stream is dropped. The first failure of a healthy stream is retried
immediately, consecutive failures back off, and a stream that played long
enough clears the failure budget.
|
| |
|
|
| |
expected
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |\
| |
| |
| | |
Reviewed-on: https://codeberg.org/salmonik/RSPlayer/pulls/1
|
| | | |
|
| | | |
|
| |/ |
|
| |
|
|
| |
format string is no longer used to represent songs that have insufficient metadata to fullfill the format string
|
| | |
|
| |
|
|
|
| |
if supplied when a track is played, the rest of the album will be queued
after the track
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
| |
- Full Last.fm API implementation with MD5 signing (track.updateNowPlaying, track.scrobble)
- Full ListenBrainz API implementation (/1/submit-listens for playing_now and single)
- ScrobbleState in daemon tracking track, start time, and unix timestamp per play
- Scrobble threshold: ≥30s play AND (≥half duration OR ≥4 min)
- Duration extraction from symphonia codec params into AudioMetadata and Track
- Token validation at daemon startup and on config change
- ListenBrainz token valid (user: Salmonium) command to re-read config from disk (avoids token in shell history)
- Desktop notifications for token validation results
- Empty-credential filtering (empty string = no-op)
|
| | |
|
| |
|
|
|
|
|
|
|
| |
- Add hidden completions subcommand to CLI (developer use only)
- Regenerate all completion scripts from current CLI structure
- Add elvish and powershell completion scripts
- install.sh: Fix rsp stop -> rsp stop-daemon, rsp start -> rsp start-daemon
- install.sh: Install completions for user's current shell
- install.sh: Zsh uses /usr/share/zsh/site-functions/_rsp directly
|
| |
|
|
|
|
|
|
|
|
|
| |
- Add display_format option with get/set/list/unset for customizing track display
- Add Track::format() supporting $ARTIST, $ALBUM, $TRACK variables
- Update queue, status, notifications to use display_format
- Fix restart command using wrong subcommand 'start' -> 'start-daemon'
- Remove socket_path from config (now computed at runtime from XDG_RUNTIME_DIR)
- Consolidate duplicate save() and save_all() into single save()
- Fix redundant .clone().clone() in config.rs
- Add todo item for caching config in daemon hot paths
|
| |
|
|
| |
position
|
| | |
|
| | |
|
| |
|
|
| |
output instead. Increase pre-buffer to 100 packets.
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
| |
- Play command: no args queues to end (play only if queue empty + player playing),
-i inserts after current and skips, -n inserts after current, removed -l flag
- Queue display: detect terminal size, use pager only if queue exceeds terminal rows
- Shuffle modes: always remember original queue, restore on 'shuffle none',
album shuffle shuffles within each album's range separately
|
| |
|
|
|
|
| |
display_string now takes a total parameter to compute the
zero-padding width. Queue positions are formatted as 01, 02, ..., 10
instead of 1, 2, ..., 10, keeping columns aligned.
|
| |
|
|
|
|
|
|
|
|
|
| |
update_shuffle_indices now shuffles all indices when position is 0
(no tracks have been played yet), so the first track played is random
instead of always being tracks[0]. Directory playback now uses
q.current() to pick the first track, resolving through shuffled indices
when shuffle is active.
Also pins notify-rust version in Cargo.toml and removes PLAN.md
(superseded by TODO.md).
|