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.
Files changed (112) hide show
  1. package/README.md +29 -9
  2. package/dist/bindings/context.d.ts +20 -0
  3. package/dist/bindings/context.d.ts.map +1 -0
  4. package/dist/bindings/context.js +12 -0
  5. package/dist/bindings/context.js.map +1 -0
  6. package/dist/bindings/core.d.ts +34 -0
  7. package/dist/bindings/core.d.ts.map +1 -0
  8. package/dist/bindings/core.js +36 -0
  9. package/dist/bindings/core.js.map +1 -0
  10. package/dist/bindings/dict.d.ts +3 -0
  11. package/dist/bindings/dict.d.ts.map +1 -0
  12. package/dist/bindings/dict.js +11 -0
  13. package/dist/bindings/dict.js.map +1 -0
  14. package/dist/bindings/hook.d.ts +3 -0
  15. package/dist/bindings/hook.d.ts.map +1 -0
  16. package/dist/bindings/hook.js +14 -0
  17. package/dist/bindings/hook.js.map +1 -0
  18. package/dist/bindings/index.d.ts +32 -0
  19. package/dist/bindings/index.d.ts.map +1 -0
  20. package/dist/bindings/index.js +16 -0
  21. package/dist/bindings/index.js.map +1 -0
  22. package/dist/bindings/list.d.ts +2 -0
  23. package/dist/bindings/list.d.ts.map +1 -0
  24. package/dist/bindings/list.js +7 -0
  25. package/dist/bindings/list.js.map +1 -0
  26. package/dist/bindings/loop.d.ts +33 -0
  27. package/dist/bindings/loop.d.ts.map +1 -0
  28. package/dist/bindings/loop.js +17 -0
  29. package/dist/bindings/loop.js.map +1 -0
  30. package/dist/bindings/main-loop.d.ts +47 -0
  31. package/dist/bindings/main-loop.d.ts.map +1 -0
  32. package/dist/bindings/main-loop.js +15 -0
  33. package/dist/bindings/main-loop.js.map +1 -0
  34. package/dist/bindings/node.d.ts +50 -0
  35. package/dist/bindings/node.d.ts.map +1 -0
  36. package/dist/bindings/node.js +81 -0
  37. package/dist/bindings/node.js.map +1 -0
  38. package/dist/bindings/param.d.ts +25 -0
  39. package/dist/bindings/param.d.ts.map +1 -0
  40. package/dist/bindings/param.js +33 -0
  41. package/dist/bindings/param.js.map +1 -0
  42. package/dist/bindings/pipewire.d.ts +19 -0
  43. package/dist/bindings/pipewire.d.ts.map +1 -0
  44. package/dist/bindings/pipewire.js +5 -0
  45. package/dist/bindings/pipewire.js.map +1 -0
  46. package/dist/bindings/pod.d.ts +2 -0
  47. package/dist/bindings/pod.d.ts.map +1 -0
  48. package/dist/bindings/pod.js +6 -0
  49. package/dist/bindings/pod.js.map +1 -0
  50. package/dist/bindings/properties.d.ts +2 -0
  51. package/dist/bindings/properties.d.ts.map +1 -0
  52. package/dist/bindings/properties.js +3 -0
  53. package/dist/bindings/properties.js.map +1 -0
  54. package/dist/bindings/props.d.ts +59 -0
  55. package/dist/bindings/props.d.ts.map +1 -0
  56. package/dist/bindings/props.js +59 -0
  57. package/dist/bindings/props.js.map +1 -0
  58. package/dist/bindings/proxy.d.ts +11 -0
  59. package/dist/bindings/proxy.d.ts.map +1 -0
  60. package/dist/bindings/proxy.js +5 -0
  61. package/dist/bindings/proxy.js.map +1 -0
  62. package/dist/bindings/registry.d.ts +20 -0
  63. package/dist/bindings/registry.d.ts.map +1 -0
  64. package/dist/bindings/registry.js +19 -0
  65. package/dist/bindings/registry.js.map +1 -0
  66. package/dist/bindings/thread-loop.d.ts +65 -0
  67. package/dist/bindings/thread-loop.d.ts.map +1 -0
  68. package/dist/bindings/thread-loop.js +18 -0
  69. package/dist/bindings/thread-loop.js.map +1 -0
  70. package/dist/index.d.ts +5 -15
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +5 -15
  73. package/dist/index.js.map +1 -1
  74. package/dist/node.d.ts +61 -37
  75. package/dist/node.d.ts.map +1 -1
  76. package/dist/node.js +104 -69
  77. package/dist/node.js.map +1 -1
  78. package/dist/object.d.ts +18 -0
  79. package/dist/object.d.ts.map +1 -0
  80. package/dist/object.js +22 -0
  81. package/dist/object.js.map +1 -0
  82. package/dist/pipewire.d.ts +50 -15
  83. package/dist/pipewire.d.ts.map +1 -1
  84. package/dist/pipewire.js +94 -3
  85. package/dist/pipewire.js.map +1 -1
  86. package/examples/basic.ts +20 -0
  87. package/examples/event-registry-async.ts +1 -1
  88. package/examples/event-registry-sync.ts +3 -2
  89. package/examples/node-events.ts +34 -0
  90. package/package.json +2 -3
  91. package/src/{core.ts → bindings/core.ts} +8 -6
  92. package/src/bindings/index.ts +16 -0
  93. package/src/bindings/node.ts +92 -0
  94. package/src/bindings/param.ts +33 -0
  95. package/src/bindings/pipewire.ts +6 -0
  96. package/src/{registry.ts → bindings/registry.ts} +2 -0
  97. package/src/index.ts +5 -15
  98. package/src/node.ts +178 -78
  99. package/src/object.ts +36 -0
  100. package/src/pipewire.ts +154 -3
  101. package/src/param.ts +0 -33
  102. /package/src/{context.ts → bindings/context.ts} +0 -0
  103. /package/src/{dict.ts → bindings/dict.ts} +0 -0
  104. /package/src/{hook.ts → bindings/hook.ts} +0 -0
  105. /package/src/{list.ts → bindings/list.ts} +0 -0
  106. /package/src/{loop.ts → bindings/loop.ts} +0 -0
  107. /package/src/{main-loop.ts → bindings/main-loop.ts} +0 -0
  108. /package/src/{pod.ts → bindings/pod.ts} +0 -0
  109. /package/src/{properties.ts → bindings/properties.ts} +0 -0
  110. /package/src/{props.ts → bindings/props.ts} +0 -0
  111. /package/src/{proxy.ts → bindings/proxy.ts} +0 -0
  112. /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 { spa_hook } from "./hook.js";
