pulseaudio 0.0.7 → 0.0.8

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.
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
-