detached 4c97002

runtime.go RawHistoryFolder

1package core
2
3import (
4	"fmt"
5	"sync"
6
7	portout "github.com/bnema/purego-pipewire/internal/ports/out"
8)
9
10type Runtime struct {
11	mu          sync.Mutex
12	capi        portout.CAPI
13	initialized bool
14}
15
16var (
17	pipewireMu     sync.Mutex
18	pipewireRefCnt int
19	pipewireCAPI   portout.CAPI
20)
21
22func NewRuntime(capi portout.CAPI) *Runtime {
23	return &Runtime{capi: capi}
24}
25
26func (r *Runtime) Init() error {
27	r.mu.Lock()
28	defer r.mu.Unlock()
29
30	if r.initialized {
31		return nil
32	}
33	if err := initPipeWire(r.capi); err != nil {
34		return err
35	}
36	r.initialized = true
37	return nil
38}
39
40// initPipeWire initializes the process-level PipeWire API once.
41func initPipeWire(capi portout.CAPI) error {
42	pipewireMu.Lock()
43	defer pipewireMu.Unlock()
44
45	if capi == nil {
46		return fmt.Errorf("runtime requires a non-nil CAPI implementation")
47	}
48
49	if pipewireRefCnt > 0 && pipewireCAPI != nil && capi != pipewireCAPI {
50		return fmt.Errorf("runtime already initialized with a different CAPI implementation")
51	}
52
53	if pipewireRefCnt == 0 {
54		pipewireCAPI = capi
55		capi.PWInit(nil, nil)
56	}
57	pipewireRefCnt++
58	return nil
59}
60
61func (r *Runtime) Deinit() {
62	r.mu.Lock()
63	defer r.mu.Unlock()
64
65	if !r.initialized {
66		return
67	}
68	r.initialized = false
69
70	pipewireMu.Lock()
71	defer pipewireMu.Unlock()
72
73	if pipewireRefCnt == 0 {
74		return
75	}
76
77	pipewireRefCnt--
78	if pipewireRefCnt == 0 {
79		pipewireCAPI.PWDeinit()
80		pipewireCAPI = nil
81	}
82}

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 1

Tags 8

↑↓ moveenter openesc close