rumu 0.3.5 → 0.4.0

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 +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"