pulseaudio 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.7
1
+ 0.0.8
@@ -1,6 +1,11 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <interface>
3
3
  <!-- interface-requires gtk+ 3.0 -->
4
+ <object class="GtkAdjustment" id="adjustmentApplicationVolume">
5
+ <property name="upper">100</property>
6
+ <property name="step_increment">1</property>
7
+ <property name="page_increment">10</property>
8
+ </object>
4
9
  <object class="GtkAdjustment" id="adjustmentSinkVolume">
5
10
  <property name="upper">100</property>
6
11
  <property name="step_increment">1</property>
@@ -301,6 +306,114 @@
301
306
  <property name="tab_fill">False</property>
302
307
  </packing>
303
308
  </child>
309
+ <child>
310
+ <object class="GtkBox" id="box1">
311
+ <property name="visible">True</property>
312
+ <property name="can_focus">False</property>
313
+ <property name="orientation">vertical</property>
314
+ <child>
315
+ <object class="GtkFrame" id="frameApplicationSettings">
316
+ <property name="visible">True</property>
317
+ <property name="can_focus">False</property>
318
+ <property name="label_xalign">0</property>
319
+ <property name="shadow_type">none</property>
320
+ <child>
321
+ <object class="GtkAlignment" id="alignment3">
322
+ <property name="visible">True</property>
323
+ <property name="can_focus">False</property>
324
+ <property name="left_padding">12</property>
325
+ <child>
326
+ <object class="GtkHScale" id="hscaleApplicationVolume">
327
+ <property name="visible">True</property>
328
+ <property name="can_focus">True</property>
329
+ <property name="adjustment">adjustmentApplicationVolume</property>
330
+ <property name="draw_value">False</property>
331
+ <signal name="change-value" handler="on_hscaleApplicationVolume_change_value" swapped="no"/>
332
+ </object>
333
+ </child>
334
+ </object>
335
+ </child>
336
+ <child type="label">
337
+ <object class="GtkLabel" id="label6">
338
+ <property name="visible">True</property>
339
+ <property name="can_focus">False</property>
340
+ <property name="label" translatable="yes">&lt;b&gt;Application settings&lt;/b&gt;</property>
341
+ <property name="use_markup">True</property>
342
+ </object>
343
+ </child>
344
+ </object>
345
+ <packing>
346
+ <property name="expand">False</property>
347
+ <property name="fill">True</property>
348
+ <property name="position">0</property>
349
+ </packing>
350
+ </child>
351
+ <child>
352
+ <object class="GtkFrame" id="frame4">
353
+ <property name="visible">True</property>
354
+ <property name="can_focus">False</property>
355
+ <property name="label_xalign">0</property>
356
+ <property name="shadow_type">none</property>
357
+ <child>
358
+ <object class="GtkAlignment" id="alignment4">
359
+ <property name="visible">True</property>
360
+ <property name="can_focus">False</property>
361
+ <property name="left_padding">12</property>
362
+ <child>
363
+ <object class="GtkViewport" id="viewport3">
364
+ <property name="visible">True</property>
365
+ <property name="can_focus">False</property>
366
+ <child>
367
+ <object class="GtkScrolledWindow" id="scrolledwindow3">
368
+ <property name="visible">True</property>
369
+ <property name="can_focus">True</property>
370
+ <property name="shadow_type">in</property>
371
+ <child>
372
+ <object class="GtkTreeView" id="tvApplications">
373
+ <property name="visible">True</property>
374
+ <property name="can_focus">True</property>
375
+ <child internal-child="selection">
376
+ <object class="GtkTreeSelection" id="treeview-selection3"/>
377
+ </child>
378
+ </object>
379
+ </child>
380
+ </object>
381
+ </child>
382
+ </object>
383
+ </child>
384
+ </object>
385
+ </child>
386
+ <child type="label">
387
+ <object class="GtkLabel" id="label7">
388
+ <property name="visible">True</property>
389
+ <property name="can_focus">False</property>
390
+ <property name="label" translatable="yes">&lt;b&gt;Choose application&lt;/b&gt;</property>
391
+ <property name="use_markup">True</property>
392
+ </object>
393
+ </child>
394
+ </object>
395
+ <packing>
396
+ <property name="expand">True</property>
397
+ <property name="fill">True</property>
398
+ <property name="position">1</property>
399
+ </packing>
400
+ </child>
401
+ </object>
402
+ <packing>
403
+ <property name="position">2</property>
404
+ </packing>
405
+ </child>
406
+ <child type="tab">
407
+ <object class="GtkLabel" id="label2">
408
+ <property name="visible">True</property>
409
+ <property name="can_focus">False</property>
410
+ <property name="label" translatable="yes">Applications</property>
411
+ </object>
412
+ <packing>
413
+ <property name="position">2</property>
414
+ <property name="tab_fill">False</property>
415
+ </packing>
416
+ </child>
304
417
  </object>
