rumu 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/bin/rumu +111 -100
  3. metadata +8 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a1965b7e8026eb72e0cfd4c9f4b74523adf96c2d64a30508df01283a51f6ef80
4
- data.tar.gz: 287bb2634da8ce13cf4d1380ac29561b4f747bafdd8c79b69c05acbdc3910907
3
+ metadata.gz: d4eb3a0747c545c987b03ae0bd8117cfb613f5b30ee9ced1e80105b7dd8f9ef1
4
+ data.tar.gz: 06a8c5ca36e3003a558f0336220f09e3fc6451d234ba10d9a233a6e010920733
5
5
  SHA512:
6
- metadata.gz: 2139d62a2b4eac691d693a2092b9fb4721382fe10295f811b6a98d25a7852005567641974e50c52c06f5f3a79ab95d40c5dd678cb26579bd41a40f02b585e909
7
- data.tar.gz: 94a7861eebfc123955fa8315ac111fc44b2c85945127d62cfef552bfd733ff4c2f28e448f2bb5690002deb28cfda0c3cc4b41032ec8317974b87a23eae7c592e
6
+ metadata.gz: dec6313820cd82b3c62b3be05678d57dc5ba514e212e0962f3186bd010c431b7e251ea19989f8efe64050214f2c1442b4d9893476b6ce7d740286df19ff9e688
7
+ data.tar.gz: 6c59f26842bf443479e56ddf020d3410cdfa8a90262f5b1ecbd15d04bceffe334b657b92981189c13b70293b148b2aa28b7a2566fa0311a089496811e2fd1da6
data/bin/rumu CHANGED
@@ -3,71 +3,70 @@ require 'open3'
3
3
  require 'shellwords'
4
4
  require 'io/console'
5
5
  require 'pathname'
6
- require 'ffi'
7
6
  require 'pulseaudio_simple_ffi'
8
7
 
9
- pkg='rumu'
10
- ver='0.4.0'
11
- ConfigDir="#{Dir.home}/.config/#{pkg}"
8
+ Pkg='rumu'
9
+ Ver='0.4.1'
10
+ ConfigDir="#{Dir.home}/.config/#{Pkg}"
12
11
  Dir.mkdir(ConfigDir) unless File.directory?(ConfigDir)
13
12
 
14
13
  Channels,Rate,WordSize=2,44100,4
15
14
  FfmpegFmt="-ac #{Channels} -ar #{Rate} -f f#{WordSize*8}le"
16
15
 
17
16
  class FfmpegPipeO
18
- def initialize(device, channels: Channels, rate: Rate, wordsize: WordSize )
19
- device = device.to_s.chomp.length>0 ? device.to_s.chomp : '-f pulse default'
20
- @in,@out,@err,@thr = Open3.popen3("ffmpeg -loglevel -8 #{FfmpegFmt} -i - #{device}")
21
- @out.close
22
- @err.close
23
- end
24
- def write buf
25
- @in.write buf
26
- end
27
- def close
28
- @in.close
29
- end
17
+ def initialize(device, channels: Channels, rate: Rate, wordsize: WordSize )
18
+ device = device.to_s.chomp.length>0 ? device.to_s.chomp : '-f pulse default'
19
+ @in,@out,@err,@thr = Open3.popen3("ffmpeg -loglevel -8 #{FfmpegFmt} -i - #{device}")
20
+ @out.close
21
+ @err.close
22
+ end
23
+ def write buf
24
+ @in.write buf
25
+ end
26
+ def close
27
+ @in.close
28
+ end
30
29
  end
31
30
 
32
31
  class ConfigO
