pipewire 1.4.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -9
- package/dist/bindings/context.d.ts +20 -0
- package/dist/bindings/context.d.ts.map +1 -0
- package/dist/bindings/context.js +12 -0
- package/dist/bindings/context.js.map +1 -0
- package/dist/bindings/core.d.ts +34 -0
- package/dist/bindings/core.d.ts.map +1 -0
- package/dist/bindings/core.js +36 -0
- package/dist/bindings/core.js.map +1 -0
- package/dist/bindings/dict.d.ts +3 -0
- package/dist/bindings/dict.d.ts.map +1 -0
- package/dist/bindings/dict.js +11 -0
- package/dist/bindings/dict.js.map +1 -0
- package/dist/bindings/hook.d.ts +3 -0
- package/dist/bindings/hook.d.ts.map +1 -0
- package/dist/bindings/hook.js +14 -0
- package/dist/bindings/hook.js.map +1 -0
- package/dist/bindings/index.d.ts +32 -0
- package/dist/bindings/index.d.ts.map +1 -0
- package/dist/bindings/index.js +16 -0
- package/dist/bindings/index.js.map +1 -0
- package/dist/bindings/list.d.ts +2 -0
- package/dist/bindings/list.d.ts.map +1 -0
- package/dist/bindings/list.js +7 -0
- package/dist/bindings/list.js.map +1 -0
- package/dist/bindings/loop.d.ts +33 -0
- package/dist/bindings/loop.d.ts.map +1 -0
- package/dist/bindings/loop.js +17 -0
- package/dist/bindings/loop.js.map +1 -0
- package/dist/bindings/main-loop.d.ts +47 -0
- package/dist/bindings/main-loop.d.ts.map +1 -0
- package/dist/bindings/main-loop.js +15 -0
- package/dist/bindings/main-loop.js.map +1 -0
- package/dist/bindings/node.d.ts +50 -0
- package/dist/bindings/node.d.ts.map +1 -0
- package/dist/bindings/node.js +81 -0
- package/dist/bindings/node.js.map +1 -0
- package/dist/bindings/param.d.ts +25 -0
- package/dist/bindings/param.d.ts.map +1 -0
- package/dist/bindings/param.js +33 -0
- package/dist/bindings/param.js.map +1 -0
- package/dist/bindings/pipewire.d.ts +19 -0
- package/dist/bindings/pipewire.d.ts.map +1 -0
- package/dist/bindings/pipewire.js +5 -0
- package/dist/bindings/pipewire.js.map +1 -0
- package/dist/bindings/pod.d.ts +2 -0
- package/dist/bindings/pod.d.ts.map +1 -0
- package/dist/bindings/pod.js +6 -0
- package/dist/bindings/pod.js.map +1 -0
- package/dist/bindings/properties.d.ts +2 -0
- package/dist/bindings/properties.d.ts.map +1 -0
- package/dist/bindings/properties.js +3 -0
- package/dist/bindings/properties.js.map +1 -0
- package/dist/bindings/props.d.ts +59 -0
- package/dist/bindings/props.d.ts.map +1 -0
- package/dist/bindings/props.js +59 -0
- package/dist/bindings/props.js.map +1 -0
- package/dist/bindings/proxy.d.ts +11 -0
- package/dist/bindings/proxy.d.ts.map +1 -0
- package/dist/bindings/proxy.js +5 -0
- package/dist/bindings/proxy.js.map +1 -0
- package/dist/bindings/registry.d.ts +20 -0
- package/dist/bindings/registry.d.ts.map +1 -0
- package/dist/bindings/registry.js +19 -0
- package/dist/bindings/registry.js.map +1 -0
- package/dist/bindings/thread-loop.d.ts +65 -0
- package/dist/bindings/thread-loop.d.ts.map +1 -0
- package/dist/bindings/thread-loop.js +18 -0
- package/dist/bindings/thread-loop.js.map +1 -0
- package/dist/index.d.ts +5 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -15
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +61 -37
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +104 -69
- package/dist/node.js.map +1 -1
- package/dist/object.d.ts +18 -0
- package/dist/object.d.ts.map +1 -0
- package/dist/object.js +22 -0
- package/dist/object.js.map +1 -0
- package/dist/pipewire.d.ts +50 -15
- package/dist/pipewire.d.ts.map +1 -1
- package/dist/pipewire.js +94 -3
- package/dist/pipewire.js.map +1 -1
- package/examples/basic.ts +20 -0
- package/examples/event-registry-async.ts +1 -1
- package/examples/event-registry-sync.ts +3 -2
- package/examples/node-events.ts +34 -0
- package/package.json +2 -3
- package/src/{core.ts → bindings/core.ts} +8 -6
- package/src/bindings/index.ts +16 -0
- package/src/bindings/node.ts +92 -0
- package/src/bindings/param.ts +33 -0
- package/src/bindings/pipewire.ts +6 -0
- package/src/{registry.ts → bindings/registry.ts} +2 -0
- package/src/index.ts +5 -15
- package/src/node.ts +178 -78
- package/src/object.ts +36 -0
- package/src/pipewire.ts +154 -3
- package/src/param.ts +0 -33
- /package/src/{context.ts → bindings/context.ts} +0 -0
- /package/src/{dict.ts → bindings/dict.ts} +0 -0
- /package/src/{hook.ts → bindings/hook.ts} +0 -0
- /package/src/{list.ts → bindings/list.ts} +0 -0
- /package/src/{loop.ts → bindings/loop.ts} +0 -0
- /package/src/{main-loop.ts → bindings/main-loop.ts} +0 -0
- /package/src/{pod.ts → bindings/pod.ts} +0 -0
- /package/src/{properties.ts → bindings/properties.ts} +0 -0
- /package/src/{props.ts → bindings/props.ts} +0 -0
- /package/src/{proxy.ts → bindings/proxy.ts} +0 -0
- /package/src/{thread-loop.ts → bindings/thread-loop.ts} +0 -0
package/dist/node.js
CHANGED
|
@@ -1,71 +1,106 @@
|
|
|
1
1
|
import koffi from "koffi";
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
]
|
|
2
|
+
import PipewireObject from "./object.js";
|
|
3
|
+
import pw from "./bindings/index.js";
|
|
4
|
+
export default class PipewireNode extends PipewireObject {
|
|
5
|
+
static pw_node_state = pw.node.pw_node_state_enum;
|
|
6
|
+
static spa_param_type = pw.param.spa_param_type;
|
|
7
|
+
nodeName;
|
|
8
|
+
factoryId;
|
|
9
|
+
nodeProxy = null;
|
|
10
|
+
nodeListener = null;
|
|
11
|
+
nodeEvents = null;
|
|
12
|
+
nodeEventInfoRegister = null;
|
|
13
|
+
nodeEventParamRegister = null;
|
|
14
|
+
constructor(pipewire, id, permissions, type, version, props) {
|
|
15
|
+
super(pipewire, id, permissions, type, version, props);
|
|
16
|
+
this.nodeName = props["node.name"];
|
|
17
|
+
this.factoryId = Number(props["factory.id"]);
|
|
18
|
+
}
|
|
19
|
+
attachListener() {
|
|
20
|
+
if (this.removed)
|
|
21
|
+
return;
|
|
22
|
+
if (this.nodeProxy)
|
|
23
|
+
throw new Error(`Listener already attached to node ${this.id}`);
|
|
24
|
+
this.nodeProxy = pw.registry.pw_registry_bind(this.pipewire.registry, this.id, this.type, pw.node.PW_VERSION_NODE, 0);
|
|
25
|
+
this.nodeListener = Buffer.alloc(koffi.sizeof(pw.hook.spa_hook));
|
|
26
|
+
this.nodeEvents = Buffer.alloc(koffi.sizeof(pw.node.pw_node_events));
|
|
27
|
+
this.nodeEventInfoRegister = koffi.register(this.nodeEventInfo.bind(this), koffi.pointer(pw.node.pw_node_events_info));
|
|
28
|
+
this.nodeEventParamRegister = koffi.register(this.nodeEventParam.bind(this), koffi.pointer(pw.node.pw_node_events_param));
|
|
29
|
+
koffi.encode(this.nodeEvents, pw.node.pw_node_events, {
|
|
30
|
+
version: pw.node.PW_VERSION_NODE_EVENTS,
|
|
31
|
+
info: this.nodeEventInfoRegister,
|
|
32
|
+
param: this.nodeEventParamRegister
|
|
33
|
+
});
|
|
34
|
+
pw.node.pw_node_add_listener(this.nodeProxy, this.nodeListener, this.nodeEvents, null);
|
|
35
|
+
}
|
|
36
|
+
detachListener() {
|
|
37
|
+
if (!this.nodeProxy)
|
|
38
|
+
throw new Error(`Listener not attached to node ${this.id}`);
|
|
39
|
+
if (!this.removed)
|
|
40
|
+
pw.proxy.pw_proxy_destroy(this.nodeProxy);
|
|
41
|
+
koffi.unregister(this.nodeEventParamRegister);
|
|
42
|
+
koffi.unregister(this.nodeEventInfoRegister);
|
|
43
|
+
this.nodeEventInfoRegister = null;
|
|
44
|
+
this.nodeEventParamRegister = null;
|
|
45
|
+
this.nodeEvents = null;
|
|
46
|
+
this.nodeListener = null;
|
|
47
|
+
this.nodeProxy = null;
|
|
48
|
+
}
|
|
49
|
+
subscribeParams(params) {
|
|
50
|
+
if (this.removed)
|
|
51
|
+
return;
|
|
52
|
+
if (!this.nodeProxy)
|
|
53
|
+
throw new Error(`Listener not attached to node ${this.id}`);
|
|
54
|
+
pw.node.pw_node_subscribe_params(this.nodeProxy, params, params.length);
|
|
55
|
+
}
|
|
56
|
+
nodeEventInfo(_data, info) {
|
|
57
|
+
this.emit("rawNodeInfo", { info });
|
|
58
|
+
const nodeInfo = koffi.decode(info, pw.node.pw_node_info);
|
|
59
|
+
const changesMasks = Object.keys(pw.node.PW_NODE_CHANGE_MASK);
|
|
60
|
+
const changes = changesMasks.filter((key) => nodeInfo.change_mask & pw.node.PW_NODE_CHANGE_MASK[key]);
|
|
61
|
+
const props = koffi.decode(nodeInfo.props, pw.dict.spa_dict);
|
|
62
|
+
if (changes.includes("PROPS") !== !!props.items)
|
|
63
|
+
throw new Error(`Node ${this.id} props change mismatch`);
|
|
64
|
+
const propsObj = changes.includes("PROPS") ? {} : null;
|
|
65
|
+
if (propsObj) {
|
|
66
|
+
const propsArray = koffi.decode(props.items, pw.dict.spa_dict_item, props.n_items);
|
|
67
|
+
for (const item of propsArray)
|
|
68
|
+
propsObj[item.key] = item.value;
|
|
69
|
+
}
|
|
70
|
+
const paramsObj = [];
|
|
71
|
+
if (nodeInfo.params) {
|
|
72
|
+
const params = koffi.decode(nodeInfo.params, pw.param.spa_param_info, nodeInfo.n_params);
|
|
73
|
+
for (const param of params)
|
|
74
|
+
paramsObj.push(param.id);
|
|
75
|
+
}
|
|
76
|
+
const nodeInfoObj = {
|
|
77
|
+
id: nodeInfo.id,
|
|
78
|
+
maxInputPorts: nodeInfo.max_input_ports,
|
|
79
|
+
maxOutputPorts: nodeInfo.max_output_ports,
|
|
80
|
+
changes: changes,
|
|
81
|
+
inputPortsCount: nodeInfo.n_input_ports,
|
|
82
|
+
outputPortsCount: nodeInfo.n_output_ports,
|
|
83
|
+
state: nodeInfo.state,
|
|
84
|
+
error: nodeInfo.error ? koffi.decode(nodeInfo.error, "string") : null,
|
|
85
|
+
props: propsObj,
|
|
86
|
+
params: paramsObj
|
|
87
|
+
};
|
|
88
|
+
this.emit("nodeInfo", nodeInfoObj);
|
|
89
|
+
}
|
|
90
|
+
nodeEventParam(_data, seq, id, index, next, param) {
|
|
91
|
+
this.emit("rawNodeParam", { seq, id, index, next, param });
|
|
92
|
+
}
|
|
93
|
+
on(event, listener) {
|
|
94
|
+
return super.on(event, listener);
|
|
95
|
+
}
|
|
96
|
+
once(event, listener) {
|
|
97
|
+
return super.once(event, listener);
|
|
98
|
+
}
|
|
99
|
+
off(event, listener) {
|
|
100
|
+
return super.off(event, listener);
|
|
101
|
+
}
|
|
102
|
+
emit(event, ...args) {
|
|
103
|
+
return super.emit(event, ...args);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
71
106
|
//# sourceMappingURL=node.js.map
|
package/dist/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,cAAc,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAErC,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,cAAc;IACpD,MAAM,CAAU,aAAa,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC;IAC3D,MAAM,CAAU,cAAc,GAAG,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC;IAEzD,QAAQ,CAAS;IACjB,SAAS,CAAS;IAElB,SAAS,GAAmB,IAAI,CAAC;IACjC,YAAY,GAAkB,IAAI,CAAC;IACnC,UAAU,GAAkB,IAAI,CAAC;IACjC,qBAAqB,GAAkB,IAAI,CAAC;IAC5C,sBAAsB,GAAkB,IAAI,CAAC;IAE7C,YACI,QAAkB,EAClB,EAAU,EACV,WAAmB,EACnB,IAAY,EACZ,OAAe,EACf,KAAgC;QAEhC,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAE,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,cAAc;QACV,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAEpF,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CACzC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EACtB,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,IAAI,EACT,EAAE,CAAC,IAAI,CAAC,eAAe,EACvB,CAAC,CACJ,CAAC;QACF,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC,QAAQ,CACvC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAC7B,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAC7C,CAAC;QACF,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC,QAAQ,CACxC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAC9B,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAC9C,CAAC;QACF,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE;YAClD,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,sBAAsB;YACvC,IAAI,EAAE,IAAI,CAAC,qBAAqB;YAChC,KAAK,EAAE,IAAI,CAAC,sBAAsB;SACrC,CAAC,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC3F,CAAC;IAED,cAAc;QACV,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAEjF,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7D,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,sBAAuB,CAAC,CAAC;QAC/C,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,qBAAsB,CAAC,CAAC;QAC9C,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,eAAe,CAAC,MAAwB;QACpC,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACjF,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5E,CAAC;IAED,aAAa,CAAC,KAAc,EAAE,IAAa;QACvC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAEnC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAE1D,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAiD,CAAC;QAC9G,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;QAEtG,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7D,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,EAAE,wBAAwB,CAAC,CAAC;QAE1G,MAAM,QAAQ,GAAqC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACzF,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACnF,KAAK,MAAM,IAAI,IAAI,UAAU;gBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACnE,CAAC;QAED,MAAM,SAAS,GAAqB,EAAE,CAAC;QACvC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACzF,KAAK,MAAM,KAAK,IAAI,MAAM;gBAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAoB,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,WAAW,GAAa;YAC1B,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,aAAa,EAAE,QAAQ,CAAC,eAAe;YACvC,cAAc,EAAE,QAAQ,CAAC,gBAAgB;YACzC,OAAO,EAAE,OAAO;YAChB,eAAe,EAAE,QAAQ,CAAC,aAAa;YACvC,gBAAgB,EAAE,QAAQ,CAAC,cAAc;YACzC,KAAK,EAAE,QAAQ,CAAC,KAAsB;YACtC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;YACrE,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,SAAS;SACpB,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACvC,CAAC;IAED,cAAc,CAAC,KAAc,EAAE,GAAW,EAAE,EAAU,EAAE,KAAa,EAAE,IAAY,EAAE,KAAc;QAC/F,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;IAMD,EAAE,CAAC,KAAsB,EAAE,QAAkC;QACzD,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;IAMD,IAAI,CAAC,KAAsB,EAAE,QAAkC;QAC3D,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAMD,GAAG,CAAC,KAAsB,EAAE,QAAkC;QAC1D,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IAMD,IAAI,CAAC,KAAsB,EAAE,GAAG,IAAW;QACvC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;IACtC,CAAC;CACJ"}
|
package/dist/object.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import EventEmitter from "node:events";
|
|
2
|
+
import type Pipewire from "./pipewire.js";
|
|
3
|
+
export default class PipewireObject extends EventEmitter {
|
|
4
|
+
pipewire: Pipewire;
|
|
5
|
+
removed: boolean;
|
|
6
|
+
id: number;
|
|
7
|
+
permissions: number;
|
|
8
|
+
type: string;
|
|
9
|
+
version: number;
|
|
10
|
+
props: {
|
|
11
|
+
[key: string]: string;
|
|
12
|
+
};
|
|
13
|
+
objectSerial: number;
|
|
14
|
+
constructor(pipewire: Pipewire, id: number, permissions: number, type: string, version: number, props: {
|
|
15
|
+
[key: string]: string;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=object.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAC;AACvC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAE1C,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,YAAY;IACpD,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAS;IAEzB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAEjC,YAAY,EAAE,MAAM,CAAC;IAErB,YACI,QAAQ,EAAE,QAAQ,EAClB,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,EAanC;CACJ"}
|
package/dist/object.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import EventEmitter from "node:events";
|
|
2
|
+
export default class PipewireObject extends EventEmitter {
|
|
3
|
+
pipewire;
|
|
4
|
+
removed = false;
|
|
5
|
+
id;
|
|
6
|
+
permissions;
|
|
7
|
+
type;
|
|
8
|
+
version;
|
|
9
|
+
props;
|
|
10
|
+
objectSerial;
|
|
11
|
+
constructor(pipewire, id, permissions, type, version, props) {
|
|
12
|
+
super();
|
|
13
|
+
this.pipewire = pipewire;
|
|
14
|
+
this.id = id;
|
|
15
|
+
this.permissions = permissions;
|
|
16
|
+
this.type = type;
|
|
17
|
+
this.version = version;
|
|
18
|
+
this.props = props;
|
|
19
|
+
this.objectSerial = Number(props["object.serial"]);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object.js","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAC;AAGvC,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,YAAY;IACpD,QAAQ,CAAW;IACnB,OAAO,GAAY,KAAK,CAAC;IAEzB,EAAE,CAAS;IACX,WAAW,CAAS;IACpB,IAAI,CAAS;IACb,OAAO,CAAS;IAChB,KAAK,CAA4B;IAEjC,YAAY,CAAS;IAErB,YACI,QAAkB,EAClB,EAAU,EACV,WAAmB,EACnB,IAAY,EACZ,OAAe,EACf,KAAgC;QAEhC,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEzB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAEnB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IACvD,CAAC;CACJ"}
|
package/dist/pipewire.d.ts
CHANGED
|
@@ -1,19 +1,54 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import EventEmitter from "node:events";
|
|
2
|
+
import PipewireObject from "./object.js";
|
|
3
|
+
export default class Pipewire extends EventEmitter {
|
|
4
|
+
mainLoop: unknown;
|
|
5
|
+
loop: unknown;
|
|
6
|
+
context: unknown;
|
|
7
|
+
core: unknown;
|
|
8
|
+
registry: unknown;
|
|
9
|
+
registry_listener: Buffer;
|
|
10
|
+
registryEvents: Buffer;
|
|
11
|
+
registryEventGlobalRegister: bigint;
|
|
12
|
+
registryEventGlobalRemoveRegister: bigint;
|
|
13
|
+
loopInterval: NodeJS.Timeout | null;
|
|
14
|
+
objects: {
|
|
15
|
+
[id: number]: PipewireObject;
|
|
8
16
|
};
|
|
17
|
+
constructor();
|
|
18
|
+
registryEventGlobal(_data: unknown, id: number, permissions: number, type: string, version: number, props: unknown): void;
|
|
19
|
+
registryEventGlobalRemove(_data: unknown, id: number): void;
|
|
20
|
+
startLoop(pollInterval?: number, pollTimeout?: number): void;
|
|
21
|
+
stopLoop(): void;
|
|
22
|
+
on(event: "objectAdded", listener: (object: PipewireObject) => void): this;
|
|
23
|
+
on(event: "objectRemoved", listener: (object: PipewireObject) => void): this;
|
|
24
|
+
on(event: "rawObjectAdded", listener: (data: RawObjectAdded) => void): this;
|
|
25
|
+
on(event: "rawObjectRemoved", listener: (data: RawObjectRemoved) => void): this;
|
|
26
|
+
on(event: string | symbol, listener: (...args: any[]) => void): this;
|
|
27
|
+
once(event: "objectAdded", listener: (object: PipewireObject) => void): this;
|
|
28
|
+
once(event: "objectRemoved", listener: (object: PipewireObject) => void): this;
|
|
29
|
+
once(event: "rawObjectAdded", listener: (data: RawObjectAdded) => void): this;
|
|
30
|
+
once(event: "rawObjectRemoved", listener: (data: RawObjectRemoved) => void): this;
|
|
31
|
+
once(event: string | symbol, listener: (...args: any[]) => void): this;
|
|
32
|
+
off(event: "objectAdded", listener: (object: PipewireObject) => void): this;
|
|
33
|
+
off(event: "objectRemoved", listener: (object: PipewireObject) => void): this;
|
|
34
|
+
off(event: "rawObjectAdded", listener: (data: RawObjectAdded) => void): this;
|
|
35
|
+
off(event: "rawObjectRemoved", listener: (data: RawObjectRemoved) => void): this;
|
|
36
|
+
off(event: string | symbol, listener: (...args: any[]) => void): this;
|
|
37
|
+
emit(event: "objectAdded", object: PipewireObject): boolean;
|
|
38
|
+
emit(event: "objectRemoved", object: PipewireObject): boolean;
|
|
39
|
+
emit(event: "rawObjectAdded", data: RawObjectAdded): boolean;
|
|
40
|
+
emit(event: "rawObjectRemoved", data: RawObjectRemoved): boolean;
|
|
41
|
+
emit(event: string | symbol, ...args: any[]): boolean;
|
|
42
|
+
deinit(): void;
|
|
43
|
+
}
|
|
44
|
+
export type RawObjectAdded = {
|
|
45
|
+
id: number;
|
|
46
|
+
permissions: number;
|
|
47
|
+
type: string;
|
|
48
|
+
version: number;
|
|
49
|
+
props: unknown;
|
|
9
50
|
};
|
|
10
|
-
export
|
|
11
|
-
|
|
12
|
-
async: (...args: any[]) => any;
|
|
13
|
-
info: {
|
|
14
|
-
name: string;
|
|
15
|
-
arguments: import("koffi").TypeObject[];
|
|
16
|
-
result: import("koffi").TypeObject;
|
|
17
|
-
};
|
|
51
|
+
export type RawObjectRemoved = {
|
|
52
|
+
id: number;
|
|
18
53
|
};
|
|
19
54
|
//# sourceMappingURL=pipewire.d.ts.map
|
package/dist/pipewire.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipewire.d.ts","sourceRoot":"","sources":["../src/pipewire.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pipewire.d.ts","sourceRoot":"","sources":["../src/pipewire.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAC;AAGvC,OAAO,cAAc,MAAM,aAAa,CAAC;AAGzC,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,YAAY;IAC9C,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAElB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,2BAA2B,EAAE,MAAM,CAAC;IACpC,iCAAiC,EAAE,MAAM,CAAC;IAE1C,YAAY,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAQ;IAE3C,OAAO,EAAE;QAAE,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,CAAA;KAAE,CAAM;IAE/C,cA2BC;IAED,mBAAmB,CACf,KAAK,EAAE,OAAO,EACd,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,GACf,IAAI,CAeN;IAED,yBAAyB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAU1D;IAED,SAAS,CAAC,YAAY,GAAE,MAAW,EAAE,WAAW,GAAE,MAAU,GAAG,IAAI,CAIlE;IAED,QAAQ,IAAI,IAAI,CAKf;IAED,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI,CAAC;IAC3E,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI,CAAC;IAC7E,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI,CAAC;IAC5E,EAAE,CAAC,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,GAAG,IAAI,CAAC;IAChF,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAKrE,IAAI,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI,CAAC;IAC7E,IAAI,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI,CAAC;IAC/E,IAAI,CAAC,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI,CAAC;IAC9E,IAAI,CAAC,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,GAAG,IAAI,CAAC;IAClF,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAKvE,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI,CAAC;IAC5E,GAAG,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI,CAAC;IAC9E,GAAG,CAAC,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI,CAAC;IAC7E,GAAG,CAAC,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,GAAG,IAAI,CAAC;IACjF,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAKtE,IAAI,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC;IAC5D,IAAI,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC;IAC9D,IAAI,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC;IAC7D,IAAI,CAAC,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC;IACjE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IAKtD,MAAM,IAAI,IAAI,CAOb;CACJ;AAED,MAAM,MAAM,cAAc,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;CACd,CAAC"}
|
package/dist/pipewire.js
CHANGED
|
@@ -1,5 +1,96 @@
|
|
|
1
|
+
import EventEmitter from "node:events";
|
|
1
2
|
import koffi from "koffi";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
import pw from "./bindings/index.js";
|
|
4
|
+
import PipewireObject from "./object.js";
|
|
5
|
+
import PipewireNode from "./node.js";
|
|
6
|
+
export default class Pipewire extends EventEmitter {
|
|
7
|
+
mainLoop;
|
|
8
|
+
loop;
|
|
9
|
+
context;
|
|
10
|
+
core;
|
|
11
|
+
registry;
|
|
12
|
+
registry_listener;
|
|
13
|
+
registryEvents;
|
|
14
|
+
registryEventGlobalRegister;
|
|
15
|
+
registryEventGlobalRemoveRegister;
|
|
16
|
+
loopInterval = null;
|
|
17
|
+
objects = {};
|
|
18
|
+
constructor() {
|
|
19
|
+
super();
|
|
20
|
+
pw.pipewire.pw_init(0, null);
|
|
21
|
+
this.mainLoop = pw.main_loop.pw_main_loop_new(null);
|
|
22
|
+
this.loop = pw.main_loop.pw_main_loop_get_loop(this.mainLoop);
|
|
23
|
+
this.context = pw.context.pw_context_new(this.loop, null, 0);
|
|
24
|
+
this.core = pw.core.pw_context_connect(this.context, null, 0);
|
|
25
|
+
this.registry = pw.core.pw_core_get_registry(this.core, pw.core.PW_VERSION_REGISTRY, 0);
|
|
26
|
+
this.registry_listener = Buffer.alloc(koffi.sizeof(pw.hook.spa_hook));
|
|
27
|
+
this.registryEvents = Buffer.alloc(koffi.sizeof(pw.core.pw_registry_events));
|
|
28
|
+
this.registryEventGlobalRegister = koffi.register(this.registryEventGlobal.bind(this), koffi.pointer(pw.core.pw_registry_events_global));
|
|
29
|
+
this.registryEventGlobalRemoveRegister = koffi.register(this.registryEventGlobalRemove.bind(this), koffi.pointer(pw.core.pw_registry_events_global_remove));
|
|
30
|
+
koffi.encode(this.registryEvents, pw.core.pw_registry_events, {
|
|
31
|
+
version: pw.registry.PW_VERSION_REGISTRY_EVENTS,
|
|
32
|
+
global: this.registryEventGlobalRegister,
|
|
33
|
+
global_remove: this.registryEventGlobalRemoveRegister
|
|
34
|
+
});
|
|
35
|
+
pw.registry.pw_registry_add_listener(this.registry, this.registry_listener, this.registryEvents, null);
|
|
36
|
+
}
|
|
37
|
+
registryEventGlobal(_data, id, permissions, type, version, props) {
|
|
38
|
+
this.emit("rawObjectAdded", { id, permissions, type, version, props });
|
|
39
|
+
if (this.objects[id])
|
|
40
|
+
throw new Error(`Object with id ${id} already exists`);
|
|
41
|
+
const propsDict = koffi.decode(props, pw.dict.spa_dict);
|
|
42
|
+
const propsArray = koffi.decode(propsDict.items, pw.dict.spa_dict_item, propsDict.n_items);
|
|
43
|
+
const propsObj = {};
|
|
44
|
+
for (const item of propsArray)
|
|
45
|
+
propsObj[item.key] = item.value;
|
|
46
|
+
if (type === "PipeWire:Interface:Node")
|
|
47
|
+
this.objects[id] = new PipewireNode(this, id, permissions, type, version, propsObj);
|
|
48
|
+
else
|
|
49
|
+
this.objects[id] = new PipewireObject(this, id, permissions, type, version, propsObj);
|
|
50
|
+
this.emit("objectAdded", this.objects[id]);
|
|
51
|
+
}
|
|
52
|
+
registryEventGlobalRemove(_data, id) {
|
|
53
|
+
this.emit("rawObjectRemoved", { id });
|
|
54
|
+
if (!this.objects[id])
|
|
55
|
+
throw new Error(`Object with id ${id} does not exist`);
|
|
56
|
+
this.objects[id].removed = true;
|
|
57
|
+
if (this.objects[id] instanceof PipewireNode && this.objects[id].nodeProxy)
|
|
58
|
+
this.objects[id].detachListener();
|
|
59
|
+
this.emit("objectRemoved", this.objects[id]);
|
|
60
|
+
delete this.objects[id];
|
|
61
|
+
}
|
|
62
|
+
startLoop(pollInterval = 10, pollTimeout = 1) {
|
|
63
|
+
if (this.loopInterval)
|
|
64
|
+
throw new Error("Loop already started");
|
|
65
|
+
pw.loop.pw_loop_enter(this.loop);
|
|
66
|
+
this.loopInterval = setInterval(() => pw.loop.pw_loop_iterate(this.loop, pollTimeout), pollInterval);
|
|
67
|
+
}
|
|
68
|
+
stopLoop() {
|
|
69
|
+
if (!this.loopInterval)
|
|
70
|
+
throw new Error("Loop not started");
|
|
71
|
+
clearInterval(this.loopInterval);
|
|
72
|
+
this.loopInterval = null;
|
|
73
|
+
pw.loop.pw_loop_leave(this.loop);
|
|
74
|
+
}
|
|
75
|
+
on(event, listener) {
|
|
76
|
+
return super.on(event, listener);
|
|
77
|
+
}
|
|
78
|
+
once(event, listener) {
|
|
79
|
+
return super.once(event, listener);
|
|
80
|
+
}
|
|
81
|
+
off(event, listener) {
|
|
82
|
+
return super.off(event, listener);
|
|
83
|
+
}
|
|
84
|
+
emit(event, ...args) {
|
|
85
|
+
return super.emit(event, ...args);
|
|
86
|
+
}
|
|
87
|
+
deinit() {
|
|
88
|
+
pw.proxy.pw_proxy_destroy(this.registry);
|
|
89
|
+
koffi.unregister(this.registryEventGlobalRegister);
|
|
90
|
+
koffi.unregister(this.registryEventGlobalRemoveRegister);
|
|
91
|
+
pw.core.pw_core_disconnect(this.core);
|
|
92
|
+
pw.context.pw_context_destroy(this.context);
|
|
93
|
+
pw.main_loop.pw_main_loop_destroy(this.mainLoop);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
5
96
|
//# sourceMappingURL=pipewire.js.map
|
package/dist/pipewire.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipewire.js","sourceRoot":"","sources":["../src/pipewire.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"pipewire.js","sourceRoot":"","sources":["../src/pipewire.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Pipewire } from "../src/index.js";
|
|
2
|
+
|
|
3
|
+
const pipewire = new Pipewire();
|
|
4
|
+
|
|
5
|
+
pipewire.on("objectAdded", (obj) => {
|
|
6
|
+
console.log(`New object: id: ${obj.id} type: ${obj.type} version: ${obj.version}`);
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
pipewire.on("objectRemoved", (obj) => {
|
|
10
|
+
console.log(`Removed object: id: ${obj.id}`);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
console.log("Starting PipeWire main loop...");
|
|
14
|
+
pipewire.startLoop();
|
|
15
|
+
|
|
16
|
+
process.on("SIGINT", () => {
|
|
17
|
+
pipewire.stopLoop();
|
|
18
|
+
pipewire.deinit();
|
|
19
|
+
console.log("PipeWire main loop exited, cleanup done.");
|
|
20
|
+
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import koffi from "koffi";
|
|
2
|
-
import
|
|
2
|
+
import { bindings as pw } from "../src/index.js";
|
|
3
3
|
|
|
4
4
|
(async () => {
|
|
5
5
|
pw.pipewire.pw_init(0, null);
|
|
@@ -47,13 +47,14 @@ import * as pw from "../src/index.js";
|
|
|
47
47
|
const interval = setInterval(() => pw.loop.pw_loop_iterate(loop, 1), 10);
|
|
48
48
|
await new Promise((resolve) => process.on("SIGINT", resolve));
|
|
49
49
|
clearInterval(interval);
|
|
50
|
+
pw.loop.pw_loop_leave(loop);
|
|
50
51
|
|
|
51
52
|
pw.proxy.pw_proxy_destroy(registry);
|
|
52
53
|
koffi.unregister(registry_event_global_register);
|
|
53
54
|
koffi.unregister(registry_event_global_remove_register);
|
|
54
55
|
pw.core.pw_core_disconnect(core);
|
|
55
56
|
pw.context.pw_context_destroy(context);
|
|
56
|
-
pw.main_loop.pw_main_loop_destroy(
|
|
57
|
+
pw.main_loop.pw_main_loop_destroy(mainLoop);
|
|
57
58
|
|
|
58
59
|
console.log("PipeWire main loop exited, cleanup done.");
|
|
59
60
|
})();
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Pipewire, PipewireNode } from "../src/index.js";
|
|
2
|
+
|
|
3
|
+
const pipewire = new Pipewire();
|
|
4
|
+
|
|
5
|
+
pipewire.on("objectAdded", (obj) => {
|
|
6
|
+
if (!(obj instanceof PipewireNode)) return;
|
|
7
|
+
console.log(`Node added: id: ${obj.id} name: ${obj.nodeName}`);
|
|
8
|
+
|
|
9
|
+
obj.on("nodeInfo", (info) => {
|
|
10
|
+
console.log(`Node info for id ${obj.id}: ${info.changes.join(", ")}`);
|
|
11
|
+
});
|
|
12
|
+
obj.on("rawNodeParam", () => {
|
|
13
|
+
console.log(`Node param for id ${obj.id}`);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
setImmediate(() => {
|
|
17
|
+
obj.attachListener();
|
|
18
|
+
obj.subscribeParams(Object.values(PipewireNode.spa_param_type).filter((v) => typeof v === "number"));
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
pipewire.on("objectRemoved", (obj) => {
|
|
23
|
+
if (!(obj instanceof PipewireNode)) return;
|
|
24
|
+
console.log(`Node removed: id: ${obj.id} name: ${obj.nodeName}`);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
console.log("Starting PipeWire main loop...");
|
|
28
|
+
pipewire.startLoop();
|
|
29
|
+
|
|
30
|
+
process.on("SIGINT", () => {
|
|
31
|
+
pipewire.stopLoop();
|
|
32
|
+
pipewire.deinit();
|
|
33
|
+
console.log("PipeWire main loop exited, cleanup done.");
|
|
34
|
+
});
|
package/package.json
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pipewire",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"scripts": {
|
|
7
|
-
"build": "tsc -p tsconfig.build.json"
|
|
8
|
-
"publish": "npm run build && npm publish"
|
|
7
|
+
"build": "tsc -p tsconfig.build.json"
|
|
9
8
|
},
|
|
10
9
|
"keywords": [],
|
|
11
10
|
"homepage": "https://github.com/Raraph84/node-pipewire",
|
|
@@ -4,19 +4,21 @@ import { pw_properties } from "./properties.js";
|
|
|
4
4
|
|
|
5
5
|
const pipewire = koffi.load("libpipewire-0.3.so.0");
|
|
6
6
|
|
|
7
|
+
export const PW_VERSION_REGISTRY = 3;
|
|
8
|
+
|
|
7
9
|
export const pw_core = koffi.opaque("pw_core");
|
|
8
10
|
export const pw_registry = koffi.opaque("pw_registry");
|
|
9
11
|
|
|
10
12
|
export const pw_context_connect = pipewire.func("pw_context_connect", koffi.pointer(pw_core), [
|
|
11
|
-
koffi.pointer(pw_context),
|
|
12
|
-
koffi.pointer(pw_properties),
|
|
13
|
-
"size_t"
|
|
13
|
+
koffi.pointer(pw_context), // context
|
|
14
|
+
koffi.pointer(pw_properties), // properties
|
|
15
|
+
"size_t" // user_data_size
|
|
14
16
|
]);
|
|
15
17
|
|
|
16
18
|
export const pw_core_get_registry = pipewire.func("pw_core_get_registry", koffi.pointer(pw_registry), [
|
|
17
|
-
koffi.pointer(pw_core),
|
|
18
|
-
"uint32_t",
|
|
19
|
-
"size_t"
|
|
19
|
+
koffi.pointer(pw_core), // core
|
|
20
|
+
"uint32_t", // version
|
|
21
|
+
"size_t" // user_data_size
|
|
20
22
|
]);
|
|
21
23
|
|
|
22
24
|
export const pw_registry_events_global = koffi.proto("void", [
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as context from "./context.js";
|
|
2
|
+
import * as core from "./core.js";
|
|
3
|
+
import * as dict from "./dict.js";
|
|
4
|
+
import * as hook from "./hook.js";
|
|
5
|
+
import * as loop from "./loop.js";
|
|
6
|
+
import * as main_loop from "./main-loop.js";
|
|
7
|
+
import * as node from "./node.js";
|
|
8
|
+
import * as param from "./param.js";
|
|
9
|
+
import * as pipewire from "./pipewire.js";
|
|
10
|
+
import * as pod from "./pod.js";
|
|
11
|
+
import * as props from "./props.js";
|
|
12
|
+
import * as proxy from "./proxy.js";
|
|
13
|
+
import * as registry from "./registry.js";
|
|
14
|
+
import * as thread_loop from "./thread-loop.js";
|
|
15
|
+
|
|
16
|
+
export default { context, core, dict, hook, loop, main_loop, node, param, pod, props, pipewire, proxy, registry, thread_loop };
|