305
418
  </child>
306
419
  </object>
@@ -30,6 +30,22 @@ class PulseAudio::Gui::Choose_active_sink_gtk3
30
30
  @ui["tvSources"].get_column(0).visible = false
31
31
  self.reload_sources
32
32
 
33
+ @tv_applications = Gtk3assist::Treeview.new(
34
+ :tv => @ui["tvApplications"],
35
+ :model => :liststore,
36
+ :sort_col => :name,
37
+ :cols => [
38
+ {:id => :id, :title => _("ID")},
39
+ {:id => :name, :title => _("Name")}
40
+ ]
41
+ )
42
+ @ui["tvApplications"].get_column(0).visible = false
43
+ @ui["tvApplications"].selection.signal_connect("changed", &self.method(:on_tvApplications_selection_changed))
44
+
45
+ self.reload_applications
46
+ self.update_application_info
47
+ @ui["frameApplicationSettings"].hide
48
+
33
49
  PulseAudio::Sink::Input.auto_redirect_new_inputs_to_default_sink
34
50
  PulseAudio::Source::Output.auto_redirect_new_outputs_to_default_source
35
51
 
@@ -150,6 +166,11 @@ class PulseAudio::Gui::Choose_active_sink_gtk3
150
166
  @ui["adjustmentSourceVolume"].value = @source.vol_perc.to_f
151
167
  end
152
168
 
169
+ def update_application_info
170
+ return nil if !@input
171
+ @ui["adjustmentApplicationVolume"].value = @input.vol_perc.to_f
172
+ end
173
+
153
174
  def on_hscaleSinkVolume_change_value
154
175
  GLib.source_remove(@timeout_sink_volume_change) if @timeout_sink_volume_change
155
176
 
@@ -178,7 +199,7 @@ class PulseAudio::Gui::Choose_active_sink_gtk3
178
199
 
179
200
  def on_sicon_activate(*args)
180
201
  if !@ui["window"].get_visible
181
- @ui["window"].show_all
202
+ @ui["window"].show
182
203
  else
183
204
  @ui["window"].hide
184
205
  end
@@ -272,17 +293,8 @@ class PulseAudio::Gui::Choose_active_sink_gtk3
272
293
  sel = @tv_sources.sel
273
294
  return nil if !sel
274
295
 
275
- source = nil
276
- PulseAudio::Source.list do |source_i|
277
- if source_i.source_id.to_i == sel[:data][:id].to_i
278
- source = source_i
279
- break
280
- end
281
- end
282
-
283
- raise "Could not find source." if !source
284
- @source = source
285
- source.default!
296
+ @source = PulseAudio::Source.by_id(sel[:data][:id].to_i)
297
+ @source.default!
286
298
  self.update_icon
287
299
  self.update_source_info
288
300
  rescue => e
@@ -290,6 +302,53 @@ class PulseAudio::Gui::Choose_active_sink_gtk3
290
302
  end
291
303
  end
292
304
 
