audio_switch 0.0.2 → 0.0.7

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: af9711a69f38a1d0acde23d905ea0b2fca26e18cc59ff146789abd8a9da8a3a4
4
- data.tar.gz: 99d936b452f40bf8b26f64112696898ef4a0cf067852d52647aaf61cd0b8a786
3
+ metadata.gz: 960ca345220ec6a6ff42cf1bcf1181924a8184b8219c54b1eadd96261c521850
4
+ data.tar.gz: a738239dc085e95e34044c85e30e2dbdbc6dd4c93399547af7db52ca891c93ad
5
5
  SHA512:
6
- metadata.gz: 5a06027f3094765b3ec3c754716e26a7a27ce7aff275f869ae32023c3fd87bd1a8f0e4e79d16ef9bfd82a60220932e130a5d12e850b32b2ee2431c26ee9d047e
7
- data.tar.gz: d44167c4c067265bff69bd3c4ae7112462c0e69b1956c18c8d5e4560df39dae07c9b6151ff385a0bd7c84cafafc66b0e1298c22a7ad03a93a3d02abf4864f62b
6
+ metadata.gz: c70f44be01ad095ec634bb56fafda14ce255850d3084247bf48ecea7380632a3b9c6750ec9ef9a6480095563a17a3b2eb60309ef1b4b62b835d068415574bd5c
7
+ data.tar.gz: '09973aa3ffa18731f15aaddd7f53673a023414189867eea2e71d73489f0d4392914b35e312434e5fd9a20878727424d0895b051abf2aa5e92fd1c4b996061594'
data/bin/audio_switch CHANGED
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
- require 'audio_switch'
2
+ require_relative '../lib/audio_switch'
3
3
 
4
4
  begin
5
- puts "audio_switch version #{AudioSwitch::VERSION}"
6
5
  AudioSwitch::App.start
7
6
  rescue Interrupt
8
- puts "\nexit"
7
+ AudioSwitch::LOG.info('exit')
8
+ rescue StandardError => e
9
+ AudioSwitch::LOG.error('uncaught') { e }
9
10
  end
data/lib/app_logger.rb ADDED
@@ -0,0 +1,9 @@
1
+ module AudioSwitch
2
+ def self.configure_logger
3
+ log_path = "#{Dir.home}/.audio_switch"
4
+ Dir.mkdir(log_path) unless Dir.exist?(log_path)
5
+ log = Logger.new("#{log_path}/audio_switch.log", 'daily')
6
+ log.level = Logger::INFO
7
+ log
8
+ end
9
+ end
data/lib/audio_switch.rb CHANGED
@@ -1,15 +1,25 @@
1
+ require 'logger'
2
+ require_relative 'app_logger.rb'
1
3
  require_relative 'audio_switch/pactl.rb'
2
4
  require_relative 'audio_switch/model.rb'
3
5
  require_relative 'audio_switch/ui.rb'
4
6
  require_relative 'audio_switch/version.rb'
5
7
 
6
8
  module AudioSwitch
9
+ LOG = configure_logger
10
+
7
11
  module App
8
12
  def self.start
13
+ AudioSwitch::LOG.info("starting audio_switch #{AudioSwitch::VERSION} on ruby #{RUBY_VERSION}")
9
14
  pactl = AudioSwitch::Pactl.new
10
15
  model = AudioSwitch::Model.new(pactl)
11
16
  ui = AudioSwitch::UI.new(model)
12
17
  ui.start
13
18
  end
19
+
20
+ def self.quit
21
+ AudioSwitch::LOG.info('quitting audio_switch')
22
+ exit
23
+ end
14
24
  end
15
25
  end
@@ -14,6 +14,7 @@ module AudioSwitch
14
14
  end
15
15
 
16
16
  def select_sink(sink_id)
17
+ AudioSwitch::LOG.info "selecting sink '#{sink_id}'"
17
18
  @pactl.default_sink = sink_id
18
19
  @pactl.inputs.each do |input|
