akane_sound 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,381 @@
1
+ class Sound < AkaneSound
2
+ attr_accessor :volume, :track, :mode, :state, :tstmp_play_start,
3
+ :tstmp_play_cur, :progress, :side
4
+ def initialize
5
+ @track = nil
6
+ @track_data = nil
7
+ @side = nil
8
+ @pointer_left = nil
9
+ @pointer_right = nil
10
+ @state = "not playing"
11
+ @tmp_playlist_left = nil
12
+ @playlist_left = nil
13
+ @playlist_left_bkp = nil
14
+ @tmp_playlist_right = nil
15
+ @progress = 0
16
+ @playlist_right = nil
17
+ @playlist_right_bkp = nil
18
+ @tstmp_play_start = nil
19
+ @tstmp_play_cur = nil
20
+ @tstmp_pause_start = nil
21
+ @total_pause = 0
22
+ @volume = @@save_data[:volume]
23
+ @play_dir = nil
24
+ @play_dir_bkp = nil
25
+ @tmp_dir = nil
26
+ set_vol
27
+ @mode = { next: @@save_data[:next], repeat: @@save_data[:repeat],
28
+ shuffle: @@save_data[:shuffle] }
29
+ @end = false
30
+ @tracks_played = 0
31
+ end
32
+
33
+ def update
34
+ now = SDL2.get_ticks
35
+ case @state
36
+ when "playing"
37
+ @tstmp_play_cur = (now - @tstmp_play_start) - @total_pause
38
+ @progress = Util.get_percentage(@tstmp_play_cur, @track_data[:duration])
39
+ if @tstmp_play_cur >= @track_data[:duration]
40
+ if @mode[:next]
41
+ skip("next", 1)
42
+ else
43
+ if @mode[:repeat]
44
+ case @side
45
+ when "left"
46
+ set_track(@pointer_left, false)
47
+ when "right"
48
+ set_track(@pointer_right, false)
49
+ end
50
+ start_track
51
+ else
52
+ stop_track
53
+ end
54
+ end
55
+ end
56
+ when "paused"
57
+ when "not playing"
58
+ when nil
59
+ end
60
+ end
61
+
62
+ def skip(type, offset)
63
+ stop_track
64
+ return if @end
65
+ case type
66
+ when "next"
67
+
68
+ # pointer correction
69
+ case @side
70
+ when "left"
71
+ if @pointer_left+offset >= @playlist_left.length
72
+ @end = true unless @mode[:repeat]
73
+ @tracks_played = 0
74
+ @pointer_left = 0
75
+ offset = 0
76
+ end
77
+ unless @playlist_left[@pointer_left+offset][:index]
78
+ skip("next", offset+1)
79
+ return
80
+ end
81
+ when "right"
82
+ if @pointer_right+offset >= @playlist_right.length
83
+ @end = true unless @mode[:repeat]
84
+ @tracks_played = 0
85
+ @pointer_right = 0
86
+ offset = 0
87
+ end
88
+ unless @playlist_right[@pointer_right+offset][:index]
89
+ skip("next", offset+1)
90
+ return
91
+ end
92
+ end
93
+
94
+ # skip
95
+
96
+ case @side
97
+ when "left"
98
+ set_track(@pointer_left+offset, false)
99
+ @tracks_played += 1
100
+ start_track
101
+ when "right"
102
+ set_track(@pointer_right+offset, false)
103
+ @tracks_played += 1
104
+ start_track
105
+ end
106
+
107
+ when "previous"
108
+
109
+ # pointer correction
110
+ case @side
111
+ when "left"
112
+ if @pointer_left-offset < 0
113
+ @end = true unless @mode[:repeat]
114
+ @pointer_left = @playlist_left.length-1
115
+ offset = 0
116
+ end
117
+ unless @playlist_left[@pointer_left-offset][:index]
118
+ skip("previous", offset+1)
119
+ return
120
+ end
121
+ when "right"
122
+ if @pointer_right-offset < 0
123
+ @end = true unless @mode[:repeat]
124
+ @pointer_right = @playlist_right.length-1
125
+ offset = 0
126
+ end
127
+ unless @playlist_right[@pointer_right-offset][:index]
128
+ skip("previous", offset+1)
129
+ return
130
+ end
131
+ end
132
+
133
+ return if @end
134
+
135
+ # skip
136
+
137
+ case @side
138
+ when "left"
139
+ set_track(@pointer_left-offset, false)
140
+ start_track
141
+ when "right"
142
+ set_track(@pointer_right-offset, false)
143
+ start_track
144
+ end
145
+
146
+ end
147
+ end
148
+
149
+ def set_track(pointer, setter)
150
+ @end = false
151
+ set_playlist(@side) if setter
152
+ case @side
153
+ when "left"
154
+ if setter
155
+ pointer = @playlist_left.index { |song| song[:index] == pointer }
156
+ else
157
+ pointer = @pointer_left if pointer >= @playlist_left.length
158
+ end
159
+ @pointer_left = pointer
160
+ @track_data = @playlist_left[pointer]
161
+ SDL2::Mixer.open(@track_data[:sample].to_i,
162
+ SDL2::Mixer::DEFAULT_FORMAT, 2, 512)
163
+ set_vol
164
+ @track = SDL2::Mixer::Music.load(@playlist_left[pointer][:path])
165
+ when "right"
166
+ if setter
167
+ pointer = @playlist_right.index { |song| song[:index] == pointer }
168
+ else
169
+ pointer = @pointer_right if pointer >= @playlist_right.length
170
+ end
171
+ @pointer_right = pointer
172
+ @track_data = @playlist_right[pointer]
173
+ SDL2::Mixer.open(@track_data[:sample].to_i,
174
+ SDL2::Mixer::DEFAULT_FORMAT, 2, 512)
175
+ set_vol
176
+ @track = SDL2::Mixer::Music.load(@playlist_right[pointer][:path])
177
+ end
178
+ #todo restore_playlist if fails to load
179
+ end
180
+
181
+ def play_track
182
+ if SDL2::Mixer::MusicChannel.play?
183
+ if SDL2::Mixer::MusicChannel.pause?
184
+ @total_pause += SDL2.get_ticks - @tstmp_pause_start
185
+ @state = "playing"
186
+ case @side
187
+ when "left"
188
+ set_status("[PLAY] #{@playlist_left[@pointer_left][:filename]}")
189
+ when "right"
190
+ set_status("[PLAY] #{@playlist_right[@pointer_right][:filename]}")
191
+ end
192
+ SDL2::Mixer::MusicChannel.resume
193
+ else
194
+ @tstmp_pause_start = SDL2.get_ticks
195
+ @state = "paused"
196
+ case @side
197
+ when"left"
198
+ set_status("[PAUSE] #{@playlist_left[@pointer_left][:filename]}")
199
+ when "right"
200
+ set_status("[PAUSE] #{@playlist_right[@pointer_right][:filename]}")
201
+ end
202
+ SDL2::Mixer::MusicChannel.pause
203
+ end
204
+ end
205
+ end
206
+
207
+ def stop_track
208
+ if @track
209
+ set_status("[]")
210
+ SDL2::Mixer::MusicChannel.halt if SDL2::Mixer::MusicChannel.play?
211
+ SDL2::Mixer.close
212
+ @track = nil
213
+ @track_data = nil
214
+ @state = "not playing"
215
+ @progress = 0
216
+ case @side
217
+ when "left"
218
+ #@pointer_left = nil
219
+ when "right"
220
+ #@pointer_right = nil
221
+ end
222
+
223
+ end
224
+ end
225
+
226
+ def start_track
227
+ @state = "playing"
228
+ case @side
229
+ when "left"
230
+ set_status("[PLAY] #{@playlist_left[@pointer_left][:filename]}")
231
+ @tstmp_play_start = SDL2.get_ticks
232
+ @total_pause = 0
233
+ SDL2::Mixer::MusicChannel.play(@track, 1)
234
+ when "right"
235
+ set_status("[PLAY] #{@playlist_right[@pointer_right][:filename]}")
236
+ @tstmp_play_start = SDL2.get_ticks
237
+ @total_pause = 0
238
+ SDL2::Mixer::MusicChannel.play(@track, 1)
239
+ end
240
+ end
241
+
242
+ def get_play_id(side)
243
+ case side
244
+ when "left"
245
+ return @pointer_left
246
+ when "right"
247
+ return @pointer_right
248
+ end
249
+ end
250
+
251
+ def get_track
252
+ case @side
253
+ when "left"
254
+ return @playlist_left[@pointer_left]
255
+ when "right"
256
+ return @playlist_right[@pointer_right]
257
+ end
258
+
259
+ end
260
+
261
+ def get_play_path(side)
262
+ #return "" if side != @side
263
+ if @state == "playing" || @state == "paused"
264
+ case side
265
+ when "left"
266
+ if @side == "left"
267
+ return @track_data[:path]
268
+ #return @playlist_left[@pointer_left][:path]
269
+ else
270
+ return ""
271
+ end
272
+ when "right"
273
+ if @side == "right"
274
+ return @track_data[:filename]
275
+ #return @playlist_right[@pointer_right][:filename]
276
+ else
277
+ return ""
278
+ end
279
+ end
280
+ else
281
+ return ""
282
+ end
283
+ end
284
+
285
+ def set_side(side)
286
+ @side = side
287
+ end
288
+
289
+ def toggle_shuffle
290
+ if @mode[:shuffle]
291
+ @mode[:shuffle] = false
292
+ restore_playlist("left") if @playlist_left
293
+ restore_playlist("right") if @playlist_right
294
+ else
295
+ @mode[:shuffle] = true
296
+ @playlist_left.shuffle! if @playlist_left
297
+ @playlist_right.shuffle! if @playlist_right
298
+ end
299
+ end
300
+
301
+ def toggle_repeat
302
+ if @mode[:repeat]
303
+ @mode[:repeat] = false
304
+ else
305
+ @mode[:repeat] = true
306
+ end
307
+ end
308
+ def toggle_next
309
+ if @mode[:next]
310
+ @mode[:next] = false
311
+ else
312
+ @mode[:next] = true
313
+ end
314
+ end
315
+
316
+ def set_vol
317
+ SDL2::Mixer::MusicChannel.volume = @volume
318
+ end
319
+
320
+ def set_tmp_playlist(pl, side, dir)
321
+ case side
322
+ when "left"
323
+ i = 0
324
+ pl = pl.map do |item|
325
+ if !item[:dir_flag] && !item[:pl_flag]
326
+ #item[:path] = File.join(dir, item[:filename])
327
+ item[:index] = i
328
+ else
329
+ item[:index] = nil
330
+ end
331
+ i += 1
332
+ item
333
+ end
334
+ @tmp_playlist_left = pl
335
+ @tmp_dir = dir
336
+ when "right"
337
+ i = 0
338
+ pl = pl.map do |item|
339
+ item[:index] = i
340
+ i += 1
341
+ item
342
+ end
343
+ @tmp_playlist_right = pl
344
+ @tmp_dir = dir
345
+ set_playlist("right")
346
+ end
347
+ end
348
+
349
+ private
350
+
351
+ def set_playlist(side)
352
+ case side
353
+ when "left"
354
+ @playlist_left = @tmp_playlist_left
355
+ @playlist_left_bkp = Array.new(@playlist_left)
356
+
357
+ @play_dir_bkp = @play_dir
358
+ @play_dir = @tmp_dir
359
+ if @mode[:shuffle]
360
+ @playlist_left.shuffle!
361
+ end
362
+ when "right"
363
+ @playlist_right = @tmp_playlist_right
364
+ @playlist_right_bkp = Array.new(@playlist_right)
365
+ if @mode[:shuffle]
366
+ @playlist_right.shuffle!
367
+ end
368
+ end
369
+ end
370
+
371
+ def restore_playlist(side)
372
+ case side
373
+ when "left"
374
+ @playlist_left = Array.new(@playlist_left_bkp)
375
+ @play_dir = @play_dir_bkp
376
+ when "right"
377
+ @playlist_right = Array.new(@playlist_right_bkp)
378
+ end
379
+ end
380
+
381
+ end
@@ -0,0 +1,421 @@
1
+ class UpperSectionBase < ViewBase
2
+ attr_accessor :max_elements
3
+ def initialize(x, y, w, h, col)
4
+ super
5
+ @view = nil
6
+ @element_h = nil
7
+ @offset = nil
8
+ @max_elements = 0
9
+ @element_h = (@@config[:font_size] * @@config[:line_height_mod]).to_i
10
+ @offset = @element_h
11
+ @max_elements = 0
12
+ set_view
13
+ @txt_color = Util.to_col_ar(@@config[:text_color])
14
+ @txt_col_dis = Util.to_col_ar(@@config[:text_color_disabled])
15
+ @txt_color_sel = Util.to_col_ar(@@config[:text_color_selected])
16
+ @elements = Array.new
17
+ @title = @@font.render_blended(@title, @txt_color)
18
+ @title_rect = SDL2::Rect[8, @element_h/2-@title.h/2, @title.w, @title.h]
19
+
20
+ update_element_strings
21
+ set_page
22
+ update_element_positions
23
+ end
24
+
25
+ def update
26
+ if @focus_flag
27
+ if (@@inp.down == 1 || @@inp.down >= 20) && @playlist.length > 0
28
+ if @@inp.down == 1
29
+ @pointer = (@pointer+1) % @elements.length
30
+ set_page
31
+ update_element_positions
32
+ elsif @@inp.down == 22
33
+ @pointer = (@pointer+1) % @elements.length
34
+ set_page
35
+ update_element_positions
36
+ @@inp.down = 20
37
+ end
38
+ end
39
+ if (@@inp.up == 1 || @@inp.up >= 20) && @playlist.length > 0
40
+ if @@inp.up == 1
41
+ @pointer = (@pointer+(@elements.length-1)) % @elements.length
42
+ set_page
43
+ update_element_positions
44
+ elsif @@inp.up == 22
45
+ @pointer = (@pointer+(@elements.length-1)) % @elements.length
46
+ set_page
47
+ update_element_positions
48
+ @@inp.up = 20
49
+ end
50
+ end
51
+ if @@inp.pagedown == 1 && @playlist.length > 0
52
+ @pointer = @max_elements*@page
53
+ @pointer = @elements.length-1 if @pointer > @elements.length-1
54
+ set_page
55
+ update_element_positions
56
+ end
57
+ if @@inp.pageup == 1 && @playlist.length > 0
58
+ @pointer = @max_elements*(@page-2)
59
+ @pointer = 0 if @pointer < 0
60
+ set_page
61
+ update_element_positions
62
+ end
63
+ if @@inp.first == 1 && @playlist.length > 0
64
+ @pointer = 0
65
+ set_page
66
+ update_element_positions
67
+ end
68
+ if @@inp.last == 1 && @playlist.length > 0
69
+ @pointer = @elements.length-1
70
+ set_page
71
+ update_element_positions
72
+ end
73
+ if @@inp.accept == 1
74
+ #Util.p (@elements.length.to_f/@max_elements.to_f).ceil.to_s
75
+ end
76
+ end
77
+ end
78
+
79
+ def update_size(x, y, w, h)
80
+ super
81
+ @max_elements = 0
82
+ set_view
83
+ set_page
84
+ update_element_strings
85
+ update_element_positions
86
+ end
87
+
88
+ def update_element_positions
89
+ j = 0
90
+ i = @max_elements*(@page-1)
91
+ k = -1
92
+
93
+ @elements.each do |e|
94
+ k += 1
95
+ next if k < i
96
+ unless @playlist[i][:dir_flag] || @playlist[i][:pl_flag]
97
+ overshoot = ((@view.w-8)-@elements[i].dur.w-4)
98
+ unless i == @pointer
99
+ if @elements[i].txt.w >= overshoot
100
+ sprite_w = @elements[i].txt.w-(@elements[i].txt.w-overshoot)
101
+ else
102
+ sprite_w = @elements[i].txt.w
103
+ end
104
+ sprite_h = @elements[i].txt.h
105
+ else
106
+ if @elements[i].txt_bld.w >= overshoot
107
+ sprite_w = @elements[i].txt_bld.w-(@elements[i].txt_bld.w-overshoot)
108
+ else
109
+ sprite_w = @elements[i].txt_bld.w
110
+ end
111
+ sprite_h = @elements[i].txt_bld.h
112
+ end
113
+ else
114
+ unless i == @pointer
115
+ sprite_w = @elements[i].txt.w
116
+ sprite_h = @elements[i].txt.h
117
+ else
118
+ sprite_w = @elements[i].txt_bld.w
119
+ sprite_h = @elements[i].txt_bld.h
120
+ end
121
+ end
122
+ y = (0+(j*@element_h))+((@element_h/2)-(sprite_h/2))
123
+ @elements[i].txt_src = SDL2::Rect[0, 0, sprite_w, sprite_h]
124
+ @elements[i].txt_dst = SDL2::Rect[4, y, sprite_w, sprite_h]
125
+ @elements[i].bg_rect = SDL2::Rect[0, j*@element_h, @view.w, @element_h]
126
+ unless @playlist[i][:dir_flag] || @playlist[i][:pl_flag]
127
+ @elements[i].dur_dst = SDL2::Rect[(@view.w-@elements[i].dur.w)-4, y,
128
+ @elements[i].dur.w,
129
+ @elements[i].dur.h]
130
+ end
131
+ i+= 1
132
+ j+= 1
133
+
134
+
135
+ end
136
+ end
137
+ =begin
138
+ def update_element_positions
139
+ j = 0
140
+ i = @max_elements*(@page-1)
141
+ Util.p i.to_s
142
+
143
+ @playlist.each do |item|
144
+ unless item[:dir_flag]
145
+ overshoot = ((@view.w-8)-@elements[i].dur.w-4)
146
+ unless i == @pointer
147
+ if @elements[i].txt.w >= overshoot
148
+ sprite_w = @elements[i].txt.w-(@elements[i].txt.w-overshoot)
149
+ else
150
+ sprite_w = @elements[i].txt.w
151
+ end
152
+ sprite_h = @elements[i].txt.h
153
+ else
154
+ if @elements[i].txt_bld.w >= overshoot
155
+ sprite_w = @elements[i].txt_bld.w-(@elements[i].txt_bld.w-overshoot)
156
+ else
157
+ sprite_w = @elements[i].txt_bld.w
158
+ end
159
+ sprite_h = @elements[i].txt_bld.h
160
+ end
161
+ else
162
+ unless i == @pointer
163
+ sprite_w = @elements[i].txt.w
164
+ sprite_h = @elements[i].txt.h
165
+ else
166
+ sprite_w = @elements[i].txt_bld.w
167
+ sprite_h = @elements[i].txt_bld.h
168
+ end
169
+ end
170
+ y = (0+(j*@element_h))+((@element_h/2)-(sprite_h/2))
171
+ @elements[i].txt_src = SDL2::Rect[0, 0, sprite_w, sprite_h]
172
+ @elements[i].txt_dst = SDL2::Rect[4, y, sprite_w, sprite_h]
173
+ @elements[i].bg_rect = SDL2::Rect[0, j*@element_h, @view.w, @element_h]
174
+ unless item[:dir_flag]
175
+ @elements[i].dur_dst = SDL2::Rect[(@view.w-@elements[i].dur.w)-4, y,
176
+ @elements[i].dur.w,
177
+ @elements[i].dur.h]
178
+ end
179
+ i+= 1
180
+ j+= 1
181
+ break if i >= @playlist.length
182
+ end
183
+ end
184
+ =end
185
+
186
+ def update_element_strings
187
+ @border = SDL2::Rect[@view.x-1, @view.y-1, @view.w+2, @view.h+2]
188
+ i = 0
189
+ txtcol = (@focus_flag) ? @txt_color : @txt_col_dis
190
+ @elements.each { |e| e.destroy }
191
+ @elements.clear
192
+ @playlist.each do |item|
193
+ el = Element.new
194
+ unless item[:dir_flag] || item[:pl_flag]
195
+ str = String.new
196
+ unless item[:artist].empty?
197
+ str = item[:artist]+' - '
198
+ end
199
+ unless item[:title].empty?
200
+ str += item[:title]
201
+ else
202
+ str += item[:filename]
203
+ end
204
+ unless item[:album].empty?
205
+ str += ' ('+item[:album]+')'
206
+ end
207
+ el.dur = @@font_bold.render_blended(item[:tag], txtcol)
208
+ else
209
+ str = item[:filename]
210
+ end
211
+ el.txt = @@font.render_blended(str, txtcol)
212
+ el.txt_bld = @@font_bold.render_blended(str, txtcol)
213
+ el.txt_sel = @@font.render_blended(str, @txt_color_sel)
214
+ el.txt_sel_bld = @@font_bold.render_blended(str, @txt_color_sel)
215
+
216
+ @elements.push(el)
217
+ i += 1
218
+ end
219
+ end
220
+
221
+ def draw
222
+ super
223
+
224
+ @@renderer.viewport = @view_base
225
+ @@renderer.fill_rect(SDL2::Rect[0,
226
+ 0,
227
+ @view_base.w,
228
+ @view_base.h])
229
+ # draw border
230
+ @@renderer.viewport = @border
231
+ @@renderer.draw_blend_mode = SDL2::BlendMode::BLEND
232
+ @@renderer.draw_color = [@@config[:fg_color][:red],
233
+ @@config[:fg_color][:green],
234
+ @@config[:fg_color][:blue],
235
+ @@config[:fg_color][:alpha]]
236
+ @@renderer.draw_rect(SDL2::Rect[0, 0, @border.w, @border.h])
237
+ @@renderer.viewport = @view_base
238
+ # draw title
239
+ @@renderer.copy(@@renderer.create_texture_from(@title), nil, @title_rect)
240
+
241
+ # draw item list
242
+ @@renderer.viewport = @view
243
+ i = @max_elements*(@page-1)
244
+ j = -1
245
+ @elements.each do |el|
246
+ j +=1
247
+ next if j < i
248
+ txt = nil
249
+ if @pointer == i
250
+ if @focus_flag
251
+ @@renderer.draw_color = [@@config[:select_bg_color][:red],
252
+ @@config[:select_bg_color][:green],
253
+ @@config[:select_bg_color][:blue],
254
+ @@config[:select_bg_color][:alpha]]
255
+ @@renderer.fill_rect(el.bg_rect)
256
+ end
257
+ case self.class.to_s
258
+ when "SectionDir"
259
+ if File.join(@dir_stack.join(nil), @playlist[i][:filename]) ==
260
+ @@sound.get_play_path("left") && @focus_flag
261
+ txt = el.txt_sel_bld
262
+ else
263
+ txt = el.txt_bld
264
+ end
265
+ when "SectionPlaylist"
266
+ if @playlist[i][:filename] == @@sound.get_play_path("right") &&
267
+ @focus_flag
268
+ txt = el.txt_sel_bld
269
+ else
270
+ txt = el.txt_bld
271
+ end
272
+ end
273
+ else
274
+ case self.class.to_s
275
+ when "SectionDir"
276
+ if File.join(@dir_stack.join(nil), @playlist[i][:filename]) ==
277
+ @@sound.get_play_path("left") && @focus_flag
278
+ txt = el.txt_sel
279
+ else
280
+ txt = el.txt
281
+ end
282
+ when "SectionPlaylist"
283
+ if @playlist[i][:filename] == @@sound.get_play_path("right") &&
284
+ @focus_flag
285
+ txt = el.txt_sel
286
+ else
287
+ txt = el.txt
288
+ end
289
+ end
290
+ end
291
+ @@renderer.copy(@@renderer.create_texture_from(txt), el.txt_src,
292
+ el.txt_dst)
293
+ if el.dur
294
+ @@renderer.copy(@@renderer.create_texture_from(el.dur),
295
+ nil, el.dur_dst)
296
+ end
297
+ i += 1
298
+ break if i >= @elements.length
299
+ end
300
+ end
301
+
302
+ def get_cache(dir)
303
+ dir += "/" if dir[-1] != "/"
304
+ #cache = get_cache_name(dir)
305
+ return @@cache[dir] if @@cache.has_key?(dir)
306
+ return nil
307
+ =begin
308
+ if File.exist?(cache)
309
+ ar = YAML.load(File.open(cache))
310
+ return ar
311
+ end
312
+ return nil
313
+ =end
314
+ end
315
+
316
+ def get_playlist(dir)
317
+ #cache = get_cache_name(dir)
318
+ ar = Array.new
319
+ dir_contents_dir = Dir.entries(dir).sort.select do |entry|
320
+ if dir == @@config[:root_dir]
321
+ File.directory?(File.join(dir, entry)) and
322
+ !(entry == '.' || entry == '..')
323
+ else
324
+ File.directory?(File.join(dir, entry)) and
325
+ !(entry == '.')
326
+ end
327
+ end
328
+ dir_contents_dir.each do |entry|
329
+ ar.push({ filename: entry+'/', dir_flag: true, duration: nil, bps: nil,
330
+ br: nil, artist: nil, album: nil, pl_time: nil, type: nil,
331
+ tag: nil, title: nil, pl_flag: false, sample: nil, path: nil })
332
+ end
333
+ dir_contents_file = Dir.entries(dir).sort.select do |entry|
334
+ !File.directory?(File.join(dir, entry)) and
335
+ (/\.mp3|ogg|m4a|wav|mid|flac\z/ === entry)
336
+ end
337
+ dir_contents_file.each do |entry|
338
+ dur = %x( mediainfo --Inform="Audio;%Duration%" "#{dir+entry}" )
339
+ bps = %x( mediainfo --Inform="Audio;%BitRate%" "#{dir+entry}" )
340
+ br = %x( mediainfo --Inform="Audio;%BitRate_Mode%" "#{dir+entry}" )
341
+ sample = %x( mediainfo --Inform="Audio;%SamplingRate%" "#{dir+entry}" )
342
+ #sample2 = %x( mediainfo --Inform="Audio;%SamplingRate/String%" "#{dir+entry}" )
343
+ artist = %x(ffprobe -loglevel error -show_entries format_tags=artist -of default=noprint_wrappers=1:nokey=1 "#{dir+entry}" )
344
+ album = %x(ffprobe -loglevel error -show_entries format_tags=album -of default=noprint_wrappers=1:nokey=1 "#{dir+entry}" )
345
+ title = %x(ffprobe -loglevel error -show_entries format_tags=title -of default=noprint_wrappers=1:nokey=1 "#{dir+entry}" )
346
+ artist.delete!("\n")
347
+ title.delete!("\n")
348
+ album.delete!("\n")
349
+ pltime = Util.ms_to_time_str(dur.to_i)
350
+ type = entry[-3..-1].upcase
351
+ tag = '['+pltime+'|'+type+']'
352
+ ar.push({ filename: entry, dir_flag: false, duration: dur.to_i,
353
+ bps: bps.to_i, br: br[0..2], artist: artist, album: album,
354
+ pl_time: pltime, type: type, tag: tag, title: title,
355
+ pl_flag: false, sample: sample, path: dir+entry })
356
+ #@tracks += 1
357
+ end
358
+ dir_contents_pl = Dir.entries(dir).sort.select do |entry|
359
+ !File.directory?(File.join(dir, entry)) and
360
+ (/\.apl.yaml\z/ === entry)
361
+ end
362
+ dir_contents_pl.each do |entry|
363
+ ar.push({ filename: entry, dir_flag: false, duration: nil, bps: nil,
364
+ br: nil, artist: nil, album: nil, pl_time: nil, type: nil,
365
+ tag: nil, title: nil, pl_flag: true, sample: nil, path: nil })
366
+ end
367
+ # write cache
368
+ dir += "/" if dir[-1] != "/"
369
+ @@cache[dir] = ar
370
+ str = (@@debug_flag) ? "cache_debug.yaml" : "cache.yaml"
371
+ File.open(
372
+ File.join(@@pref_dir, str), 'w') { |file| file.write(@@cache.to_yaml) }
373
+ ar
374
+ end
375
+
376
+ private
377
+
378
+ def set_view
379
+ @view = SDL2::Rect[@view_base.x+@offset_left,
380
+ @view_base.y+@offset,
381
+ @view_base.w - (@offset_left+@offset_right),
382
+ view_height]
383
+ end
384
+
385
+ def view_height
386
+ height = 0
387
+ max_h = @view_base.h - @offset*2
388
+ while height < max_h
389
+ height += @element_h
390
+ @max_elements += 1
391
+ end
392
+ return height
393
+ end
394
+
395
+ def set_page
396
+ #@page = 1 if @pointer < @max_elements-1
397
+ @page = get_page((@max_elements), @pointer)
398
+ end
399
+
400
+ def get_page(max, pointer)
401
+ page = 1
402
+ i = 0
403
+ while i <= pointer
404
+ if i == max*page
405
+ page += 1
406
+ end
407
+ i += 1
408
+ end
409
+
410
+ return page
411
+ end
412
+
413
+ def get_cache_name(dir)
414
+ unless @@debug_flag
415
+ return File.join(dir, ".cache.yaml")
416
+ else
417
+ return File.join(dir, ".cache_debug.yaml")
418
+ end
419
+ end
420
+ end
421
+