305
+ def add_input(input)
306
+ append_data = @tv_applications.add_row(:data => {:id => input.input_id, :name => input.name})
307
+ return append_data
308
+ end
309
+
310
+ def reload_applications
311
+ begin
312
+ @reloading = true
313
+
314
+ @tv_applications.model.clear
315
+ PulseAudio::Sink::Input.list do |input|
316
+ append_data = self.add_input(input)
317
+ end
318
+ ensure
319
+ @reloading = false
320
+ end
321
+ end
322
+
323
+ def on_tvApplications_selection_changed(*args)
324
+ begin
325
+ return nil if @reloading or !@tv_applications
326
+ sel = @tv_applications.sel
327
+
328
+ if !sel
329
+ @ui["frameApplicationSettings"].hide
330
+ @input = nil
331
+ else
332
+ @ui["frameApplicationSettings"].show
333
+ @input = PulseAudio::Sink::Input.by_id(sel[:data][:id].to_i)
334
+ self.update_application_info
335
+ end
336
+ rescue => e
337
+ raise e
338
+ end
339
+ end
340
+
341
+ def on_hscaleApplicationVolume_change_value
342
+ return nil if !@input
343
+ GLib.source_remove(@timeout_input_volume_change) if @timeout_input_volume_change
344
+
345
+ @timeout_input_volume_change = GLib.timeout_add(GLib::PRIORITY_DEFAULT_IDLE, 50, proc{
346
+ @timeout_input_volume_change = nil
347
+ @input.vol_perc = @ui["adjustmentApplicationVolume"].value
348
+ false
349
+ }, nil, nil)
350
+ end
351
+
293
352
  def on_window_delete_event(*args)
294
353
  @ui["window"].hide
295
354
  return true
@@ -1,5 +1,8 @@
1
1
  #Class for controlling inputs.
2
2
  class PulseAudio::Sink::Input
3
+ #The arguments-hash. Contains various data for the input.
4
+ attr_reader :args
5
+
3
6
  @@inputs = Wref_map.new
4
7
 
5
8
  #Starts automatically redirect new opened inputs to the default sink.
@@ -29,21 +32,30 @@ class PulseAudio::Sink::Input
29
32
 
30
33
  #Returns a list of sink-inputs.
31
34
  def self.list
32
- list = %x[pacmd list-sink-inputs]
35
+ list = %x[pactl list sink-inputs]
33
36
  inputs = [] unless block_given?
34
37
 