19
20
  @pactl.move_input(input[:id], sink_id)
@@ -25,12 +26,11 @@ module AudioSwitch
25
26
  end
26
27
 
27
28
  def rtp_on?
28
- return false unless @pactl.sinks.any? { |sink| sink[:name] == RTP }
29
- return false unless @pactl.modules.any? { |mod| mod[:name] == MODULE_RTP_SEND }
30
- true
29
+ @pactl.sinks.any? { |sink| sink[:name] == RTP }
31
30
  end
32
31
 
33
32
  def rtp_on
33
+ AudioSwitch::LOG.info 'turning RTP on'
34
34
  # prevent positive feedback loop
35
35
  mute_sources
36
36
  # see https://cgit.freedesktop.org/pulseaudio/paprefs/tree/src/paprefs.cc
@@ -51,17 +51,20 @@ module AudioSwitch
51
51
  end
52
52
 
53
53
  def rtp_off
54
+ AudioSwitch::LOG.info 'turning RTP off'
54
55
  @pactl.unload_module(MODULE_RTP_SEND)
55
56
  @pactl.unload_module(MODULE_NULL_SINK)
56
57
  end
57
58
 
58
59
  def mute_sources
60
+ AudioSwitch::LOG.info 'muting all sources'
59
61
  sources.each do |source|
60
62
  @pactl.mute_source(source[:id])
61
63
  end
62
64
  end
63
65
 
64
66
  def unmute_sources
67
+ AudioSwitch::LOG.info 'unmuting all sources'
65
68
  sources.each do |source|
66
69
  @pactl.unmute_source(source[:id])
67
70
  end
@@ -74,7 +77,7 @@ module AudioSwitch
74
77
  private
75
78
 
76
79
  def sources
77
- @pactl.sources.select { |source| source[:name] != 'rtp.monitor' }
80
+ @pactl.sources.reject { |source| source[:name] == 'rtp.monitor' }
78
81
  end
79
82
 
80
83
  def handle(event, block)
@@ -3,10 +3,12 @@ require 'pty'
3
3
  module AudioSwitch
4
4
  class Pactl
5
5
  def move_input(input_id, sink_id)
6
+ AudioSwitch::LOG.info "moving sink input '#{input_id}' to sink '#{sink_id}'"
6
7
  `pactl move-sink-input #{input_id} #{sink_id}`
7
8
  end
8
9
 
9
10
  def default_sink=(sink_id)
11
+ AudioSwitch::LOG.info "setting default sink to '#{sink_id}'"
10
12
  # pactl doesn't have this command
11
13
  `pacmd set-default-sink #{sink_id}`
12
14
  end
@@ -29,31 +31,36 @@ module AudioSwitch
29
31
  end
30
32
 
31
33
  def load_module(mod, options = {})
34
+ AudioSwitch::LOG.info "loading module '#{mod}' with options '#{options}'"
32
35
  `pactl load-module #{mod} #{ModuleOptions.new(options)}`
33
36
  end
34
37
 
35
38
  def unload_module(mod)
39
+ AudioSwitch::LOG.info "unloading module '#{mod}'"
36
40
  `pactl unload-module #{mod}`
37
41
  end
38
42
 
39
43
  def subscribe(command = 'pactl subscribe')
40
44
  Thread.start do
45
+ AudioSwitch::LOG.info "starting '#{command}'"
41
46
  @pactl_sub = PTY.spawn(command)[0]
42
47
  begin
43
48
  @pactl_sub.each do |line|
44
49
  yield(Out.new(line).parse_event)
45
50
  end
46
- rescue Errno::EIO, IOError
47
- return
51
+ rescue Errno::EIO, IOError => e
52
+ AudioSwitch::LOG.error("reading '#{command}' output") { e }
48
53
  end
49
54
  end
50
55
  end
51
56
 
52
57
  def mute_source(source_id)
58
+ AudioSwitch::LOG.info "muting source '#{source_id}'"
53
59
  `pactl set-source-mute #{source_id} true`
