If HDA only pops rather than plays a small piece of audio repeatedly, it may not be an under-run due to the userspace app not being able to keep up, but rather that the buffer updating process isn't happening correctly for certain cases.
IMO you don't have to have interrupts to get it to work well.
You can choose to dedicate a core for HDA and let the driver spin on it polling the card and software queues.
Other core(s) can build "software defined descriptor packets" and send them over to the driver core for service.
This should give you very low latency between the card and the driver, at the cost of CPU cycles. It seems quite suitable for the current situation:
Quote:
Multiprocessor support (multiprocessor scheduler not ready!!)
Later, you'd have to decide whether audio is important enough to always have a dedicated core servicing it though.