akane_sound 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/akane_sound +4 -0
- data/data/NotoSansCJKjp-Bold.otf +0 -0
- data/data/NotoSansCJKjp-Medium.otf +0 -0
- data/data/NotoSansCJKjp-Regular.otf +0 -0
- data/data/akane_bg.png +0 -0
- data/data/config.yaml +79 -0
- data/data/save_data.yaml +14 -0
- data/lib/akane_sound.rb +214 -0
- data/lib/akane_sound/class.background.rb +66 -0
- data/lib/akane_sound/class.element.rb +13 -0
- data/lib/akane_sound/class.input.rb +356 -0
- data/lib/akane_sound/class.section_dir.rb +108 -0
- data/lib/akane_sound/class.section_playlist.rb +87 -0
- data/lib/akane_sound/class.section_status.rb +223 -0
- data/lib/akane_sound/class.setup.rb +60 -0
- data/lib/akane_sound/class.sound.rb +381 -0
- data/lib/akane_sound/class.upper_section_base.rb +421 -0
- data/lib/akane_sound/class.view_base.rb +24 -0
- data/lib/akane_sound/module.util.rb +48 -0
- metadata +63 -0
@@ -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
|
+
|