54
60
  end
55
61
 
56
62
  def unmute_source(source_id)
63
+ AudioSwitch::LOG.info "unmuting source '#{source_id}'"
57
64
  `pactl set-source-mute #{source_id} false`
58
65
  end
59
66
 
@@ -116,7 +123,7 @@ module AudioSwitch
116
123
  field = fields[field_id]
117
124
  next unless line =~ Regexp.new(field[:marker])
118
125
 
119
- object = {} if field_id == 0
126
+ object = {} if field_id.zero?
120
127
  update(object, line, field)
121
128
 
122
129
  field_id += 1
@@ -12,7 +12,11 @@ module AudioSwitch
12
12
  def start
13
13
  add_to_tray
14
14
  subscribe
15
- Gtk.main
15
+ AudioSwitch::LOG.info 'starting GTK main'
16
+ loop do
17
+ Gtk.main
18
+ AudioSwitch::LOG.info 'restarting GTK main'
19
+ end
16
20
  end
17
21
 
18
22
  private
@@ -33,10 +37,14 @@ module AudioSwitch
33
37
 
34
38
  def draw(sinks)
35
39
  clear
36
- sinks.each { |sink| add new_item(sink) }
40
+ sinks
41
+ .sort_by { |sink| sink[:description] }
42
+ .each { |sink| add new_item(sink) }
37
43
  add new_separator
38
44
  add new_rtp_toggle
39
45
  add new_mute_toggle
46
+ add new_separator
47
+ add new_quit_item
40
48
  end
41
49
 
42
50
  def add(item)
@@ -81,6 +89,14 @@ module AudioSwitch
81
89
  toggle
82
90
  end
83
91
 
92
+ def new_quit_item
93
+ item = Gtk::MenuItem.new('Quit')
94
+ item.signal_connect('activate') do
95
+ AudioSwitch::App.quit
96
+ end
97
+ item
98
+ end
99
+
84
100
  def new_separator
85
101
  Gtk::SeparatorMenuItem.new
86
102
  end
@@ -1,3 +1,3 @@
1
1
  module AudioSwitch
2
- VERSION = '0.0.2'.freeze
2
+ VERSION = '0.0.7'.freeze
3
3
  end
metadata CHANGED
@@ -1,41 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: audio_switch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anatolii Saienko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-30 00:00:00.000000000 Z
11
+ date: 2021-07-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gtk2
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '='
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 3.3.6
19
+ version: 3.4.3
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '='
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 3.3.6
26
+ version: 3.4.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: ruby-libappindicator
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '='
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: 0.1.5
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '='
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.1.5
41
41
  - !ruby/object:Gem::Dependency
@@ -58,56 +58,70 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '11.2'
61
+ version: '12.3'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '11.2'
68
+ version: '12.3'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rubocop
70
+ name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0.41'
75
+ version: '3.5'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0.41'
82
+ version: '3.5'
83
83
  - !ruby/object:Gem::Dependency
84
- name: rspec
84
+ name: rspec-wait
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '3.5'
89
+ version: 0.0.9
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '3.5'
96
+ version: 0.0.9
97
97
  - !ruby/object:Gem::Dependency
98
- name: rspec-wait
98
+ name: rubocop
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 0.0.9
103
+ version: 0.75.1
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 0.0.9
110
+ version: 0.75.1
111
+ - !ruby/object:Gem::Dependency
112
+ name: solargraph
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
111
125
  description: Ubuntu applet that lets you switch audio sinks, toggle RTP sender and
112
126
  inputs. Depends on PulseAudio and libappindicator-dev.
113
127
  email:
@@ -118,6 +132,7 @@ extensions: []
118
132
  extra_rdoc_files: []
119
133
  files:
120
134
  - bin/audio_switch
135
+ - lib/app_logger.rb
121
136
  - lib/audio_switch.rb
122
137
  - lib/audio_switch/model.rb
123
138
  - lib/audio_switch/pactl.rb