33
- def initialize file: ConfigDir+'/out'
34
- @mode=:pulse
35
- @device=nil
36
- if File.file?(file)
37
- cfg=File.read(file).split("\n")
38
- @mode=cfg[0].to_sym
39
- @device=cfg[1].to_s.chomp.length>0 ? cfg[1] : nil
40
- end
41
- File.write(file,@mode.to_s+"\n"+@device.to_s)
42
- @out= :ffmpeg == @mode ?
43
- FfmpegPipeO.new(@device) :
44
- PulseAudioSimpleFFI::PulseAudioSimpleO.new(@device,'Music Playlist',channels:Channels,rate:Rate)
45
- end
46
- def write buf
47
- @out.write buf
48
- end
49
- def close
50
- @out.close
51
- end
32
+ def initialize file: ConfigDir+'/out'
33
+ @mode=:pulse
34
+ @device=nil
35
+ if File.file?(file)
36
+ cfg=File.read(file).split("\n")
37
+ @mode=cfg[0].to_sym
38
+ @device=cfg[1].to_s.chomp.length>0 ? cfg[1] : nil
39
+ end
40
+ File.write(file,@mode.to_s+"\n"+@device.to_s)
41
+ @out= :ffmpeg == @mode ?
42
+ FfmpegPipeO.new(@device) :
43
+ PulseAudioSimpleFFI::PulseAudioSimpleO.new(Pkg,'Music Playlist',channels:Channels,rate:Rate,device:@device)
44
+ end
45
+ def write buf
46
+ @out.write buf
47
+ end
48
+ def close
49
+ @out.close
50
+ end
52
51
  end
53
52
 
54
53
  list,list_i,cycle,mode,ssoff,help=[],0,0,:load,'',''
55
54
  if ARGV.length==0
56
- if File.file?("#{ConfigDir}/list")
57
- list=File.read("#{ConfigDir}/list").split("\n")
58
- if File.file?("#{ConfigDir}/pos")
59
- pos=File.read("#{ConfigDir}/pos").split("\n")
60
- list_i=pos[0].to_i
61
- cycle=pos[1].to_i
62
- cycle-=3 if cycle>3
63
- ssoff="-ss #{cycle} " if cycle>0
64
- end
65
- else
66
- puts "Usage: #{pkg} files_to_play"
67
- exit 1
68
- end
55
+ if File.file?("#{ConfigDir}/list")
56
+ list=File.read("#{ConfigDir}/list").split("\n")
57
+ if File.file?("#{ConfigDir}/pos")
58
+ pos=File.read("#{ConfigDir}/pos").split("\n")
59
+ list_i=pos[0].to_i
60
+ cycle=pos[1].to_i
61
+ cycle-=3 if cycle>3
62
+ ssoff="-ss #{cycle} " if cycle>0
63
+ end
64
+ else
65
+ puts "Usage: #{Pkg} files_to_play"
66
+ exit 1
67
+ end
69
68
  else
70
- list=ARGV.map{|x|Pathname(x).realpath.to_s}
69
+ list=ARGV.map{|x|Pathname(x).realpath.to_s}
71
70
  end
72
71
  prefix=/\A(.*).*(\n\1.*)*\Z/.match(list.join("\n"))[1]
73
72
  puts prefix
@@ -75,59 +74,71 @@ puts prefix
75
74
  ii,io,ie,it=nil,nil,nil,nil
76
75
  oo=ConfigO.new
77
76
 
