rumu 0.3.5 → 0.4.0

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 +53 -18
  3. metadata +19 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d06d25705c6b4da13ff00b1825e53739188fd5e2412c3135d0ce4a6586d4a7cb
4
- data.tar.gz: 31c076843b5894506d1e706277309933ed13e2e70f9c9170225f5ddec58269ba
3
+ metadata.gz: a1965b7e8026eb72e0cfd4c9f4b74523adf96c2d64a30508df01283a51f6ef80
4
+ data.tar.gz: 287bb2634da8ce13cf4d1380ac29561b4f747bafdd8c79b69c05acbdc3910907
5
5
  SHA512:
6
- metadata.gz: fdcda38fa11055f5edea07c3bb83dad0a518ba6c97add5f281413b650451ed84c73e1354ed48248ab0d6a2837649a16aa94892b0a7b80d4da342a4ec183a8cc2
7
- data.tar.gz: 6345879a1a65267e661cd755d1241d40c1f8ef297a6e8505ec675d14847cb3ab72ac761c1cb232487225bf2500f8ccfd93555b60fe0c11b6cdea45cf8761c6ca
6
+ metadata.gz: 2139d62a2b4eac691d693a2092b9fb4721382fe10295f811b6a98d25a7852005567641974e50c52c06f5f3a79ab95d40c5dd678cb26579bd41a40f02b585e909
7
+ data.tar.gz: 94a7861eebfc123955fa8315ac111fc44b2c85945127d62cfef552bfd733ff4c2f28e448f2bb5690002deb28cfda0c3cc4b41032ec8317974b87a23eae7c592e
data/bin/rumu CHANGED
@@ -3,24 +3,60 @@ require 'open3'
3
3
  require 'shellwords'
4
4
  require 'io/console'
5
5
  require 'pathname'
6
+ require 'ffi'
7
+ require 'pulseaudio_simple_ffi'
6
8
 
7
9
  pkg='rumu'
8
- ver='0.3.5'
9
- pkgd="#{Dir.home}/.config/#{pkg}"
10
+ ver='0.4.0'
11
+ ConfigDir="#{Dir.home}/.config/#{pkg}"
12
+ Dir.mkdir(ConfigDir) unless File.directory?(ConfigDir)
10
13
 
11
- chan,rate,word=2,44100,4
12
- ff_fmt="-ac #{chan} -ar #{rate} -f f#{word*8}le"
14
+ Channels,Rate,WordSize=2,44100,4
15
+ FfmpegFmt="-ac #{Channels} -ar #{Rate} -f f#{WordSize*8}le"
13
16
 
14
- Dir.mkdir(pkgd) unless File.directory?(pkgd)
15
- File.write(pkgd+"/dev","-f pulse default") unless File.file?("#{pkgd}/dev")
16
- ff_out=File.read(pkgd+"/dev")
17
+ 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
30
+ end
31
+
32
+ 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
52
+ end
17
53
 
18
54
  list,list_i,cycle,mode,ssoff,help=[],0,0,:load,'',''
19
55
  if ARGV.length==0
20
- if File.file?("#{pkgd}/list")
21
- list=File.read("#{pkgd}/list").split("\n")
22
- if File.file?("#{pkgd}/pos")
23
- pos=File.read("#{pkgd}/pos").split("\n")
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")
24
60
  list_i=pos[0].to_i
25
61
  cycle=pos[1].to_i
26
62
  cycle-=3 if cycle>3
@@ -37,8 +73,7 @@ prefix=/\A(.*).*(\n\1.*)*\Z/.match(list.join("\n"))[1]
37
73
  puts prefix
38
74
 
39
75
  ii,io,ie,it=nil,nil,nil,nil
40
- oi,oo,oe,ot=Open3.popen3("ffmpeg -loglevel -8 #{ff_fmt} -i - #{ff_out}")
41
- oo.close
76
+ oo=ConfigO.new
42
77
 
43
78
  pt=Thread.new{
44
79
  until :quit == mode
@@ -49,7 +84,7 @@ pt=Thread.new{
49
84
  case mode
50
85
  when :load #load new track
51
86
  [io,ie].each{|x|x.close} unless !io or io.closed?
52
- ii,io,ie,it = Open3.popen3 "ffmpeg -loglevel -8 -i #{Shellwords.escape(list[list_i])} #{ssoff} #{ff_fmt} -"
87
+ ii,io,ie,it = Open3.popen3 "ffmpeg -loglevel -8 -i #{Shellwords.escape(list[list_i])} #{ssoff} #{FfmpegFmt} -"
53
88
  ii.close
54
89
  cycle=0 unless ssoff.length > 0
55
90
  puts "#{' '*help.length}\r#{list[list_i][prefix.length..-1]}"
@@ -57,11 +92,11 @@ pt=Thread.new{
57
92
  help=''
58
93
  mode=:play
59
94
  when :play
60
- oi.write(io.read(word*chan*rate))
95
+ oo.write(io.read(Channels*Rate*WordSize))
61
96
  cycle+=1
62
97
  end
63
98
  end
64
- [oi,oe].each{|x|x.close}
99
+ oo.close
65
100
  }
66
101
 
67
102
  until :quit == mode
@@ -85,8 +120,8 @@ until :quit == mode
85
120
  mode=:load
86
121
  when 'q'
87
122
  mode=:quit
88
- File.write(pkgd+"/list",list.join("\n"))
89
- File.write(pkgd+"/pos",list_i.to_s+"\n"+cycle.to_s)
123
+ File.write(ConfigDir+"/list",list.join("\n"))
124
+ File.write(ConfigDir+"/pos",list_i.to_s+"\n"+cycle.to_s)
90
125
  when ''
91
126
  sleep rand
92
127
  else
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rumu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.4.0
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-03-30 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2021-04-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: pulseaudio_simple_ffi
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.0.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 0.0.1
13
27
  description: rumu is an aggressively minimized audio player that plays a playlist
14
28
  gaplessly leveraging command-line ffmpeg and pipes. After a quit, it will return
15
29
  to where it left off when run next.
@@ -31,7 +45,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
31
45
  requirements:
32
46
  - - ">="
33
47
  - !ruby/object:Gem::Version
34
- version: '2.7'
48
+ version: '3.0'
35
49
  required_rubygems_version: !ruby/object:Gem::Requirement
36
50
  requirements:
37
51
  - - ">="
@@ -39,7 +53,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
39
53
  version: '0'
40
54
  requirements:
41
55
  - ffmpeg
42
- rubygems_version: 3.2.13
56
+ rubygems_version: 3.2.15
43
57
  signing_key:
44
58
  specification_version: 4
45
59
  summary: "(ru)by (mu)usic - a minimal ffmpeg-based gapless audio playlist player"