akane_sound 0.1.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.
@@ -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
+