78
- pt=Thread.new{
79
- until :quit == mode
80
- if io and io.eof?
81
- list_i+=1
82
- mode=list_i>=list.count ? :quit : :load
83
- end
84
- case mode
85
- when :load #load new track
86
- [io,ie].each{|x|x.close} unless !io or io.closed?
87
- ii,io,ie,it = Open3.popen3 "ffmpeg -loglevel -8 -i #{Shellwords.escape(list[list_i])} #{ssoff} #{FfmpegFmt} -"
88
- ii.close
89
- cycle=0 unless ssoff.length > 0
90
- puts "#{' '*help.length}\r#{list[list_i][prefix.length..-1]}"
91
- ssoff=''
92
- help=''
93
- mode=:play
94
- when :play
95
- oo.write(io.read(Channels*Rate*WordSize))
96
- cycle+=1
97
- end
98
- end
99
- oo.close
77
+ bq=SizedQueue.new 4
78
+
79
+ iit=Thread.new {
80
+ until :quit == mode
81
+ if io and io.eof?
82
+ list_i+=1
83
+ mode=list_i>=list.count ? :quit : :load
84
+ end
85
+ if :load == mode
86
+ [io,ie].each{|x|x.close} unless !io or io.closed?
87
+ ii,io,ie,it = Open3.popen3 "ffmpeg -loglevel -8 -i #{Shellwords.escape(list[list_i])} #{ssoff} #{FfmpegFmt} -"
88
+ ii.close
89
+ cycle=0 unless ssoff.length > 0
90
+ puts "#{' '*help.length}\r#{list[list_i][prefix.length..-1]}"
91
+ ssoff=''
92
+ help=''
93
+ mode=:play
94
+ end
95
+ bq.push io.read(Channels*Rate*WordSize)
96
+ end
97
+ io.close
98
+ }
99
+
100
+ oot=Thread.new{
101
+ until :quit == mode
102
+ if :play == mode
103
+ oo.write bq.pop
104
+ cycle+=1
105
+ else
106
+ sleep rand
107
+ end
108
+ end
109
+ oo.close
100
110
  }
101
111
 
102
112
  until :quit == mode
103
- print "\r#{cycle/60}:#{"%02d"%(cycle%60)} > "
104
- case ch=IO.console.raw{|c|c.read_nonblock(1) rescue ''}.downcase
105
- when 'n'
106
- list_i+=1
107
- mode= list_i<list.count ? :load : :quit
108
- when 'r'
109
- mode=:load
110
- when 'p'
111
- if list_i>0
112
- list_i-=1
113
- mode=:load
114
- end
115
- when 's'
116
- print "Seek to: "
117
- ti=(ts=IO.console.readline.chomp).split(':')
118
- ssoff="-ss #{ts}"
119
- cycle=(ti[-1].to_f + ti[-2].to_f*60 + ti[-3].to_f*60*60).to_i
120
- mode=:load
121
- when 'q'
122
- mode=:quit
123
- File.write(ConfigDir+"/list",list.join("\n"))
124
- File.write(ConfigDir+"/pos",list_i.to_s+"\n"+cycle.to_s)
125
- when ''
126
- sleep rand
127
- else
128
- print (help="#{ch} < #{list_i>0?"[P]rev ":""}[R]estart [S]eek [N]ext [Q]uit")
129
- end
113
+ print "\r#{cycle/60}:#{"%02d"%(cycle%60)} > "
114
+ case ch=IO.console.raw{|c|c.read_nonblock(1) rescue ''}.downcase
115
+ when 'n'
116
+ list_i+=1
117
+ mode= list_i<list.count ? :load : :quit
118
+ when 'r'
119
+ mode=:load
120
+ when 'p'
121
+ if list_i>0
122
+ list_i-=1
123
+ mode=:load
124
+ end
125
+ when 's'
126
+ print "Seek to: "
127
+ ti=(ts=IO.console.readline.chomp).split(':')
128
+ ssoff="-ss #{ts}"
129
+ cycle=(ti[-1].to_f + ti[-2].to_f*60 + ti[-3].to_f*60*60).to_i
130
+ mode=:load
131
+ when 'q'
132
+ mode=:quit
133
+ File.write(ConfigDir+"/list",list.join("\n"))
134
+ File.write(ConfigDir+"/pos",list_i.to_s+"\n"+cycle.to_s)
135
+ when ''
136
+ sleep rand
137
+ else
138
+ print (help="#{ch} < #{list_i>0?"[P]rev ":""}[R]estart [S]eek [N]ext [Q]uit")
139
+ end
130
140
  end
131
141
 
132
- puts "\r ] #{pkg} ✝ v#{ver} [ "
133
- pt.join
142
+ puts "\r ] #{Pkg} ✝ v#{Ver} [ "
143
+ iit.join
144
+ oot.join
metadata CHANGED
@@ -1,19 +1,22 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rumu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin Cook
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-02 00:00:00.000000000 Z
11
+ date: 2021-04-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pulseaudio_simple_ffi
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.0'
17
20
  - - ">="
18
21
  - !ruby/object:Gem::Version
19
22
  version: 0.0.1
@@ -21,6 +24,9 @@ dependencies:
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '0.0'
24
30
  - - ">="
25
31
  - !ruby/object:Gem::Version
26
32
  version: 0.0.1