Idle CPU: a fixed 10 ms main loop, and a PulseAudio stream that stays open after the stream ends

Aperta
#92 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
42/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
cpp, linux

Direzione di ricerca

Start with the fixed sleep in the main loop: LOOP_INTERVAL_MS at src/main.cpp:57 and the sleep_for block at src/main.cpp:733-743. The PulseAudio cork/close fix belongs in the code that handles the stream-ended event, which the payload does not name, so locate it first. Run the player with -o pulse, go idle after a stream ends, and confirm with pactl that the sink input is corked and the sink suspends. Done means both idle wakeup rates drop and the sink suspends, but the loop change may need the library to expose a waitable fd first.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Summary

An idle player has a CPU floor that never drops, and a stream that has ended keeps the sound server busy too. Neither is large, but both show up in "why does an idle player use CPU at all" reports. Downstream: music-assistant/local-audio-addon#31, where an idle player used about three times what the Music Assistant server did.

Measured on v0.3.0 (sendspin-cpp v0.8.0), -o pulse into Home Assistant OS's PulseAudio, x86_64, 4 cores.

1. The main loop polls every 10 ms, idle or not

src/main.cpp:57 sets LOOP_INTERVAL_MS = 10. Every pass polls mDNS, the control socket, the network provider, the sink and the hooks, then does sleep_for(10ms) (main.cpp:733-743), whether or not anything is happening.

Thread Wakeups/s CPU
main (sendspin-cli) 98 ~0.9% of one core, idle after a stream

That is the whole idle floor of the process. A loop that blocks on its file descriptors (the control socket, the mDNS fd, the websocket) with a timeout set by the next due timer would bring an idle player close to zero wakeups. The catch is that sendspin-cpp's network provider is polled from this loop (network provider polled only from the main loop in the v0.9.5 notes), so the library would need to expose something to wait on.

2. The native PulseAudio stream is never corked or closed when a stream ends

After I player: Stream ended, with status reporting state: paused and stream: idle, the PulseAudio sink input stays connected and uncorked:

Sink Input #3
	Sink: 0
	Corked: no
		application.name = "sendspin-cli"
0	alsa_output.pci-0000_00_1f.3.analog-stereo	...	RUNNING

The result:

  • libpulse's I/O thread (threaded-ml) keeps waking about 97 times a second.
  • The server's sink stays RUNNING and never suspends. The PulseAudio daemon itself sat at 1.6% of a core, almost all in its ALSA sink thread.
  • Any USB DAC or amp behind the sink is held awake, and module-suspend-on-idle never gets the chance to act.

Corking the stream at stream end (and uncorking at the next start), or closing it, would let the sink suspend. I haven't checked whether the ALSA, PipeWire or PortAudio sinks hold their device the same way.

How it was measured

Per-thread utime+stime deltas from /proc/<pid>/task/*/stat over 10-20 s windows, and voluntary plus nonvoluntary context-switch deltas from /proc/<pid>/task/*/status for the wakeup rates. Sink state is from pactl list sink-inputs and pactl list short sinks inside the Home Assistant audio container.

Lingua principale
C++
Stelle
14
Fork
5
Merge medio
1g 12h
PR unite (30g)
26

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di Sendspin/sendspin-cpp-cli

Tutte le issue di Sendspin/sendspin-cpp-cli

Issue simili

Altre issue su C++

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.