3
- import { spa_pod } from "./pod.js";
4
- import { spa_dict } from "./dict.js";
5
- import { spa_param_info } from "./param.js";
6
- const pipewire = koffi.load("libpipewire-0.3.so.0");
7
- export const pw_node = koffi.opaque("pw_node");
8
- export const pw_node_state = koffi.enumeration("pw_node_state", {
9
- PW_NODE_STATE_ERROR: -1,
10
- PW_NODE_STATE_CREATING: 0,
11
- PW_NODE_STATE_SUSPENDED: 1,
12
- PW_NODE_STATE_IDLE: 2,
13
- PW_NODE_STATE_RUNNING: 3
14
- });
15
- export const PW_NODE_CHANGE_MASK = {
16
- INPUT_PORTS: 1 << 0,
17
- OUTPUT_PORTS: 1 << 1,
18
- STATE: 1 << 2,
19
- PROPS: 1 << 3,
20
- PARAMS: 1 << 4
21
- };
22
- export const pw_node_info = koffi.struct("pw_node_info", {
23
- id: "uint32_t",
24
- max_input_ports: "uint32_t",
25
- max_output_ports: "uint32_t",
26
- change_mask: "uint64_t",
27
- n_input_ports: "uint32_t",
28
- n_output_ports: "uint32_t",
29
- state: pw_node_state,
30
- error: "const char*",
31
- props: koffi.pointer(spa_dict),
32
- params: koffi.pointer(spa_param_info),
33
- n_params: "uint32_t"
34
- });
35
- export const pw_node_events_info = koffi.proto("void", [
36
- "void*", // data
37
- koffi.pointer(pw_node_info) // info
38
- ]);
39
- export const pw_node_events_param = koffi.proto("void", [
40
- "void*", // data
41
- "int", // seq
42
- "uint32_t", // id
43
- "uint32_t", // index
44
- "uint32_t", // next
45
- koffi.pointer(spa_pod) // param
46
- ]);
47
- export const pw_node_events = koffi.struct("pw_node_events", {
48
- version: "uint32_t",
49
- info: koffi.pointer(pw_node_events_info),
50
- param: koffi.pointer(pw_node_events_param)
51
- });
52
- export const pw_node_add_listener = pipewire.func("pw_node_add_listener", "int", [
53
- koffi.pointer(pw_node), // object
54
- koffi.pointer(spa_hook), // listener
55
- koffi.pointer(pw_node_events), // events
56
- "void*" // data
57
- ]);
58
- export const pw_node_enum_params = pipewire.func("pw_node_enum_params", "int", [
59
- koffi.pointer(pw_node), // object
60
- "int", // seq
61
- "uint32_t", // id
62
- "uint32_t", // start
63
- "uint32_t", // num
64
- koffi.pointer(spa_pod) // filter
65
- ]);
66
- export const pw_node_subscribe_params = pipewire.func("pw_node_subscribe_params", "int", [
67
- koffi.pointer(pw_node), // object
68
- "uint32_t*", // ids
69
- "uint32_t" // n_ids
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":"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"}
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -1,19 +1,54 @@
1
- export declare const pw_init: {
2
- (...args: any[]): any;
3
- async: (...args: any[]) => any;
4
- info: {
5
- name: string;
6
- arguments: import("koffi").TypeObject[];
7
- result: import("koffi").TypeObject;
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 declare const pw_deinit: {
11
- (...args: any[]): any;
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
@@ -1 +1 @@
1
- {"version":3,"file":"pipewire.d.ts","sourceRoot":"","sources":["../src/pipewire.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,OAAO;;;;;;;;CAAyD,CAAC;AAC9E,eAAO,MAAM,SAAS;;;;;;;;CAAyC,CAAC"}
1
+ {"version":3,"file":"pipewire.d.ts","sourceRoot":"","sources":["../src/pipewire.ts"],"names":[],"mappings":"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"}
package/dist/pipewire.js CHANGED
@@ -1,5 +1,96 @@
1
+ import EventEmitter from "node:events";
1
2
  import koffi from "koffi";
2
- const pipewire = koffi.load("libpipewire-0.3.so.0");
3
- export const pw_init = pipewire.func("pw_init", "void", ["int**", "char***"]);
4
- export const pw_deinit = pipewire.func("pw_deinit", "void", []);
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
@@ -1 +1 @@
1
- {"version":3,"file":"pipewire.js","sourceRoot":"","sources":["../src/pipewire.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;AAEpD,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,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 * as pw from "../src/index.js";
2
+ import { bindings as pw } from "../src/index.js";
3
3
 
4
4
  (async () => {
5
5
  pw.pipewire.pw_init(0, null);
@@ -1,5 +1,5 @@
1
1
  import koffi from "koffi";
2
- import * as pw from "../src/index.js";
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(loop);
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.4.0",
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 };