-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinit.lua
More file actions
88 lines (84 loc) · 2.17 KB
/
Copy pathinit.lua
File metadata and controls
88 lines (84 loc) · 2.17 KB
1
2
3
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
---@diagnostic disable: trailing-space
io.stdout:setvbuf"line"
table.unpack = table.unpack or unpack
local luv = require"luv"
local Heartstrings = require"Moonrise.Heartstrings"
local Census = require"Census"
local Routines = require"Routines"
---@param SourceName string?
---@param SinkName string?
---@param Program string?
---@param ... string
local function Main(EmitterPort, SourceName, SinkName, Program, ...)
EmitterPort = tonumber(EmitterPort) or error"Provide port for local ProcessEventEmitter"
if InputName and (InputName:lower() == "nil") then
InputName = nil
end
if OutputName and (OutputName:lower() == "nil") then
OutputName = nil
end
assert(Program, "Supply Program to launch")
---@class AutoAudioRouter.SharedData: Census.SharedData
local SharedData = {
Exited = false;
Process = nil;
Subprocess = {};
Thread = {};
}
local ProcessIO = {
Out = Heartstrings.Pipe();
Error = Heartstrings.Pipe();
}
local AudioChangesBox = Heartstrings.Mailbox()
local _, Controller = Heartstrings.Orchestra{
--{Body = Routines.luvLoop};
{
Body = Routines.Monitor.Audio.Changes;
Arguments = {AudioChangesBox};
};
{
Body = Routines.Monitor.Audio.Ports;
Arguments = {SharedData, AudioChangesBox, "Input", SinkName};
};
{
Body = Routines.Monitor.Audio.Ports;
Arguments = {SharedData, AudioChangesBox, "Output", SourceName};
};
{
Body = Census;
Arguments = {
SharedData, EmitterPort,
Program, {
IO = ProcessIO;
Monitor = {
Out = true;
Error = true;
};
}, ...
};
};
}
local Sleeper = luv.new_timer()
assert(Sleeper)
local Step; function Step()
Controller:step(0)
Sleeper:stop()
local Timeout = Controller:timeout()
if Timeout == nil then Timeout = -1 else Timeout = Timeout * 1000 end
Sleeper:start(Timeout, 0, Step)
end
local Timeout = Controller:timeout()
if Timeout == nil then Timeout = -1 else Timeout = Timeout * 1000 end
Sleeper:start(Timeout, 0, Step)
local Poller = luv.new_poll(Controller:pollfd())
assert(Poller)
Poller:start("r", Step)
local function Loop()
while not SharedData.Exited do
luv.run"once"
end
print"Goodbye"
end
return pcall(Loop)
end
return Main