1. 2

    Could you tag it, but also add a comment stating your relationship to the post if you’re not the author? If you’re not the author, I think it’s worth elaborating how you know them and your relationship to the work. I don’t think a checkbox or enum can capture all the possibilities.

    1. 1

      This looks excellent. How are the hosted demos meant to be used? I opened them in two different browser sessions, but I don’t see how they’re supposed to signal to one another.

      1. 5

        This is timely. I spent the better part of last week trying to get a Python library working on my NixOS system. I eventually gave up and installed Python inside Arch inside a headless qemu virtual machine. Now I build using ssh -t my_qemu_instance 'cd src/foo ; cargo build'. I guess it could be worse.

        1. 2

          I’m a little surprised that that’s “ssh… cargo …” rather than “ssh… pip…” or something.

          1. 3

            Oh, right. It’s a Rust project that uses the inline_python crate. It’s been a long week…

            To my surprise (& to that crate’s credit), invoking Python from Rust worked like a charm. The hard part was installing the Python dependencies in the first place.

          2. 1

            Are you blaming nixos or Python package system?

          1. 1

            “My minimal config with a good amount less code than LunarVim loads 40ms slower. Time to switch.”

            • @mvllow, Potential LunarVim user.

            This made me wonder - does LunarVim perform any sort of optimizations on top of lazy-loading plugins?

            1. 2

              One thing I saw in the source is the use of ftplugin to lazily configure filetype LSP. Other projects tend to configure LSP up front.

            1. 4

              I didn’t realize conduit was so far along in development. I’d like to give it a spin in the coming weeks.

              Conduit is now in the Beta phase. You can already use it as a Synapse replacement, but there still are some smaller problems.

              Is there a more detailed feature breakdown somewhere?

              1. 4

                I saw this in the README:

                There are still a few important features missing:

                • E2EE verification over federation
                • Outgoing read receipts, typing, presence over federation
              1. 3

                This was really cool. I’ll need to watch that a few times to understand Zig’s callsite behavior. I’ve never seen that design before, but it seems nice to have this kind of flexibility.

                1. In Zig, if you naively wrote an async function and then called it without async, would it behave as expected synchronously?

                2. What are the historical influences on each language’s async design? What was the first language with Zig’s callsite behavior?

                1. 3
                  1. Calling without async means that you await the function immediately.
                  2. Not sure, but to make this work, Zig uses comptime lazyness a lot and I don’t know of other languages that have that same approach to metaprogramming.

                  If you want to read an introductory post to Zig’s Async/Await, I wrote this a while ago: https://kristoff.it/blog/zig-colorblind-async-await/

                1. 2

                  Should this optimization be valid? In safe Rust, there’s no question that it is. However, safe Rust has to coexist with unsafe Rust that may be doing all sorts of subtle pointer tricks under the hood. If bar is defined elsewhere, the compiler does not know what its definition looks like (and whether it internally uses unsafe code) and thus must treat it like a black box.

                  Is anyone able to expand on this or point to relevant documentation? I thought unsafe code was supposed to conform to the expectations of safe Rust when viewed from the outside. The idea of optimisations being discarded because a function call could potentially be mutating an immutable value is surprising to me.

                  1. 2

                    I thought unsafe code was supposed to conform to the expectations of safe Rust when viewed from the outside.

                    It’s not that simple. Here is my understanding:

                    • unsafe fn danger_foo() can cause undefined behavior. If it is written correctly and if you use it correctly, then you can use it safely.

                    • Now, you might be asking: Since the lowest levels of std often involve unsafe, and since most things are built on top of the standard library, isn’t most Rust code unsafe? Well …not quite. You can do:

                      fn foo() {
                          unsafe { danger_foo() }
                      }
                      

                      By doing this, you’re effectively saying, “I’ve verified that this works.” If you trust the author of foo(), you can now assume foo() is safe when you invoke it from other safe code. Hooray. Safety.

                    • That last caveat is important. You can only trust foo() from safe code. Unsafe Rust needs to be careful trusting even safe code. This is explained in the nomicon:

                      The design of the safe/unsafe split means that there is an asymmetric trust relationship between Safe and Unsafe Rust. Safe Rust inherently has to trust that any Unsafe Rust it touches has been written correctly. On the other hand, Unsafe Rust has to be very careful about trusting Safe Rust.

                    • LLVM is ‘unsafe’ so you need to assume that even a safe foo() { ... } may within it contain a call to danger_foo().

                  1. 7

                    Nix is great for tracking dependencies but you really need to go all-in on making it your platform. To use a blood type analogy, Nix is a universal recipient of software; the polar opposite of a universal donor. Software like this helps, but it’s only useful for distributing programs with fully Nix’d dependencies.

                    I’m working on a project right now which involves a handful of Haskell executables and a Cythonized Python wheel. Nix bundle can easily package the Haskell programs since they don’t link against anything external; their only public interface is the command-line.

                    Building and distributing a Cython wheel which links against arbitrary other Python libraries is a separate challenge altogether. NixOS/Nixpkgs attacks this problem as a competing distribution of packages, when I really need something one level more meta.

                    Poking around Nixpkgs, I did find various libraries for building RPM packages, managing VMs and building containers

                    1. 2

                      Nix is great for tracking dependencies but you really need to go all-in on making it your platform. To use a blood type analogy, Nix is a universal recipient of software; the polar opposite of a universal donor. Software like this helps, but it’s only useful for distributing programs with fully Nix’d dependencies.

                      What would it mean for a platform manager to be a ‘donor?’ Are there examples of that?

                      It’s true that ‘Nix’-ifying a program sometimes requires modifying software. However, this modification - removing hardcoded dependencies - typically bears no long-term maintenance cost. For this reason, maintainers tend to be happy to do it. That’s been my experience, at least.

                      1. 1

                        I guess the “software donor” I’m thinking of would be better described as a build system. Imagine a tool which provides similar determinism/reproducibility as Nix, but helps you build “native” deb/rpm packages for target distros.

                        BuildStream is the closest fit I know of.

                    1. 15

                      After convincing a German bank to give me a mortgage, I no longer need to be a full-time worker to check any boxes to meet long-term goals, and I’ve dropped my working hours to 8h/wk. There are 3 projects that I’m particularly excited about spending more time on this week and for the next few months at least:

                      • sled is so close to something I can tell people is stable and reliable for long-term projects, but I still need to rearrange a few key architectural pieces to consume significantly less memory and disk space for “aged” regions of data that can slide across the RUM-conjecture space toward cold and compact after being represented in a contention-friendly-yet-higher-memory form while being actively modified. Once sled uses less space for non-hot items, I will feel comfortable calling it stable and a good choice for long-term projects in Rust.

                      • seaslug is currently a collection of buzzwords, but over time I hope to grow it into a small actor-based language that plays nicely with SMT-based test case generation and runs atop a fat runtime leveraging sled, io_uring, and software transactional memory for handling the stuff that has nothing to do with modeling or instrumenting the world outside the program. A lot of studying different rabbit holes inspired by Frank Pfenning’s recent CMU course on Bug Finding, the feature reduction that gives Ada SPARK such applicability to mechanical reasoning and usage in safety-critical spaces, past experience with simulation and property testing, why3, and generally wanting the language to guide people to thinking more about modeling the world outside the program than the peculiarities of the language itself, gives me a lot of fun stuff to learn about and maybe a usable language will pop out :)

                      • preparing for a possible PhD entrance exam after learning that several German institutions may let me skip a master’s due to my open source database work, have relatively light teaching load, and zero required classes to possibly get it with ~3 years of effort. I’m particularly interested in thinking more about pulling probabilistic control theory and data structure design together to build low-configuration highly-flexible in-memory and persistent data structures that move along the RUM conjecture space.

                      The main point of dropping to 8h/wk is to spend significantly more time with the people in my life given the uncertainty of societal stability over what I could assume to be a natural lifespan otherwise, but I think these technical projects will also be fun and worthwhile in the extra time I have now :)

                      1. 2

                        Amazing. I’ve followed your work on sled for a while now, so I’m happy to hear that’s almost done. But more happy that you’re building a life in a thoughtful way. Congratulations and best of luck.

                        1. 2

                          A lot of studying different rabbit holes inspired by Frank Pfenning’s recent CMU course on Bug Finding

                          These lectures aren’t publicly available anywhere, are they? The YouTube playlist appears to be private.

                          1. 2

                            I’ve been going through the available notes and code samples, which are still quite loaded with fascinating perspectives and pointers to related work.

                        1. 5

                          There are a couple reasons why this is getting such a strong response:

                          • It’s difficult to demonstrate the uses of reproducibility. You probably don’t care about nix’s guarantees unless you’ve done sysadmin-type work. Or perhaps you have some interest in distributed computing, formal verification, OS dev, etc.
                          • There’s a dearth of documentation on nix. It’s rare to see a succinct article with some example code. Normally, you have to hunt through GitHub to figure things out.
                          • Most developers have dealt with package management. It’s foundational to modern software development, so we have established workflows that work for us. We have learned to accept occasional as ‘the cost of getting things done’, so the example in this blog post appears unremarkable.

                          Anyway, I enjoyed it but I’m a NixOS user, so I’m a sucker for any thoughtfully put-together nix code (as per bullet point #2).

                          1. 4

                            This is very reassuring. I’ll probably be running NixOS on the Framework laptop in a couple months :o)

                            1. 20

                              Writing something about programming that hopefully won’t get instantly downvoted.

                              1. 5

                                That’s a mood

                                1. 9

                                  Yeah, there’s a few people that instantly down vote everything I write/post here as off topic or spam and it’s kinda discouraged me from writing as much as I normally do. If it continues i may ask push to look into it or something.

                                  1. 7

                                    Yikes, I recognize your name as someone who’s submitted great quality original posts in the past. Maybe I’ve been missing them recently because of this.

                                    1. 4

                                      That’s odd. The stuff you tend to work on and talk about tends to generally be a good read.

                                      Maybe a bit sillier than other people may like, but solid nonetheless.

                                      1. 2

                                        For what it’s worth, I have the opposite reaction. I think of your writing as always detailed, practical, unpretentious - exactly the things that lobsters was built to showcase. (Sidenote: your posts on NixOS are what finally convinced me to switch, so thanks for that :))

                                        1. 1

                                          If it helps, some of your stuff I like a lot and some of your stuff I’m not terribly interested in, but I never downvote your posts ’cause I want you to keep writing and posting here.

                                      2. 2

                                        Illegitimi non carborundum.

                                        1. 1

                                          I also have anxiety about this, which is why I have several things I’ve written and haven’t posted.

                                        1. 2

                                          I have started reading these updates since @akavel’s comment in praise of them and they are quite good, very accessible even if you’ve never written or taken apart a shell.

                                          1. 2

                                            Thanks! If you want more stuff to read, check out Popular Posts with Many Comments. It’s linked in bold on the blog index, but based on my logs very few people visit that page :)

                                          1. 32

                                            I’m not usually one to comment on these sorts of issues but it ticked me off how the author of this article consistently decided to refer to leah2 by her deadname and to use the wrong pronouns. Kinda took me out of the article, oh well.

                                            1. 13

                                              Not only me, but also other people involved. :(

                                              1. 4

                                                That’s awful, there’s no justification why the author would do that. I’m sorry for you and everyone else involved. :(

                                                1. 4

                                                  I wouldn’t treat this as an attack. It’s a historical account of the past years where people went by different names in the past 10 years.

                                                  1. 3
                                                    1. 1

                                                      Ok.

                                                      Most of the software I touched in the last few years, as well as maintained websites, have my name updated, refer to them as such.

                                                      If you speak about me in a context where only my old name is known, it’s not a problem to me. Please try to use they/them, though.

                                                      Leah’s name has not been updated in the referenced git repository.

                                                      Anyway, I do not think it was an intentional attack.

                                                      1. 2

                                                        I don’t intend to speak for Leah but according to her comment I was replying to, she’s clearly not stoked about it. I think that’s a good enough indication that this wasn’t really the way the author should have approached mentioning her if the intent was to respect her. I’m not trying to frame the blog post as an “attack” either, but yeah. I don’t think there’s really a discussion to be had here.

                                                        n.b.: I do not know Leah nor have I have ever talked to her.

                                                        1. 1

                                                          From the article:

                                                          nowadays known as Leah Neukirchen.

                                                          It seems pretty clear that her new name is known and clarified.

                                                2. 13

                                                  Same, plus the Rust as a Microsoft + Mozilla + Google conspiracy against open source.

                                                  1. 9

                                                    yeah, that struck me too. i wish there was a flag like, “this is ok except i would rather not have to endure ambient transphobia with my os/compiler blog post”

                                                  1. 3

                                                    I have used NixOS as my daily driver for a couple months now and I love it. However, I have a very superficial understanding of its architecture so I struggle to make meaning out of this. I’ve read https://r13y.com/ already, but it left me with more questions:

                                                    1. What is being compared to determine whether two builds are consistent with one another? (diffoscope?) Isn’t the output necessarily different due to hardware optimizations? Are they turned off for the purposes of these tests?
                                                    2. Does reaching the 100% threshold unlock new capabilities or use-cases?
                                                    3. Are there other 100% reproducible (non toy) operating systems? How non-reproducible are other OSes?
                                                    4. Were there any particularly challenging non-reproducible components?
                                                    1. 7

                                                      Yocto Project (an embedded Linux system) also has a reproducibility status page:

                                                      https://www.yoctoproject.org/reproducible-build-results/

                                                      Here is their wiki page about the topic: https://wiki.yoctoproject.org/wiki/Reproducible_Builds

                                                      1. 2

                                                        Thank you. The documentation is very precise, which I find reassuring.

                                                      2. 5

                                                        What is being compared to determine whether two builds are consistent with one another? (diffoscope?) Isn’t the output necessarily different due to hardware optimizations? Are they turned off for the purposes of these tests?

                                                        In my understanding reproducible builds require that you target the same hardware, so e.g. arm64 without any extended instruction sets or so. Non-deterministic optimizations need to be turned of for that. https://reproducible-builds.org/docs/ is a nice resource, listing things which makes reproducible builds complicated in practice.

                                                        Does reaching the 100% threshold unlock new capabilities or use-cases?

                                                        Yes, one can assert whether a given ISO image matches upstream sources and hasn’t had any backdoors or so backed into the binary without disassembling it. This ability is lost if you are <100%.

                                                        Are there other 100% reproducible (non toy) operating systems? How non-reproducible are other OSes?

                                                        None that I know of, but many are working on it, see https://reproducible-builds.org/projects/

                                                        1. 2

                                                          Yes, one can assert whether a given ISO image matches upstream sources

                                                          The act of verifying removes the need for verification. When you build it yourself to check, you no longer need to check. Just use your build artifacts.

                                                          Reproducible builds are nice for other reasons – eg, caching by hash in distributed builds, but they’re security snake oil.

                                                          Finally: if you’ve got a trusting trust attack, you can have a backdoor with no evidence in the code, which still builds reproducibly.

                                                          1. 2

                                                            If you’re building it yourself to check, you no longer need to check. Just use your build artifacts. This is security theater.

                                                            It’s not. It would explicitly have prevented the Linux Mint ISO replacement attack we saw 6 years ago.

                                                            https://blog.linuxmint.com/?p=2994

                                                            (It belongs to the story that the parent comment is just parroting talking points from Tavis)

                                                            1. 1

                                                              It’s not. It would explicitly have prevented the Linux Mint ISO replacement attack we saw 6 years ago.

                                                              Can you explain how anyone would have noticed without building the ISO from scratch?

                                                              1. 3

                                                                I think preventing it is hard because there are so many avenues to exploit, but reproducible builds can help you determine whether a build has been compromised. If you don’t know whether the attacker managed to alter your build artifacts, you can just rebuild them and do a byte-for-byte comparison. If your builds aren’t reproducible, you have to look at what the differences are: are they changed timestamps? optimization levels? reordered files? etc

                                                                1. 2

                                                                  You need to build it yourself to check, but could notify others if hashes mismatch as that would be much more suspect than it would be for non-reproducible software. Independent third parties could build other peoples ISOs on a regular basis to check.

                                                                  1. 2

                                                                    Also, I forgot the obvious circumvention (beyond the trusting trust attack): being lazy and putting the exploit into the distributed code – since in practice, nobody actually audits the code they run, it seems like in practice this would effectively circumvent any benefits from reproducible builds. Signing the ISO gets you a hell of a lot more bang for the buck.

                                                                    1. 2

                                                                      Reproducible Builds only concerns itself of the distribution network and build server. It can’t solve compromises on the input because that is not the goal. We need other initiatives to solve that part. Reproducible Builds is only part of the puzzle, and I people like you and Tavis really struggle to see that. I don’t know why.

                                                                      This is very much like claiming memory safety issues are pointless to mitigate since logic bugs are still going to exist. But wouldn’t eliminating memory safety issues remove a good chunk of the attack surface though? Isn’t that a net gain?

                                                                      1. 1

                                                                        I can get the claimed benefits of reproducible builds by taking the exact steps I’d need to verify them – running a compiler and deploying the output.

                                                                        If you can tell me how to get memory safety by running a compiler once over existing code, with no changes and no runtime costs, I’d also call any existing memory safety efforts snake oil.

                                                                        Again, if you’re concerned about the security problems that reproducible builds claim to solve, you can solve them today with no code changes. Just run the builds.

                                                                        1. 1

                                                                          Again, if you’re concerned about the security problems that reproducible builds claim to solve, you can solve them today with no code changes. Just run the builds.

                                                                          I have better things to do then swap out my distribution with Gentoo and pretend it solves the problem.

                                                                      2. 1

                                                                        Yes of course, my claim was that one could check whether the binary matches the sources, not that it magically solves all security issues. You are right that people need to be able to trust their toolchains in the first place (trusting trust), but this is true for all software, reproducible or not.

                                                                        Another initiative in this direction are “bootstrappable builds”, https://www.bootstrappable.org/

                                                                    2. 2

                                                                      Nobody! And even fewer people if the ISO build is not reproducible. Which is the point of reproducible builds.

                                                                      Ensuring we can reproduce a bit-for-bit identical artifact ensures we can validate the work, even with a signing key compromise. Without reproducible builds we are only left to our own device and have no way to even start validating it.

                                                            1. 11

                                                              This missed my favorite technique, which is to ls > copy_files.sh and then edit the script in vim. It’s not very impressive, but - at least for me - much faster than writing the code presented in this article. :)

                                                              1. 11

                                                                I do that with vidir, it opens vim with a number and the filename per line, you can change the filename and when you exit vim it will just rename changed filenames by looking up the old name using the number.

                                                                1. 1

                                                                  See also my favourite tool, qmv from renameutils. Sounds like the same as your vidir but will just open whatever your $EDITOR is and doesn’t add line numbers.

                                                                  1. 1

                                                                    Wow, that’s almost what I wrote in python, dump file lists into lines, and rename or delete from the diff of the output. Sometimes I need create hardlink or move files around, and vidir seems only does rename?

                                                                    1. 2

                                                                      Deleting and moving files works too, hardlinks not.

                                                                      $ tree
                                                                      .
                                                                      ├── a
                                                                      ├── b
                                                                      └── c
                                                                      
                                                                      0 directories, 3 files
                                                                      $ vidir
                                                                      1   ./foo/bar/a
                                                                      3   ./foo/c
                                                                      :wq
                                                                      $ tree
                                                                      .
                                                                      └── foo
                                                                          ├── bar
                                                                          │   └── a
                                                                          └── c
                                                                      
                                                                      2 directories, 2 files
                                                                      
                                                                  2. 3

                                                                    same here

                                                                      ls *.txt | vim -
                                                                    
                                                                      abc.tx -> mv abc.tx abc.txt
                                                                    
                                                                      :w !sh
                                                                      q!
                                                                    
                                                                    1. 1

                                                                      Incidentally, I wrote a little Vim plugin earlier this week to streamline that workflow a bit, which makes editing that kind of stuff in Vim a bit easier.

                                                                      1. 1

                                                                        Nice method! I use ranger for bulk-renaming files in a vim-style workflow. However I frequently find myself installimg ranger for that single purpose. Your method seems more easily accessibie.

                                                                      1. 4

                                                                        Fantastic. As someone more familiar with Rust than C++, I’m enjoying this both as a review of the Rust memory model and as a window into how C++ developers think of these same concepts.

                                                                        1. 9

                                                                          Love Orca!

                                                                          I hope this isn’t against the rules, but I’ve been streaming myself learning Orca from scratch. I start from a blank canvas to a ‘full song’ in about an hour, or at least that’s the goal.

                                                                          Here are some other videos I’ve found helpful or just fun:

                                                                          1. 2

                                                                            I hope this isn’t against the rules, but I’ve been streaming myself learning Orca from scratch. I start from a blank canvas to a ‘full song’ in about an hour, or at least that’s the goal.

                                                                            Heck yes! I love the Orca programming model but have no musical skill whatsoever so it’s nice to see people actually use it for actual things.

                                                                          1. 6

                                                                            I feel this is very important. We shouldn’t needlessly divide our community.

                                                                            The Django effort to increase English readability reminds me of the easy_rust project.

                                                                            1. 2

                                                                              Very interesting example. Thanks.

                                                                            1. 4

                                                                              Firefox’s lack of alsa support is the sole reason I still have chromium installed on my machines.

                                                                              1. 1

                                                                                Have you tried apulse?

                                                                                1. 3

                                                                                  I settled for pipewire.

                                                                                  Pulse apps work, jack apps work.

                                                                                  1. 1

                                                                                    I tried using that, seems to break on suspend+resume, requiring me to kill and restart firefox.

                                                                                  2. 1

                                                                                    Just curious, what sorts of things does ALSA support allow you to do?

                                                                                    1. 3

                                                                                      I have a usb dac + amp setup I use for listening to music — one of those fancy ones that does 32bit audio at 384khz. It says 384khz on the LED screen when I use alsa but 44.1khz if I use pulseaudio. I don’t think I can tell the difference, but it has a convenient volume control knob and I like using it to listen to music or video links, and the volume setting is usually quite high so I really do not want unexpected audio to come out of it.

                                                                                      I also have a separate wireless dect headset that I use for zoom/googlemeet/teams/WebEx/etc. My attached Bluetooth pretends to be an audio device for my iPhone so I can use it for telephone calls. When I’m not in calls it is on a cradle and it auto-mutes so unexpected audio is less traumatic than with the dac.

                                                                                      The motherboard has an on-board audio I have hooked up to a tiny travel speaker. I use this as my ringer device in Skype and I have some scripts that put notifications on it for things that don’t understand wanting a different audio for ringing and teleconference.

                                                                                      Getting this to work with Alsa has been fairly straightforward but I don’t know how to make pulseaudio do anything except send the sound to the wrong device for a few minutes while I click around a menu looking for which of the hundred or so “Firefox” streams is the meeting I’m trying to join. (I have Firefox treetabs with nearly a thousand tabs open at the moment. Probably a hundred of which have an ad on them trying to open an audio stream — which thankfully Firefox automutes but it still shows up in pulseaudio “just in case”)

                                                                                      That being said, I am open to the possibility I’m using pulseaudio wrong, and there is some feature valuable enough to be worth figuring it out, so just curious, why do you use pulseaudio?

                                                                                      1. 3

                                                                                        PA can do a lot of that, but its interface is a bit… weird. (As you’ve discovered) If you ever want to try again, pipewire is pretty much replacing PA and it’s pretty sane. It allows you to use the jack tools and connection graph which makes all the reconnecting close to instant and you get full control over the links. And you can operate on stream names in scripting rather than weird interface IDs. For BT the big item is full control over the profile / codec of the device, which pulse doesn’t really do.

                                                                                        It exposes alsa, pulse and jack interface at the same time, so pretty much everything is still compatible. It’s still fresh enough that you want the latest release rather than the distro version though. Pulse is on its way out, so I wouldn’t invest too much time into it now

                                                                                        1. 2

                                                                                          Thanks for replying.

                                                                                          I’ve read this and some of the deeper pages, but to be honest it still seems quite mysterious to me. Do you have any good resources?

                                                                                        2. 1

                                                                                          I really do not want unexpected audio to come out of it.

                                                                                          What did you mean by this? Under what circumstances might a USB DAC+Amp play unexpected audio?

                                                                                          For context, I have the same setup as you (USB DAC+Amp+volume control) and it sometimes outputs noise. I’ve been trying to debug it for months with no luck so I’m just looking for ideas at this point.

                                                                                          1. 3

                                                                                            I mean I want to be explicit when I want audio to come out of the big speakers, as in by environment variable or something, rather than playing something, pausing, then navigating some menu to change the audio, then resuming.

                                                                                            That sounds terrible. I have a line in modprobe.d/ to set the index= and enabled= options of reach of the usb sound devices. I also set the index on my motherboard audio the same way. I don’t have any other special settings. As I mentioned, I don’t use pulseaudio, but I also don’t have jackd or anything like that either.

                                                                                            Have you poked around /proc/asound/cardX/pcm*/ to see if what linux is sending matches what your device is decoding? How have you verified this isn’t on the analog side?

                                                                                            1. 2

                                                                                              Thank you for the advice and for sharing more information about your setup. I have not looked at /proc yet - I shall spend some time this weekend going down that rabbit hole.

                                                                                        3. 1

                                                                                          In my case, the main feature of ALSA that pulse lacks is the ability to play audio reliably without randomly telling me that my sound card no longer exists two to three times a week.