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,108 @@
1
+ class SectionDir < UpperSectionBase
2
+ attr_accessor :focus_flag
3
+ def initialize(x, y, w, h, col)
4
+ @focus_flag = @@save_data[:focus_left]
5
+ if @@debug_flag
6
+ @dir = @@config[:root_dir_debug]
7
+ else
8
+ @dir = @@config[:root_dir]
9
+ end
10
+ @dir = @@save_data[:cur_dir] if @@save_data[:cur_dir]
11
+ @dir_stack = Array.new
12
+ @dir_stack.push @dir
13
+ @dir_stack = @@save_data[:dir_stack] if @@save_data[:dir_stack]
14
+ @tracks = 0
15
+ @playlist = Array.new
16
+ @playlist = set_playlist(@dir_stack.join(nil), false)
17
+ @tracks_played = 0
18
+ @playlist_state = nil
19
+ @cache_flag = false
20
+ @pointer = @@save_data[:pointer_left]
21
+ @page = @@save_data[:page_left]
22
+ @offset_left = 8
23
+ @offset_right = 4
24
+ @title = @dir
25
+ super
26
+ end
27
+
28
+ def update
29
+ super
30
+ if @focus_flag
31
+ if @@inp.refresh == 1
32
+ @pointer = 0
33
+ @playlist = set_playlist(@dir_stack.join(nil), true)
34
+ update_element_strings
35
+ set_page
36
+ update_element_positions
37
+ end
38
+ if @@inp.accept == 1
39
+ # play song :)
40
+ if !@playlist[@pointer][:dir_flag] && !@playlist[@pointer][:pl_flag]
41
+ @@sound.set_side("left")
42
+ @@sound.stop_track
43
+ @@sound.set_track(@pointer, true)
44
+ @@sound.start_track
45
+ end
46
+ # switch directory
47
+ if @playlist[@pointer][:dir_flag]
48
+ if @playlist[@pointer][:filename] == '../'
49
+ @dir_stack.pop
50
+ else
51
+ @dir_stack.push @playlist[@pointer][:filename]
52
+ end
53
+ @playlist = set_playlist(@dir_stack.join(nil), false)
54
+ @pointer = 0
55
+ @page = 1
56
+ @title = @dir_stack.join(nil)
57
+ @title = @@font.render_blended(@title, @txt_color)
58
+ @title_rect =
59
+ SDL2::Rect[8, @element_h/2-@title.h/2, @title.w, @title.h]
60
+ update_element_strings
61
+ set_page
62
+ update_element_positions
63
+ end
64
+ # set playlist
65
+ if @playlist[@pointer][:pl_flag]
66
+ @@sec_pl.set_playlist(File.join(@dir_stack.join(nil),
67
+ @playlist[@pointer][:filename]))
68
+ end
69
+ end
70
+ if @@inp.append == 1 || @@inp.append_r == 1
71
+ if !@playlist[@pointer][:pl_flag]
72
+ if @playlist[@pointer][:dir_flag]
73
+ if @@inp.append_r == 1
74
+ @@sec_pl.append(@playlist[@pointer], true, @dir_stack, true)
75
+ else
76
+ @@sec_pl.append(@playlist[@pointer], true, @dir_stack, false)
77
+ end
78
+ else
79
+ @@sec_pl.append(@playlist[@pointer], false, @dir_stack, false)
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ def update_size(x, y, w, h)
87
+ super
88
+ end
89
+
90
+ def draw
91
+ super
92
+ end
93
+
94
+ #return: Array of Hash { filename: , dir_flag:, duration: }
95
+ def set_playlist(dir, refresh)
96
+ set_status("Loading directory playlist from cache...")
97
+ ar = get_cache(dir)
98
+ if ar && !refresh
99
+ set_status("Playlist loaded.")
100
+ else
101
+ ar = get_playlist(dir)
102
+ set_status("Playlist set.")
103
+ end
104
+ @@sound.set_tmp_playlist(ar, "left", dir)
105
+ return ar
106
+ end
107
+
108
+ end
@@ -0,0 +1,87 @@
1
+ class SectionPlaylist < UpperSectionBase
2
+ attr_accessor :focus_flag, :playlist
3
+ def initialize(x, y, w, h, col)
4
+ @focus_flag = @@save_data[:focus_right]
5
+ unless @@save_data[:cur_pl]
6
+ @playlist = Array.new
7
+ else
8
+ @playlist = @@save_data[:cur_pl]
9
+ @@sound.set_tmp_playlist(@playlist, "right", "")
10
+ end
11
+ @pointer = @@save_data[:pointer_right]
12
+ @page = @@save_data[:page_right]
13
+ @offset_left = 4
14
+ @offset_right = 8
15
+ @title = "Playlist"
16
+ super
17
+ end
18
+
19
+ def update
20
+ super
21
+ if @focus_flag
22
+ if @@inp.accept == 1 && @playlist.length > 0
23
+ @@sound.set_side("right")
24
+ @@sound.stop_track
25
+ @@sound.set_track(@pointer, true)
26
+ @@sound.start_track
27
+ end
28
+ end
29
+ end
30
+
31
+ def update_size(x, y, w, h)
32
+ super
33
+ end
34
+
35
+ def draw
36
+ super
37
+ end
38
+
39
+ def append(track, dir_flag, dir_stack, recursive_flag)
40
+ dir = dir_stack.join(nil)
41
+ unless dir_flag
42
+ track[:filename] = File.join(dir, track[:filename])
43
+ @playlist.push(track)
44
+ else
45
+ #Util.p File.join(dir, track[:filename])
46
+ ar = get_cache(File.join(dir, track[:filename]))
47
+ ar = get_playlist(File.join(dir, track[:filename])) unless ar
48
+ @playlist += ar
49
+ if recursive_flag
50
+ #dir_stack.push(track[:filename])
51
+ stack_copy = Array.new(dir_stack)
52
+ stack_copy.push(track[:filename])
53
+ ar.each do |sel|
54
+ if sel[:dir_flag] && sel[:filename] != "../"
55
+ append(sel, true, stack_copy, true)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ @playlist = @playlist.select { |sel| !sel[:dir_flag] && !sel[:pl_flag] }
61
+ @@sound.set_tmp_playlist(@playlist, "right", dir)
62
+
63
+ update_element_strings
64
+ set_page
65
+ update_element_positions
66
+ end
67
+
68
+ def set_playlist(fn)
69
+ clear
70
+ @playlist = YAML.load(File.open(fn))
71
+ @@sound.set_tmp_playlist(@playlist, "right", "")
72
+ update_element_strings
73
+ set_page
74
+ update_element_positions
75
+ end
76
+
77
+ def clear
78
+ @playlist = Array.new
79
+ if (@@sound.state == "playing" || @@sound.state == "paused") &&
80
+ @@sound.side == "right"
81
+ @@sound.stop_track
82
+ end
83
+ update_element_strings
84
+ set_page
85
+ update_element_positions
86
+ end
87
+ end
@@ -0,0 +1,223 @@
1
+ class SectionStatus < ViewBase
2
+ attr_accessor :msg, :msg_rect
3
+ def initialize(x, y, w, h, col)
4
+ @txt_color = Util.to_col_ar(@@config[:text_color])
5
+ @vol_rect
6
+ @vol_texture
7
+ @vol_text_rect
8
+ @timer_passed_texture
9
+ @timer_passed_rect
10
+ @timer_total_texture
11
+ @timer_total_rect
12
+ @progress_bar_rect
13
+ @shuffle_on = @@font_bold.render_blended('[SHUFFLE]', @txt_color)
14
+ @shuffle_off = @@font.render_blended('[SHUFFLE]', @txt_color)
15
+ @repeat_on = @@font_bold.render_blended('[REPEAT]', @txt_color)
16
+ @repeat_off = @@font.render_blended('[REPEAT]', @txt_color)
17
+ @next_on = @@font_bold.render_blended('[NEXT]', @txt_color)
18
+ @next_off = @@font.render_blended('[NEXT]', @txt_color)
19
+ super
20
+ set_view
21
+ set_status("Welcome to Akane")
22
+ update_volume_rect
23
+ update_volume_texture
24
+ update_data
25
+ end
26
+
27
+ def update
28
+ if @@inp.pause == 1
29
+ @@sound.play_track
30
+ end
31
+ if @@inp.stop == 1
32
+ @@sound.stop_track
33
+ end
34
+ if @@inp.vol_down == 1 || @@inp.vol_down >= 20
35
+ @@sound.volume -= 1
36
+ if @@inp.vol_down == 22
37
+ @@inp.vol_down = 20
38
+ end
39
+ @@sound.volume = 0 if @@sound.volume < 0
40
+ update_volume_rect
41
+ update_volume_texture
42
+ @@sound.set_vol
43
+ end
44
+ if @@inp.vol_up == 1 || @@inp.vol_up >= 20
45
+ @@sound.volume += 1
46
+ if @@inp.vol_up == 22
47
+ @@inp.vol_up = 20
48
+ end
49
+ @@sound.volume = 128 if @@sound.volume > 128
50
+ update_volume_rect
51
+ update_volume_texture
52
+ @@sound.set_vol
53
+ end
54
+ if @@inp.toggle_shuffle == 1
55
+ @@sound.toggle_shuffle
56
+ end
57
+ if @@inp.toggle_repeat == 1
58
+ @@sound.toggle_repeat
59
+ end
60
+ if @@inp.toggle_next == 1
61
+ @@sound.toggle_next
62
+ end
63
+ if @@sound.state != "not playing"
64
+ if @@inp.next == 1
65
+ @@sound.skip("next", 1)
66
+ end
67
+ if @@inp.prev == 1
68
+ @@sound.skip("previous", 1)
69
+ end
70
+ end
71
+ update_timers
72
+ update_progress_bar
73
+ update_data
74
+ end
75
+
76
+ def update_size(x, y, w, h)
77
+ super
78
+ set_view
79
+ update_volume_rect
80
+ update_volume_texture
81
+ update_progress_bar
82
+ update_data
83
+ end
84
+
85
+ def draw
86
+ super
87
+ @@renderer.viewport = @view_base
88
+ @@renderer.fill_rect(SDL2::Rect[0, 0, @view_base.w, @view_base.h])
89
+
90
+ # draw status stuff
91
+ @@renderer.viewport = @view
92
+ @@renderer.copy(@@renderer.create_texture_from(@@msg), nil, @@msg_rect)
93
+ # draw volume
94
+ @@renderer.copy(@vol_texture, nil, @vol_text_rect)
95
+ if @@sound.volume < 101
96
+ @@renderer.draw_color = [@@config[:volume_bar_color][:red],
97
+ @@config[:volume_bar_color][:green],
98
+ @@config[:volume_bar_color][:blue],
99
+ @@config[:volume_bar_color][:alpha]]
100
+ else
101
+ @@renderer.draw_color = [@@config[:volume_bar_max_color][:red],
102
+ @@config[:volume_bar_max_color][:green],
103
+ @@config[:volume_bar_max_color][:blue],
104
+ @@config[:volume_bar_max_color][:alpha]]
105
+ end
106
+ @@renderer.fill_rect(@vol_rect)
107
+
108
+ # draw timers
109
+ @@renderer.copy(@timer_passed_texture, nil,
110
+ @timer_passed_rect)
111
+ @@renderer.copy(@timer_total_texture, nil,
112
+ @timer_total_rect)
113
+ # draw track info
114
+ # sampling rate
115
+ @@renderer.copy(@sampling_rate_texture, nil, @sampling_rate_rect)
116
+ # bps
117
+ @@renderer.copy(@bps_texture, nil, @bps_rect)
118
+ # draw flags
119
+ if @@sound.mode[:shuffle]
120
+ @@renderer.copy(@@renderer.create_texture_from(@shuffle_on), nil,
121
+ SDL2::Rect[210, 18, @shuffle_on.w, @shuffle_on.h])
122
+ else
123
+ @@renderer.copy(@@renderer.create_texture_from(@shuffle_off), nil,
124
+ SDL2::Rect[210, 18, @shuffle_off.w, @shuffle_off.h])
125
+ end
126
+ if @@sound.mode[:repeat]
127
+ @@renderer.copy(@@renderer.create_texture_from(@repeat_on), nil,
128
+ SDL2::Rect[210+@shuffle_on.w+2, 18,
129
+ @repeat_on.w, @repeat_on.h])
130
+ else
131
+ @@renderer.copy(@@renderer.create_texture_from(@repeat_off), nil,
132
+ SDL2::Rect[210+@shuffle_on.w+2, 18,
133
+ @repeat_off.w, @repeat_off.h])
134
+ end
135
+ if @@sound.mode[:next]
136
+ @@renderer.copy(@@renderer.create_texture_from(@next_on), nil,
137
+ SDL2::Rect[210+@shuffle_on.w+2+@repeat_on.w+2, 18,
138
+ @next_on.w, @next_on.h])
139
+ else
140
+ @@renderer.copy(@@renderer.create_texture_from(@next_off), nil,
141
+ SDL2::Rect[210+@shuffle_on.w+2+@repeat_on.w+2, 18,
142
+ @next_off.w, @next_off.h])
143
+ end
144
+
145
+ # draw progess bar
146
+ @@renderer.draw_color = [@@config[:prog_bar_color][:red],
147
+ @@config[:prog_bar_color][:green],
148
+ @@config[:prog_bar_color][:blue],
149
+ @@config[:prog_bar_color][:alpha]]
150
+ @@renderer.fill_rect(@progress_bar_rect)
151
+ end
152
+
153
+ private
154
+
155
+ def set_view
156
+ @view = SDL2::Rect[@view_base.x+8,
157
+ @view_base.y+8,
158
+ @view_base.w-16,
159
+ @view_base.h-16]
160
+ end
161
+
162
+ def update_progress_bar
163
+ @progress_bar_rect =
164
+ SDL2::Rect[0, 36, @view.w * @@sound.progress / 100, 20]
165
+ end
166
+
167
+ def update_data
168
+ if @@sound.state == "playing" || @@sound.state == "paused"
169
+ track = @@sound.get_track
170
+ str1 = "["+track[:sample]+"Hz]"
171
+ str2 = "["+(track[:bps]/1000).to_s+" kbps]"
172
+ else
173
+ str1 = "[]"
174
+ str2 = "[]"
175
+ end
176
+ sur = @@font.render_blended(str1, @txt_color)
177
+ @sampling_rate_texture = @@renderer.create_texture_from(sur)
178
+ @sampling_rate_rect = SDL2::Rect[84, 18, sur.w, sur.h]
179
+ sur.destroy
180
+ sur = @@font.render_blended(str2, @txt_color)
181
+ @bps_texture = @@renderer.create_texture_from(sur)
182
+ @bps_rect = SDL2::Rect[148, 18, sur.w, sur.h]
183
+ sur.destroy
184
+ end
185
+
186
+ def update_timers
187
+ if @@sound.state == "playing" || @@sound.state == "paused"
188
+ str1 = "["+Util.ms_to_time_str(@@sound.tstmp_play_cur)+"]"
189
+ track = @@sound.get_track
190
+ str2 = "["+track[:pl_time]+"]"
191
+ else
192
+ str1 = "[]"
193
+ str2 = "[]"
194
+ end
195
+ sur = @@font.render_blended(str1, @txt_color)
196
+ @timer_passed_texture = @@renderer.create_texture_from(sur)
197
+ @timer_passed_rect = SDL2::Rect[0, 18, sur.w, sur.h]
198
+ sur.destroy
199
+ sur = @@font.render_blended(str2, @txt_color)
200
+ @timer_total_texture = @@renderer.create_texture_from(sur)
201
+ @timer_total_rect = SDL2::Rect[42, 18, sur.w, sur.h]
202
+ sur.destroy
203
+ end
204
+
205
+ def update_volume_texture
206
+ int = @@sound.volume
207
+ str = int.to_s
208
+ str.prepend('0') if int < 100
209
+ str.prepend('0') if int < 10
210
+ str.prepend('Volume: ')
211
+ str += "%"
212
+ sur = @@font.render_blended(str, @txt_color)
213
+ @vol_texture = @@renderer.create_texture_from(sur)
214
+ @vol_text_rect = SDL2::Rect[@view.w-212, 18, sur.w, sur.h]
215
+ sur.destroy
216
+ end
217
+
218
+ def update_volume_rect
219
+ if @@msg_rect
220
+ @vol_rect = SDL2::Rect[@view.w-128, 18, @@sound.volume, @@msg_rect.h]
221
+ end
222
+ end
223
+ end
@@ -0,0 +1,60 @@
1
+ class Setup < AkaneSound
2
+ def self.init(arg)
3
+ @@pref_dir = SDL2.preference_path("ruby_app", "akane_sound")
4
+ if arg == "debug"
5
+ @@debug_flag = true
6
+ File.delete(File.open(@@pref_dir+'config.yaml')) if File.exist?(@@pref_dir+'config.yaml')
7
+ #File.delete(File.open(@@pref_dir+'save_data.yaml'))
8
+ end
9
+ str = (@@debug_flag) ? "cache_debug.yaml" : "cache.yaml"
10
+ if File.exist?(File.join(@@pref_dir, str))
11
+ @@cache = YAML.load(File.open(File.join(@@pref_dir, str)))
12
+ end
13
+ Setup::prepare_config
14
+ Setup::prepare_save_data
15
+ #Setup::prepare_binary_data('akane_bg.png')
16
+ #Setup::prepare_binary_data('NotoSansCJKjp-Regular.otf')
17
+ #Setup::prepare_binary_data('NotoSansCJKjp-Medium.otf')
18
+ #Setup::prepare_binary_data('NotoSansCJKjp-Bold.otf')
19
+ end
20
+
21
+ def self.prepare_config
22
+ unless File.file?(@@pref_dir+"config.yaml")
23
+ file = File.open("data/config.yaml", "r")
24
+ contents = file.read
25
+ file.close
26
+ #contents.sub! 'FILE_PATH_BG', @@pref_dir+'akane_bg.png'
27
+ #contents.sub! 'FILE_PATH_FONT_BIG', @@pref_dir+'NotoSansCJKjp-Medium.otf'
28
+ #contents.sub! 'FILE_PATH_FONT_BIG', @@pref_dir+'NotoSansCJKjp-Bold.otf'
29
+ #contents.sub! 'FILE_PATH_FONT', @@pref_dir+'NotoSansCJKjp-Regular.otf'
30
+ contents.sub! 'FILE_PATH_ROOT', Dir.home
31
+
32
+ File.open(@@pref_dir+'config.yaml', 'w') { |file| file.write(contents) }
33
+ @@config = YAML.load(File.open(@@pref_dir+'config.yaml'))
34
+ else
35
+ @@config = YAML.load(File.open(@@pref_dir+'config.yaml'))
36
+ end
37
+ @@config[:root_dir] += '/' unless @@config[:root_dir][-1] == '/'
38
+ end
39
+
40
+ def self.prepare_save_data
41
+ unless File.file?(@@pref_dir+"save_data.yaml")
42
+ file = File.open("data/save_data.yaml", "r")
43
+ contents = file.read
44
+ file.close
45
+
46
+ File.open(@@pref_dir+'save_data.yaml', 'w') do |file|
47
+ file.write(contents)
48
+ end
49
+ @@save_data = YAML.load(File.open(@@pref_dir+'save_data.yaml'))
50
+ else
51
+ @@save_data = YAML.load(File.open(@@pref_dir+'save_data.yaml'))
52
+ end
53
+ end
54
+
55
+ def self.prepare_binary_data(filename)
56
+ unless File.file?(@@pref_dir+filename)
57
+ Util.binary_copy(@@pref_dir, filename)
58
+ end
59
+ end
60
+ end