rumu 0.4.0 → 0.4.1

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