35
- list.scan(/index: (\d+)/) do |match|
36
- input_id = match[0].to_i
37
- args = {:input_id => input_id}
38
-
38
+ list.scan(/(\n|^)Sink Input #(\d+)\s+([\s\S]+?)(\n\n|\Z)/) do |match|
39
+ props = {}
40
+ match[2].scan(/(\s+|^)([A-z]+?): (.+?)\n/) do |match_prop|
41
+ props[match_prop[1].downcase] = match_prop[2]
42
+ end
43
+
44
+ match[2].scan(/(\t\t|^)([A-z\.]+?) = (.+?)\n/) do |match_prop|
45
+ props[match_prop[1].downcase.gsub(/\./, "_")] = match_prop[2].gsub(/\"/, "")
46
+ end
47
+
48
+ input_id = match[1].to_i
49
+ args = {:input_id => input_id, :props => props}
50
+
39
51
  input = @@inputs.get!(input_id)
40
52
  if !input
41
53
  input = PulseAudio::Sink::Input.new
42
54
  @@inputs[input_id] = input
43
55
  end
44
-
56
+
45
57
  input.update(args)
46
-
58
+
47
59
  if block_given?
48
60
  yield(input)
49
61
  else
@@ -81,6 +93,15 @@ class PulseAudio::Sink::Input
81
93
  @args = args
82
94
  end
83
95
 
96
+ #Returns the name of the input as a string.
97
+ def name
98
+ if app_name = @args[:props]["application_name"].to_s.strip and !app_name.empty?
99
+ return app_name
100
+ else
101
+ raise "Could not figure out the input-name."
102
+ end
103
+ end
104
+
84
105
  #Returns the input-ID.
85
106
  def input_id
86
107
  return @args[:input_id]
@@ -91,4 +112,76 @@ class PulseAudio::Sink::Input
91
112
  %x[pacmd move-sink-input #{self.input_id} #{newsink.sink_id}]
92
113
  return nil
93
114
  end
115
+
116
+ #Returns true if the sink is muted. Otherwise false.
117
+ #===Examples
118
+ # sink.muted? #=> false
119
+ def muted?
120
+ @args[:props]["mute"] == "yes"
121
+ end
122
+
123
+ #Toggles the mute-functionality of the sink. If it is muted: unmutes. If it isnt muted: mutes.
124
+ #===Examples
125
+ # sink.mute_toggle #=> nil
126
+ def mute_toggle
127
+ self.mute = !self.muted?
128
+ return nil
129
+ end
130
+
131
+ #Sets the mute to something specific.
132
+ #===Examples
133
+ # sink.mute = true #=> nil
134
+ def mute=(val)
135
+ if val
136
+ %x[pactl set-sink-input-mute #{self.input_id} 1]
137
+ @args[:props]["mute"] = "yes"
138
+ else
139
+ %x[pactl set-sink-input-mute #{self.input_id} 0]
140
+ @args[:props]["mute"] = "no"
141
+ end
142
+
143
+ return nil
144
+ end
145
+
146
+ #Increases the volume of the sink by 5%.
147
+ #===Examples
148
+ # sink.vol_incr if sink.active? #=> nil
149
+ def vol_incr
150
+ %x[pactl set-sink-input-volume #{self.input_id} -- +5%]
151
+ new_vol = vol_perc + 5
152
+ new_vol = 100 if new_vol > 100
153
+ @args[:props]["volume"] = "0: #{new_vol}% 1: #{new_vol}%"
154
+ return nil
155
+ end
156
+
157
+ #Decreases the volume of the sink by 5%.
158
+ #===Examples
159
+ # sink.vol_decr if sink.active? #=> nil
160
+ def vol_decr
161
+ %x[pactl set-sink-input-volume #{self.input_id} -- -5%]
162
+ new_vol = vol_perc - 5
163
+ new_vol = 0 if new_vol < 0
164
+ @args[:props]["volume"] = "0: #{new_vol}% 1: #{new_vol}%"
165
+ return nil
166
+ end
167
+
168
+ def vol_perc=(newval)
169
+ newval = newval.to_i
170
+ %x[pactl set-sink-input-volume #{self.input_id} #{newval}%]
171
+ @args[:props]["volume"] = "0: #{newval}% 1: #{newval}%"
172
+ return nil
173
+ end
174
+
175
+ #Returns the current percent of the volume.
176
+ def vol_perc
177
+ if match = @args[:props]["volume"].to_s.match(/(\d+):\s*([\d\.]+)%/)
178
+ return match[2].to_i
179
+ end
180
+
181
+ raise "Could not figure out the volume from properties: '#{@args[:props]}'."
182
+ end
183
+
184
+ def method_missing(meth, *args, &block)
185
+ @args[:props][meth.to_s]
186
+ end
94
187
  end
@@ -4,14 +4,15 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = "pulseaudio"
8
- s.version = "0.0.7"
7
+ s.name = %q{pulseaudio}
8
+ s.version = "0.0.8"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Kasper Johansen"]
12
- s.date = "2012-10-03"
13
- s.description = "Ruby-library for controlling PulseAudio via 'pactl'."
14
- s.email = "k@spernj.org"
12
+ s.date = %q{2012-10-19}
13
+ s.default_executable = %q{pulseaudio_volume.rb}
14
+ s.description = %q{Ruby-library for controlling PulseAudio via 'pactl'.}
15
+ s.email = %q{k@spernj.org}
15
16
  s.executables = ["pulseaudio_volume.rb"]
16
17
  s.extra_rdoc_files = [
17
18
  "LICENSE.txt",
@@ -49,11 +50,11 @@ Gem::Specification.new do |s|
49
50
  "test_scripts/choose_active_sink_gtk3.rb",
50
51
  "test_scripts/set_active.rb"
51
52
  ]
52
- s.homepage = "http://github.com/kaspernj/pulseaudio"
53
+ s.homepage = %q{http://github.com/kaspernj/pulseaudio}
53
54
  s.licenses = ["MIT"]
54
55
  s.require_paths = ["lib"]
55
- s.rubygems_version = "1.8.24"
56
- s.summary = "Ruby-library for controlling PulseAudio."
56
+ s.rubygems_version = %q{1.6.2}
57
+ s.summary = %q{Ruby-library for controlling PulseAudio.}
57
58
 
58
59
  if s.respond_to? :specification_version then
59
60
  s.specification_version = 3
@@ -9,6 +9,15 @@ describe "Pulseaudio" do
9
9
  sink.mute_toggle
10
10
  end
11
11
  end
12
+
13
+ it "should spawn sink inputs and manipulate them" do
14
+ PulseAudio::Sink::Input.list do |input|
15
+ input.vol_decr
16
+ input.vol_incr
17
+ input.mute_toggle
18
+ input.mute_toggle
19
+ end
20
+ end
12
21
 
13
22
  it "should be able to listen for events and redirect all new inputs to the default sink" do
14
23
  def_sink = nil
metadata CHANGED
@@ -1,126 +1,125 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: pulseaudio
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.8
4
5
  prerelease:
5
- version: 0.0.7
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Kasper Johansen
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2012-10-03 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
12
+ date: 2012-10-19 00:00:00.000000000 +02:00
13
+ default_executable: pulseaudio_volume.rb
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
16
  name: wref
17
- requirement: &id001 !ruby/object:Gem::Requirement
17
+ requirement: &22848460 !ruby/object:Gem::Requirement
18
18
  none: false
19
- requirements:
20
- - - ">="
21
- - !ruby/object:Gem::Version
22
- version: "0"
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *id001
26
- - !ruby/object:Gem::Dependency
25
+ version_requirements: *22848460
26
+ - !ruby/object:Gem::Dependency
27
27
  name: gir_ffi
28
- requirement: &id002 !ruby/object:Gem::Requirement
28
+ requirement: &22847680 !ruby/object:Gem::Requirement
29
29
  none: false
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: "0"
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *id002
37
- - !ruby/object:Gem::Dependency
36
+ version_requirements: *22847680
37
+ - !ruby/object:Gem::Dependency
38
38
  name: gtk3assist
39
- requirement: &id003 !ruby/object:Gem::Requirement
39
+ requirement: &22845380 !ruby/object:Gem::Requirement
40
40
  none: false
41
- requirements:
42
- - - ">="
43
- - !ruby/object:Gem::Version
44
- version: "0"
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
45
  type: :runtime
46
46
  prerelease: false
47
- version_requirements: *id003
48
- - !ruby/object:Gem::Dependency
47
+ version_requirements: *22845380
48
+ - !ruby/object:Gem::Dependency
49
49
  name: gettext
50
- requirement: &id004 !ruby/object:Gem::Requirement
50
+ requirement: &22844520 !ruby/object:Gem::Requirement
51
51
  none: false
52
- requirements:
53
- - - ">="
54
- - !ruby/object:Gem::Version
55
- version: "0"
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
56
  type: :runtime
57
57
  prerelease: false
58
- version_requirements: *id004
59
- - !ruby/object:Gem::Dependency
58
+ version_requirements: *22844520
59
+ - !ruby/object:Gem::Dependency
60
60
  name: knjrbfw
61
- requirement: &id005 !ruby/object:Gem::Requirement
61
+ requirement: &22843640 !ruby/object:Gem::Requirement
62
62
  none: false
63
- requirements:
64
- - - ">="
65
- - !ruby/object:Gem::Version
66
- version: "0"
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
67
  type: :runtime
68
68
  prerelease: false
69
- version_requirements: *id005
70
- - !ruby/object:Gem::Dependency
69
+ version_requirements: *22843640
70
+ - !ruby/object:Gem::Dependency
71
71
  name: rspec
72
- requirement: &id006 !ruby/object:Gem::Requirement
72
+ requirement: &22842620 !ruby/object:Gem::Requirement
73
73
  none: false
74
- requirements:
74
+ requirements:
75
75
  - - ~>
76
- - !ruby/object:Gem::Version
76
+ - !ruby/object:Gem::Version
77
77
  version: 2.8.0
78
78
  type: :development
79
79
  prerelease: false
80
- version_requirements: *id006
81
- - !ruby/object:Gem::Dependency
80
+ version_requirements: *22842620
81
+ - !ruby/object:Gem::Dependency
82
82
  name: rdoc
83
- requirement: &id007 !ruby/object:Gem::Requirement
83
+ requirement: &22841480 !ruby/object:Gem::Requirement
84
84
  none: false
85
- requirements:
85
+ requirements:
86
86
  - - ~>
87
- - !ruby/object:Gem::Version
88
- version: "3.12"
87
+ - !ruby/object:Gem::Version
88
+ version: '3.12'
89
89
  type: :development
90
90
  prerelease: false
91
- version_requirements: *id007
92
- - !ruby/object:Gem::Dependency
91
+ version_requirements: *22841480
92
+ - !ruby/object:Gem::Dependency
93
93
  name: bundler
94
- requirement: &id008 !ruby/object:Gem::Requirement
94
+ requirement: &22840600 !ruby/object:Gem::Requirement
95
95
  none: false
96
- requirements:
97
- - - ">="
98
- - !ruby/object:Gem::Version
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
99
  version: 1.0.0
100
100
  type: :development
101
101
  prerelease: false
102
- version_requirements: *id008
103
- - !ruby/object:Gem::Dependency
102
+ version_requirements: *22840600
103
+ - !ruby/object:Gem::Dependency
104
104
  name: jeweler
105
- requirement: &id009 !ruby/object:Gem::Requirement
105
+ requirement: &22839720 !ruby/object:Gem::Requirement
106
106
  none: false
107
- requirements:
107
+ requirements:
108
108
  - - ~>
109
- - !ruby/object:Gem::Version
109
+ - !ruby/object:Gem::Version
110
110
  version: 1.8.3
111
111
  type: :development
112
112
  prerelease: false
113
- version_requirements: *id009
113
+ version_requirements: *22839720
114
114
  description: Ruby-library for controlling PulseAudio via 'pactl'.
115
115
  email: k@spernj.org
116
- executables:
116
+ executables:
117
117
  - pulseaudio_volume.rb
118
118
  extensions: []
119
-
120
- extra_rdoc_files:
119
+ extra_rdoc_files:
121
120
  - LICENSE.txt
122
121
  - README.rdoc
123
- files:
122
+ files:
124
123
  - .document
125
124
  - .rspec
126
125
  - Gemfile
@@ -151,35 +150,33 @@ files:
151
150
  - test_scripts/choose_active_sink.rb
152
151
  - test_scripts/choose_active_sink_gtk3.rb
153
152
  - test_scripts/set_active.rb
153
+ has_rdoc: true
154
154
  homepage: http://github.com/kaspernj/pulseaudio
155
- licenses:
155
+ licenses:
156
156
  - MIT
157
157
  post_install_message:
158
158
  rdoc_options: []
159
-
160
- require_paths:
159
+ require_paths:
161
160
  - lib
162
- required_ruby_version: !ruby/object:Gem::Requirement
161
+ required_ruby_version: !ruby/object:Gem::Requirement
163
162
  none: false
164
- requirements:
165
- - - ">="
166
- - !ruby/object:Gem::Version
167
- hash: 1285424623138543590
168
- segments:
163
+ requirements:
164
+ - - ! '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ segments:
169
168
  - 0
170
- version: "0"
171
- required_rubygems_version: !ruby/object:Gem::Requirement
169
+ hash: 4386632661636528784
170
+ required_rubygems_version: !ruby/object:Gem::Requirement
172
171
  none: false
173
- requirements:
174
- - - ">="
175
- - !ruby/object:Gem::Version
176
- version: "0"
172
+ requirements:
173
+ - - ! '>='
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
177
176
  requirements: []
178
-
179
177
  rubyforge_project:
180
- rubygems_version: 1.8.24
178
+ rubygems_version: 1.6.2
181
179
  signing_key:
182
180
  specification_version: 3
183
181
  summary: Ruby-library for controlling PulseAudio.
184
182
  test_files: []
185
-