Class: Audite
- Inherits:
-
Object
- Object
- Audite
- Defined in:
- lib/audite.rb
Defined Under Namespace
Classes: Events
Instance Attribute Summary collapse
-
#active ⇒ Object
readonly
Returns the value of attribute active.
-
#events ⇒ Object
readonly
Returns the value of attribute events.
-
#file ⇒ Object
readonly
Returns the value of attribute file.
-
#mp3 ⇒ Object
readonly
Returns the value of attribute mp3.
-
#song_list ⇒ Object
readonly
Returns the value of attribute song_list.
-
#stream ⇒ Object
readonly
Returns the value of attribute stream.
-
#thread ⇒ Object
readonly
Returns the value of attribute thread.
Instance Method Summary collapse
- #close ⇒ Object
- #current_song_name ⇒ Object
- #forward(seconds = 2) ⇒ Object
-
#initialize(buffer_size = 2**12) ⇒ Audite
constructor
A new instance of Audite.
- #length ⇒ Object
- #length_in_seconds ⇒ Object
- #level ⇒ Object
- #load(files) ⇒ Object
- #position ⇒ Object
- #process(status) ⇒ Object
- #queue(song) ⇒ Object
- #queued_songs ⇒ Object
- #request_next_song ⇒ Object
- #rewind(seconds = 2) ⇒ Object
- #samples_per_frame ⇒ Object
- #samples_to_frames(samples) ⇒ Object
- #samples_to_seconds(samples) ⇒ Object
- #seconds_to_frames(seconds) ⇒ Object
- #seconds_to_samples(seconds) ⇒ Object
- #seek(seconds) ⇒ Object
- #set_current_song ⇒ Object
- #song_loaded? ⇒ Boolean
- #songs_in_queue? ⇒ Boolean
- #start_stream ⇒ Object
- #start_thread ⇒ Object
- #stop_stream ⇒ Object
- #tell ⇒ Object
- #time_per_frame ⇒ Object
- #toggle ⇒ Object
Constructor Details
Instance Attribute Details
#active ⇒ Object (readonly)
Returns the value of attribute active.
23 24 25 |
# File 'lib/audite.rb', line 23 def active @active end |
#events ⇒ Object (readonly)
Returns the value of attribute events.
23 24 25 |
# File 'lib/audite.rb', line 23 def events @events end |
#file ⇒ Object (readonly)
Returns the value of attribute file.
23 24 25 |
# File 'lib/audite.rb', line 23 def file @file end |
#mp3 ⇒ Object (readonly)
Returns the value of attribute mp3.
23 24 25 |
# File 'lib/audite.rb', line 23 def mp3 @mp3 end |
#song_list ⇒ Object (readonly)
Returns the value of attribute song_list.
23 24 25 |
# File 'lib/audite.rb', line 23 def song_list @song_list end |
#stream ⇒ Object (readonly)
Returns the value of attribute stream.
23 24 25 |
# File 'lib/audite.rb', line 23 def stream @stream end |
#thread ⇒ Object (readonly)
Returns the value of attribute thread.
23 24 25 |
# File 'lib/audite.rb', line 23 def thread @thread end |
Instance Method Details
#close ⇒ Object
71 72 73 74 |
# File 'lib/audite.rb', line 71 def close stream.close exit end |
#current_song_name ⇒ Object
58 59 60 |
# File 'lib/audite.rb', line 58 def current_song_name File.basename mp3.file end |
#forward(seconds = 2) ⇒ Object
186 187 188 |
# File 'lib/audite.rb', line 186 def forward(seconds = 2) seek(position + seconds) end |
#length ⇒ Object
143 144 145 |
# File 'lib/audite.rb', line 143 def length @mp3 ? @mp3.length : 0 end |
#length_in_seconds ⇒ Object
178 179 180 |
# File 'lib/audite.rb', line 178 def length_in_seconds samples_to_seconds(length) end |
#level ⇒ Object
41 42 43 |
# File 'lib/audite.rb', line 41 def level @stream.rms end |
#load(files) ⇒ Object
104 105 106 107 108 |
# File 'lib/audite.rb', line 104 def load(files) files = [] << files unless Array === files files.each {|file| queue file } set_current_song end |
#position ⇒ Object
174 175 176 |
# File 'lib/audite.rb', line 174 def position samples_to_seconds(tell) end |
#process(status) ⇒ Object
45 46 47 48 49 50 51 52 53 54 55 56 |
# File 'lib/audite.rb', line 45 def process(status) if [:done, :need_more].include? status request_next_song events.trigger(:complete) else events.trigger(:position_change, position) end rescue => e $stderr.puts e. $stderr.puts e.backtrace end |
#queue(song) ⇒ Object
119 120 121 |
# File 'lib/audite.rb', line 119 def queue song @song_list << Mpg123.new(song) end |
#queued_songs ⇒ Object
123 124 125 |
# File 'lib/audite.rb', line 123 def queued_songs @song_list.map {|s| File.basename s.file } end |
#request_next_song ⇒ Object
62 63 64 65 66 67 68 69 |
# File 'lib/audite.rb', line 62 def request_next_song if songs_in_queue? set_current_song start_stream else stop_stream end end |
#rewind(seconds = 2) ⇒ Object
182 183 184 |
# File 'lib/audite.rb', line 182 def rewind(seconds = 2) seek(position - seconds) end |
#samples_per_frame ⇒ Object
135 136 137 |
# File 'lib/audite.rb', line 135 def samples_per_frame @mp3.spf end |
#samples_to_frames(samples) ⇒ Object
159 160 161 |
# File 'lib/audite.rb', line 159 def samples_to_frames(samples) samples / samples_per_frame end |
#samples_to_seconds(samples) ⇒ Object
155 156 157 |
# File 'lib/audite.rb', line 155 def samples_to_seconds(samples) samples_to_frames(samples) * time_per_frame end |
#seconds_to_frames(seconds) ⇒ Object
147 148 149 |
# File 'lib/audite.rb', line 147 def seconds_to_frames(seconds) seconds / time_per_frame end |
#seconds_to_samples(seconds) ⇒ Object
151 152 153 |
# File 'lib/audite.rb', line 151 def seconds_to_samples(seconds) seconds_to_frames(seconds) * samples_per_frame end |
#seek(seconds) ⇒ Object
163 164 165 166 167 168 169 170 171 172 |
# File 'lib/audite.rb', line 163 def seek(seconds) if @mp3 samples = seconds_to_samples(seconds) if (0..length).include?(samples) @mp3.seek(samples) events.trigger(:position_change, position) end end end |
#set_current_song ⇒ Object
114 115 116 117 |
# File 'lib/audite.rb', line 114 def set_current_song @mp3 = song_list.shift start_thread end |
#song_loaded? ⇒ Boolean
110 111 112 |
# File 'lib/audite.rb', line 110 def song_loaded? !@mp3.nil? end |
#songs_in_queue? ⇒ Boolean
127 128 129 |
# File 'lib/audite.rb', line 127 def songs_in_queue? !@song_list.empty? end |
#start_stream ⇒ Object
76 77 78 79 80 81 82 83 |
# File 'lib/audite.rb', line 76 def start_stream unless @active || !song_loaded? @active = true @stream.start start_thread events.trigger(:toggle, @active) end end |
#start_thread ⇒ Object
32 33 34 35 36 37 38 39 |
# File 'lib/audite.rb', line 32 def start_thread @thread ||= Thread.start do loop do process @stream.write_from_mpg(@mp3) @stream.wait end end end |
#stop_stream ⇒ Object
85 86 87 88 89 90 91 92 93 94 |
# File 'lib/audite.rb', line 85 def stop_stream if @active @active = false @thread = nil unless @thread.alive? unless @stream.stopped? @stream.stop events.trigger(:toggle, @active) end end end |
#tell ⇒ Object
139 140 141 |
# File 'lib/audite.rb', line 139 def tell @mp3 ? @mp3.tell : 0 end |
#time_per_frame ⇒ Object
131 132 133 |
# File 'lib/audite.rb', line 131 def time_per_frame @mp3.tpf end |
#toggle ⇒ Object
96 97 98 99 100 101 102 |
# File 'lib/audite.rb', line 96 def toggle if @active stop_stream else start_stream end end |