mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-21 23:05:46 +00:00
e8e41752a7
* feat(playback): global speed with three strategies Add Settings → Audio and player-bar controls for global playback speed (speed with auto pitch correction as default, varispeed, manual pitch shift). Time-stretch runs on a background worker; Orbit sessions force 1.0× passthrough. * fix(playback): align seekbar, seek, and progress on content timeline Unify UI timebase across varispeed and preserve strategies: full-track duration, speed-scaled progress for DSP paths, and content-timeline seeks without varispeed scaling. Reset the sample counter after seek so clicks land correctly; restart playback on strategy/enable changes instead of fragile hot-switching. * fix(ui): anchor playback speed popover like volume controls Replace the centered EQ-style modal with a player-bar popover (outside click, Escape, reposition on scroll). Show compact controls in the bar and overflow menu; keep strategy hints and labels in Settings only. * docs(release): CHANGELOG and credits for playback speed (PR #852) * docs(changelog): add playback speed entry for PR #852 * fix(clippy): simplify raw_counter_samples branch for CI Collapse duplicate if branches flagged by clippy::if-same-then-else. * fix(ui): wheel on pitch slider adjusts pitch in speed popover In compact player-bar controls, scroll over the pitch row changes pitch; elsewhere in the panel changes speed. Stop propagation so overflow menu wheel does not tweak volume. * fix(playback): address PR #852 review and drop ineffective dynamic imports Translate playback-rate strings for de/fr/es/zh/nb/nl/ro; restamp sample counter on live preserve-path speed changes; use neutral rate atomics for radio progress; static-import playerStore in playListenSession (move preview volume sync to previewPlayerVolumeSync side-effect module). * fix(i18n): translate playback-rate strategy labels in all locales Replace leftover English Varispeed/Pitch strings in ru and other non-en settings blocks so popover strategy buttons and hints read natively. * fix(i18n): refine German varispeed label to "Tonhöhe folgt dem Tempo" --------- Co-authored-by: Psychotoxical <171614930+Psychotoxical@users.noreply.github.com>
36 lines
1.3 KiB
TypeScript
36 lines
1.3 KiB
TypeScript
import { describe, expect, it, beforeEach } from 'vitest';
|
|
import {
|
|
DEFAULT_PLAYER_BAR_LAYOUT_ITEMS,
|
|
usePlayerBarLayoutStore,
|
|
} from './playerBarLayoutStore';
|
|
|
|
describe('playerBarLayoutStore', () => {
|
|
beforeEach(() => {
|
|
usePlayerBarLayoutStore.getState().reset();
|
|
});
|
|
|
|
it('starts with all six items visible in declared order', () => {
|
|
const items = usePlayerBarLayoutStore.getState().items;
|
|
expect(items.map(i => i.id)).toEqual([
|
|
'starRating', 'favorite', 'lastfmLove', 'playbackRate', 'equalizer', 'miniPlayer',
|
|
]);
|
|
expect(items.every(i => i.visible)).toBe(true);
|
|
});
|
|
|
|
it('toggleItem flips the matching id without disturbing the others', () => {
|
|
usePlayerBarLayoutStore.getState().toggleItem('equalizer');
|
|
const items = usePlayerBarLayoutStore.getState().items;
|
|
expect(items.find(i => i.id === 'equalizer')?.visible).toBe(false);
|
|
expect(items.find(i => i.id === 'starRating')?.visible).toBe(true);
|
|
expect(items.find(i => i.id === 'miniPlayer')?.visible).toBe(true);
|
|
});
|
|
|
|
it('reset restores defaults after toggles', () => {
|
|
const { toggleItem, reset } = usePlayerBarLayoutStore.getState();
|
|
toggleItem('favorite');
|
|
toggleItem('lastfmLove');
|
|
reset();
|
|
expect(usePlayerBarLayoutStore.getState().items).toEqual(DEFAULT_PLAYER_BAR_LAYOUT_ITEMS);
|
|
});
|
|
});
|