plac-for-apple-platform

Unofficial Roon client for Apple devices

Commits at 825761ac042bab589e094a2b4cbce4422fb83237

  1. 9de7aad5 gtk-adwaita: Make playback toolbar layout tidier It has been unorgnaized and scattered due to unaligned elements and chaotic spacings. Shota FUJI authored at Shota FUJI comitted at
  2. 2fa47b61 gtk-adwaita: Fix playback toolbar size changes depends on track text If a track A contains non-Ascii text in title/subtitle and a track B does not, changing A to B or vice-versa causes height change for playback toolbar. This is because GTK.Label does not implement correct line-height handling, as it seems to simply calculate the height using the first font family and ignoring fallback fonts. Due to the lack of proper API on GTK (propbably also on Pango,) I opted to hard-code maximum size on each Gtk.Label. <https://codeberg.org/pocka/plac/issues/9> Shota FUJI authored at Shota FUJI comitted at
  3. b6093beb core: Fix random crash on opening a page having images This patch fixes random crash caused by race condition (use after free and unexplainable memory errors such as malloc in glib,) by properly guarding accesses to image download queue. Inside `while` loop reading the downloads queue, it read without lock and that caused reading of freed memory (`d == undefined`), thus operations like `d.data.arc.ref()` and `allocator.destroy(d)` to be invalid. Because the race condition occurs on downloads queue, opening browse page with massive items (200~) has been crashed the app frequently compared to small number of items (~50). Also, longer the image takes to load, more likely the crash to happens. So streaming service's browse page is more prone to crash than local library. With this change, I don't see random crash on Qobuz pages anymore. In addition, for some mysterious reason, images load faster than before. Definetely previous implementation did something wrong, as adding a lock does not make things faster but slower... <https://codeberg.org/pocka/plac/issues/15> Shota FUJI authored at Shota FUJI comitted at
  4. 14bf5e0a gtk-adwaita: Simplify settings binding for label parsing Shota FUJI authored at Shota FUJI comitted at
  5. 3e838e95 gtk-adwaita: Buttons to seek forward/backwards by 10 seconds Seekbar is not comfortable to use. Why 10 seconds, not 5 seconds? Because Adwaita has icons for 10 seconds but 5 seconds. Shota FUJI authored at Shota FUJI comitted at
  6. 412d59f0 gtk-adwaita: Fix cannot drag seekbar <https://codeberg.org/pocka/plac/issues/14> This is still not optimal, though. Ideally changes should debounce or throttle to reduce the number of request. But this works without crashing. Shota FUJI authored at Shota FUJI comitted at
  7. d64de6c8 gtk-adwaita: Loading and error state for Artwork widget Shota FUJI authored at Shota FUJI comitted at
  8. 9b107f4a gtk-adwaita: Workaround for Roon API returns "[[id|text]]" labels Shota FUJI authored at Shota FUJI comitted at
  9. e54e5874 core: Label parsing function Roon API returns "[[id|text]]" format strings for title and subtitles on some browse paths. For example, in my environment, "Explore > Qobuz > New Releases > Qobuz grand selection" returns items with subtitle in this format, like "[[969850|Wes Montgomery]]". I don't think we'll get a fix for this--Roon API is abandoned. Each client has to parse and throw IDs and brackets away. Shota FUJI authored at Shota FUJI comitted at
  10. 63589eaa gtk-adwaita: Remove useless function call Also Vala compiler has been emitting a warning that the variable is unused. Shota FUJI authored at Shota FUJI comitted at
  11. cf275126 gtk-adwaita: Fix space between rows react to clicks <https://codeberg.org/pocka/plac/issues/5> The bug was inside GTK4, and there seems no way to workaround from application developer side. I was not happy about aesthetic of the previous cards list, I simply changed the custom rows to regular one. Shota FUJI authored at Shota FUJI comitted at
  12. 26b2df71 core: Fix segfault on opening "Track" page with release builds The "node" inside while loop is a reference to the other thread's stack variable, and there is no mechanism to block a creator function from exiting. Since blocking a creator function could lead to unpleasing UX (images at beginnings load slowly compared to later images,) I simply changed the code to allocate nodes on heap and added RC. Shota FUJI authored at Shota FUJI comitted at
  13. 8a05c1ce Install code formatter for Nix Amount of Nix code is no longer little. Shota FUJI authored at Shota FUJI comitted at
  14. d82b40d0 gtk-adwaita: Configure Nix build/package Shota FUJI authored at Shota FUJI comitted at
  15. b943cd16 gtk-adwaita: About dialog Shota FUJI authored at Shota FUJI comitted at
  16. 5949d43c gtk-adwaita: Fix browse error locks browse UI into disabled state Shota FUJI authored at Shota FUJI comitted at
  17. 90a7baf9 gtk-adwaita: Don't render non-actionable item as actionable Shota FUJI authored at Shota FUJI comitted at
  18. d497c6aa gtk-adwaita: Don't scroll after selecting/closing action menu popover It's annoying. Shota FUJI authored at Shota FUJI comitted at
  19. 1683e5fd gtk-adwaita: Render action list as menu button It was hard-to-grasp albeit not usable. Shota FUJI authored at Shota FUJI comitted at
  20. 70c1f75e core: Cache downloaded images Navigating through library pages (e.g. albums, artists) fetches same images over and over. In order to reduce load to Roon Server, I added stupid simple caching in front of image downloader. This significantly reduces HTTP GET calls on my library, especially "Tracks" page. The caching does almost nothing on Qobuz pages, though. In my testing, Qobuz images takes more time to load and only playlists have lot of duplicated images. Because of those, the existing "reuse ongoing GET request" mechanism eliminates duplicated GETs thus almost all of requests are unique. I don't believe this can be improved—nobody but Qobuz (perhaps Roon too?) can control, optimize, and estimate data appearance pattern on Qobuz pages. This cache implementation does not look great, but it works well. Shota FUJI authored at Shota FUJI comitted at
  21. bcf2497d core: Download image using normal HTTP instead of WebSocket Downloading large number of images through WebSocket easily clogs connection and affects sending of other actions (e.g. playback control) and receiving of events. By using normal HTTP via separate connection, this no longer happens. This patch finally enables me to open "Explore > Library Tracks" page. Shota FUJI authored at Shota FUJI comitted at
  22. a6d963af core: Relax timeouts It was too short. Especially browse APIs frequently timed-out on Qobuz pages. Shota FUJI authored at Shota FUJI comitted at
  23. 9fc84020 core: Limit number of concurrent image downloads To prevent server from choked. Unfortunately, due to high duplication, "Library > Tracks" still timeouts and renders app unresponsive. Shota FUJI authored at Shota FUJI comitted at
  24. b269cbba gtk-adwaita: Browse category sidebar Shota FUJI authored at Shota FUJI comitted at
  25. 7f2d5aeb gtk-adwaita: Seek feature GTK4's slider/range widget is shitty, thus this feature works shitty as well. There are no "drag ended" equivalent signal and drag start emits JUMP scroll type value change signal. Also, setting `false` to `sensitive` resets focus so long jump using keyboard is impossible too. Debouncing or throttling would help a little bit, but won't solve the problem fundamentally. Seek change events sent by server would resets drag operation. Valadoc shows no result for "throttle/debounce" and GTK4 seems to have no function and widget for that. Implementing debounce/throttle function by hand, testing that, and adding additional delay to seek triggered by seek is not acceptable given those won't work when a track is playing. The only way to solve this is implementing custom widget, which means re-implementing slider UI from scratch or carefully patching and workarounding GtkRange's internal implementation. Both are time-consuming, exhausting, negatively effects maintainability, and stupid. GTK4's rendered widget is great. Its API and abstraction are dogshit. Shota FUJI authored at Shota FUJI comitted at
  26. 5c3de821 core: Seek function Shota FUJI authored at Shota FUJI comitted at
  27. 1be9ec56 core: Fix race condition on reconnect Shota FUJI authored at Shota FUJI comitted at
  28. c5b9431d gtk-adwaita: Automatic reconnection on server close *Not tested* Testing against Roon Server is really frustrating task. Shota FUJI authored at Shota FUJI comitted at
  29. 9ed2fe6d core: Reduce chance of timeout for request reuses Shota FUJI authored at Shota FUJI comitted at
  30. 1a88a96c core: Refactor to use constant defined in std Did not notice the constant at the time of writing the logic. Shota FUJI authored at Shota FUJI comitted at