Class: PureData
- Inherits:
-
Object
show all
- Defined in:
- lib/puredata/canvas.rb,
lib/puredata/pd.rb,
lib/puredata/connection.rb,
lib/puredata/pdobject/dac.rb,
lib/puredata/pdobject/osc.rb,
lib/puredata/pdobject/receive.rb,
lib/puredata/pdobject/pdobject.rb
Overview
Ruby/PureData ojbect wrapper base class
Defined Under Namespace
Classes: Abstraction, Canvas, Dac, IOlet, Inlet, Osc, Outlet, PdObject, Receive
Constant Summary
collapse
- @@pdclass =
{}
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(opt = {}) ⇒ PureData
Returns a new instance of PureData.
28
29
30
|
# File 'lib/puredata/pd.rb', line 28
def initialize(opt={})
@portno = (opt[:port] || 10002).to_i
end
|
Class Method Details
.attach(opt = {}, &blk) ⇒ Object
23
24
25
26
|
# File 'lib/puredata/pd.rb', line 23
def self.attach(opt={}, &blk)
pd = self.new(opt)
pd.start(opt, &blk)
end
|
.dispatch_object_class(klass, *args) ⇒ Object
15
16
17
18
19
|
# File 'lib/puredata/pdobject/pdobject.rb', line 15
def self.dispatch_object_class(klass, *args)
cls = @@pdclass[klass.to_s]
cls ||= PdObject
cls
end
|
.register_pdobject(klass, *names) ⇒ Object
9
10
11
12
13
|
# File 'lib/puredata/pdobject/pdobject.rb', line 9
def self.register_pdobject(klass, *names)
names.each do |n|
@@pdclass[n] = klass
end
end
|
.start(opt = {}, &blk) ⇒ Object
17
18
19
20
21
|
# File 'lib/puredata/pd.rb', line 17
def self.start(opt={}, &blk)
pd = self.new(opt)
pd.fork_pd(opt)
pd.start(opt, &blk)
end
|
Instance Method Details
#abstraction(name, opt = {}, &blk) ⇒ Object
111
112
113
114
115
116
117
|
# File 'lib/puredata/pd.rb', line 111
def abstraction(name, opt={}, &blk)
if blk
Abstraction.create(self, name, opt, &blk)
else
Abstraction.new(self, name, opt)
end
end
|
#bind(opt = {}) ⇒ Object
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
# File 'lib/puredata/pd.rb', line 53
def bind(opt={})
err = nil
200.times do
sleep 0.1
begin
@sock = TCPSocket.new("localhost", @portno)
break
rescue
err = $!
end
end
unless @sock
$stderr.puts("connect to localhost:#{@portno} failed")
raise err
end
end
|
#canvas(name, opt = {}) ⇒ Object
107
108
109
|
# File 'lib/puredata/pd.rb', line 107
def canvas(name, opt={})
Canvas.new(self, name, opt)
end
|
#dsp=(flag) ⇒ Object
119
120
121
122
123
124
125
|
# File 'lib/puredata/pd.rb', line 119
def dsp=(flag)
if flag
self.msg("pd", "dsp", 1)
else
self.msg("pd", "dsp", 0)
end
end
|
#fork_pd(opt = {}) ⇒ Object
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
# File 'lib/puredata/pd.rb', line 32
def fork_pd(opt={})
path = opt[:pd_app_path] || @@pd_app_path
pd_params = opt[:pd_params] || []
if path.nil? or not File.executable?(path)
raise "option :pd_app_path (Pd-extended executable) must be specified."
end
cmd = [
path,
pd_params,
"-nogui",
"-send", "pd filename ruby-pd.pd ./;",
"-send", "#N canvas 10 10 200 200 10;",
"-send", "#X pop 1;",
"-send", "pd-ruby-pd.pd obj 50 50 netreceive #{@portno} 0 old;",
].flatten
@pid = fork do
Process.setsid
exec(*cmd)
end
end
|
#msg(*args) ⇒ Object
103
104
105
|
# File 'lib/puredata/pd.rb', line 103
def msg(*args)
@sock.puts(args.map{|l| l.to_s}.join(" ") + ";")
end
|
#quit ⇒ Object
127
128
129
|
# File 'lib/puredata/pd.rb', line 127
def quit
self.msg("pd", "quit")
end
|
#start(opt = {}, &blk) ⇒ Object
70
71
72
73
74
75
76
77
78
79
80
81
|
# File 'lib/puredata/pd.rb', line 70
def start(opt={}, &blk)
begin
bind(opt)
if blk
blk.call(self)
end
ensure
if blk
stop
end
end
end
|
#stop ⇒ Object
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
# File 'lib/puredata/pd.rb', line 83
def stop
if @sock
@sock.close unless @sock.closed?
@sock = nil
end
return if @pid.nil?
begin
Process.kill(:TERM, -@pid)
rescue Errno::ESRCH
rescue Errno::EPERM
raise "fail to kill process(#{@pid}): #{$!}"
end
Process.waitpid(@pid)
ensure
@sock = nil
@pid = nil
end
|