Skip to content

Commit 69b1974

Browse files
committed
refactor
1 parent 8099c0b commit 69b1974

File tree

7 files changed

+134
-122
lines changed

7 files changed

+134
-122
lines changed

controls.lua

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@ local json = require( "json" )
33
local controls = { hovered = nil, active = nil }
44

55
function controls.generate( skin, settings )
6-
local models = { "mdl_amp" }
7-
if settings.session.show_eq and not settings.session.show_pl then
8-
table.insert( models, "mdl_eq" )
9-
elseif settings.session.show_pl and not settings.session.show_eq then
10-
table.insert( models, "mdl_pl" )
11-
elseif settings.session.show_pl and settings.session.show_eq then
12-
table.insert( models, "mdl_eq" )
13-
table.insert( models, "mdl_pl" )
14-
end
6+
-- local models = { "mdl_amp" }
7+
local models = { "mdl_amp", "mdl_eq", "mdl_pl" }
8+
-- if settings.session.show_eq and not settings.session.show_pl then
9+
-- table.insert( models, "mdl_eq" )
10+
-- elseif settings.session.show_pl and not settings.session.show_eq then
11+
-- table.insert( models, "mdl_pl" )
12+
-- elseif settings.session.show_pl and settings.session.show_eq then
13+
-- table.insert( models, "mdl_eq" )
14+
-- table.insert( models, "mdl_pl" )
15+
-- end
1516

1617
for m = 1, #models do
1718
local metadata = skin[ models[ m ] ]:getMetadata()
@@ -146,7 +147,7 @@ function controls.on_held()
146147
end
147148
end
148149

149-
function controls.sync( skin )
150+
function controls.sync( skin, settings )
150151
if timer_sync:get_elapsed() > 0.2 and not controls.active then
151152
timer_sync:reset()
152153
local hwnd = find_window( "Winamp v1.x", nil )
@@ -208,15 +209,19 @@ function controls.sync( skin )
208209
-- eq
209210
if is_window_visible( 0, hwnd ) then
210211
winamp_info.eq = 1
212+
settings.session.show_eq = true
211213
else
212214
winamp_info.eq = 0
215+
settings.session.show_eq = false
213216
end
214217

215218
-- pl
216219
if is_window_visible( 1, hwnd ) then
217220
winamp_info.pl = 1
221+
settings.session.show_pl = true
218222
else
219223
winamp_info.pl = 0
224+
settings.session.show_pl = false
220225
end
221226

222227
-- playing/paused/stopped
@@ -238,6 +243,24 @@ function controls.button_handler()
238243
local res = user32.PostMessageA( hwnd, ffi.C.WM_COMMAND, 40048, 0 )
239244
elseif controls.active == "amp_btn_prev" then
240245
local res = user32.PostMessageA( hwnd, ffi.C.WM_COMMAND, 40044, 0 )
246+
elseif controls.active == "amp_btn_eq" then
247+
local res = user32.SendMessageA( hwnd, ffi.C.WM_COMMAND, 40036, 0 );
248+
elseif controls.active == "amp_btn_pl" then
249+
local res = user32.SendMessageA( hwnd, ffi.C.WM_COMMAND, 40040, 0 );
250+
elseif controls.active == "amp_btn_shuffle" then
251+
if winamp_info.shuffle == 1 then
252+
winamp_info.shuffle = 0
253+
else
254+
winamp_info.shuffle = 1
255+
end
256+
local res = user32.PostMessageA( hwnd, ffi.C.WM_WA_IPC, winamp_info.shuffle, 252 )
257+
elseif controls.active == "amp_btn_repeat" then
258+
if winamp_info.repeatval == 1 then
259+
winamp_info.repeatval = 0
260+
else
261+
winamp_info.repeatval = 1
262+
end
263+
local res = user32.PostMessageA( hwnd, ffi.C.WM_WA_IPC, winamp_info.repeatval, 253 )
241264
elseif controls.active == "amp_btn_quit" then
242265
lovr.event.quit( 0 )
243266
end

globals.lua

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,10 @@ metrics = {
4242
feet_height = 0.01,
4343
stack_start_y = 0.18,
4444
stack_start_z = -0.7,
45-
-- btn_min = 0.173,
4645
btn_min = 0.175,
4746
btn_max = 0.177,
4847
pixel_density_title = 1.2,
49-
pixel_density_kbps = 1.4,
50-
pixel_density_khz = 1.4,
48+
pixel_density_small_lcd = 1.4,
5149
pixel_density_monostereo = 1.4,
5250
ppm = 2000
5351
}
@@ -164,6 +162,6 @@ function create_sa_frames( skin )
164162

165163
for i = 1, 19 do
166164
table.insert( skin.sa_bars.data, 14 )
167-
table.insert( skin.sa_bars.peak, { y = 1, frames = 0 } )
165+
table.insert( skin.sa_bars.peaks, { y = 1, frames = 0 } )
168166
end
169167
end

main.lua

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,15 @@ function lovr.update( dt )
3434
end
3535

3636
for i = 1, 19 do
37-
if skin.sa_bars.peak[ i ].y < skin.sa_bars.data[ i ] then
38-
skin.sa_bars.peak[ i ].y = skin.sa_bars.data[ i ]
39-
skin.sa_bars.peak[ i ].frames = 0
37+
if skin.sa_bars.peaks[ i ].y < skin.sa_bars.data[ i ] then
38+
skin.sa_bars.peaks[ i ].y = skin.sa_bars.data[ i ]
39+
skin.sa_bars.peaks[ i ].frames = 0
4040
else
41-
skin.sa_bars.peak[ i ].frames = skin.sa_bars.peak[ i ].frames + dt
41+
skin.sa_bars.peaks[ i ].frames = skin.sa_bars.peaks[ i ].frames + dt
4242
end
4343

44-
if skin.sa_bars.peak[ i ].frames > 0.82 then
45-
skin.sa_bars.peak[ i ].y = skin.sa_bars.peak[ i ].y - 10 * dt
44+
if skin.sa_bars.peaks[ i ].frames > 0.82 then
45+
skin.sa_bars.peaks[ i ].y = skin.sa_bars.peaks[ i ].y - 10 * dt
4646
end
4747
end
4848
end
@@ -69,7 +69,7 @@ function lovr.update( dt )
6969

7070
controls.on_released()
7171
controls.on_held()
72-
controls.sync( skin )
72+
controls.sync( skin, settings )
7373
end
7474

7575
function lovr.draw( pass )

render.lua

Lines changed: 88 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -30,45 +30,89 @@ function render.stack( pass )
3030
if winamp_info.repeatval == 1 then render.led( pass, "amp_led_repeat" ) end
3131

3232
-- color sliders
33-
-- NOTE Add EQ sliders
3433
render.tint_slider( pass, "amp_slider_vol", "amp_slider_vol_bg" )
3534
render.tint_slider( pass, "amp_slider_pan", "amp_slider_pan_bg" )
3635

37-
-- NOTE test render khz
38-
font:setPixelDensity( metrics.pixel_density_khz )
39-
local x, y, z = controls[ "amp_lcd_khz_bg" ].pos:unpack()
40-
local dx, dy, dz = controls[ "amp_lcd_khz_bg" ].dim:unpack()
41-
local tex = controls[ "amp_lcd_khz_bg" ].tex
42-
local tex_pass = controls[ "amp_lcd_khz_bg" ].pass
36+
-- small lcds
37+
render.small_lcd( pass, "amp_lcd_khz_bg", winamp_info.track_khz )
38+
render.small_lcd( pass, "amp_lcd_kbps_bg", winamp_info.track_kbps )
4339

44-
tex_pass:reset()
45-
tex_pass:setProjection( 1, mat4():orthographic( tex_pass:getDimensions() ) )
46-
tex_pass:setColor( 0, 1, 0, 1 )
47-
local tdx, tdy = tex:getDimensions()
48-
tex_pass:text( tostring( winamp_info.track_khz ), tdx / 2, tdy / 2, 0, 1 )
49-
pass:setMaterial( tex )
40+
-- track lcd
41+
render.track_lcd( pass )
42+
43+
-- mono/stereo labels
44+
font:setPixelDensity( metrics.pixel_density_monostereo )
45+
local col1, col2 = { 0.8, 0.8, 0.8 }, { 0, 1, 0 }
46+
if winamp_info.mono_stereo == 1 then
47+
col1, col2 = col2, col1
48+
end
49+
50+
render.label( pass, "amp_label_mono", col1, "mono" )
51+
render.label( pass, "amp_label_stereo", col2, "stereo" )
52+
53+
-- main lcd
54+
render.main_lcd(pass)
55+
end
56+
57+
function render.led( pass, led_id )
58+
local parent = controls[ led_id ].parent
59+
local x, y, z = controls[ led_id ].pos:unpack()
60+
local px, py, pz = controls[ parent ].model:getNodePosition( parent )
61+
local dx, dy, dz = controls[ led_id ].dim:unpack()
62+
pass:setColor( 0, 1, 0 )
63+
pass:plane( x, y, pz + 0.0026, dx, dy )
64+
end
65+
66+
function render.tint_slider( pass, slider_id, bg_id )
67+
local min = controls[ slider_id ].min
68+
local max = controls[ slider_id ].max
69+
local val, y, z = controls[ slider_id ].model:getNodePosition( slider_id )
70+
local t = (val - min) / (max - min)
71+
72+
if slider_id == "amp_slider_pan" then
73+
t = math.abs( 2 * t - 1 );
74+
end
75+
76+
local R = t
77+
local G = 1 - t
78+
local B = 0
79+
80+
81+
local x, y, z = controls[ bg_id ].pos:unpack()
82+
local dx, dy, dz = controls[ bg_id ].dim:unpack()
83+
pass:setColor( R, G, B, 1 )
5084
pass:plane( x, y, z + 0.001, dx, dy )
51-
pass:setMaterial()
52-
passes[ #passes + 1 ] = tex_pass
85+
pass:setColor( 1, 1, 1, 1 )
86+
end
87+
88+
function render.set_environment( pass )
89+
pass:setFaceCull( "back" )
90+
pass:setBlendMode()
91+
pass:skybox( skybox )
92+
pass:setShader( shader )
93+
pass:send( "cubemap", environmentMap )
94+
pass:send( "sphericalHarmonics", sphericalHarmonics )
95+
end
5396

54-
-- NOTE test render kbps
55-
font:setPixelDensity( metrics.pixel_density_kbps )
56-
local x, y, z = controls[ "amp_lcd_kbps_bg" ].pos:unpack()
57-
local dx, dy, dz = controls[ "amp_lcd_kbps_bg" ].dim:unpack()
58-
local tex = controls[ "amp_lcd_kbps_bg" ].tex
59-
local tex_pass = controls[ "amp_lcd_kbps_bg" ].pass
97+
function render.small_lcd( pass, id, info )
98+
font:setPixelDensity( metrics.pixel_density_small_lcd )
99+
local x, y, z = controls[ id ].pos:unpack()
100+
local dx, dy, dz = controls[ id ].dim:unpack()
101+
local tex = controls[ id ].tex
102+
local tex_pass = controls[ id ].pass
60103

61104
tex_pass:reset()
62105
tex_pass:setProjection( 1, mat4():orthographic( tex_pass:getDimensions() ) )
63106
tex_pass:setColor( 0, 1, 0, 1 )
64107
local tdx, tdy = tex:getDimensions()
65-
tex_pass:text( tostring( winamp_info.track_kbps ), tdx / 2, tdy / 2, 0, 1 )
108+
tex_pass:text( tostring( info ), tdx / 2, tdy / 2, 0, 1 )
66109
pass:setMaterial( tex )
67110
pass:plane( x, y, z + 0.001, dx, dy )
68111
pass:setMaterial()
69112
passes[ #passes + 1 ] = tex_pass
113+
end
70114

71-
-- NOTE test get song title
115+
function render.track_lcd( pass )
72116
local hwnd = find_window( "Winamp v1.x", nil )
73117
local text_length = user32.GetWindowTextLengthA( hwnd )
74118
local buffer_size = text_length + 1
@@ -108,43 +152,10 @@ function render.stack( pass )
108152
pass:plane( x, y, z + 0.001, dx, dy )
109153
pass:setMaterial()
110154
passes[ #passes + 1 ] = tex_pass
155+
end
111156

112-
-- NOTE test render label
113-
font:setPixelDensity( metrics.pixel_density_monostereo )
114-
local col1, col2 = { 0.8, 0.8, 0.8 }, { 0, 1, 0 }
115-
if winamp_info.mono_stereo == 1 then
116-
col1, col2 = col2, col1
117-
end
118-
119-
local x1, y1, z1 = controls[ "amp_label_mono" ].pos:unpack()
120-
local dx1, dy1, dz1 = controls[ "amp_label_mono" ].dim:unpack()
121-
local tex1 = controls[ "amp_label_mono" ].tex
122-
local tex_pass1 = controls[ "amp_label_mono" ].pass
123-
tex_pass1:reset()
124-
tex_pass1:setProjection( 1, mat4():orthographic( tex_pass1:getDimensions() ) )
125-
tex_pass1:setColor( col1 )
126-
local tdx1, tdy1 = tex1:getDimensions()
127-
tex_pass1:text( "mono", tdx1 / 2, tdy1 / 2, 0, 1 )
128-
129-
local x2, y2, z2 = controls[ "amp_label_stereo" ].pos:unpack()
130-
local dx2, dy2, dz2 = controls[ "amp_label_stereo" ].dim:unpack()
131-
local tex2 = controls[ "amp_label_stereo" ].tex
132-
local tex_pass2 = controls[ "amp_label_stereo" ].pass
133-
tex_pass2:reset()
134-
tex_pass2:setProjection( 1, mat4():orthographic( tex_pass2:getDimensions() ) )
135-
tex_pass2:setColor( col2 )
136-
local tdx2, tdy2 = tex2:getDimensions()
137-
tex_pass2:text( "stereo", tdx2 / 2, tdy2 / 2, 0, 1 )
138-
139-
pass:setBlendMode( "alpha" )
140-
pass:setShader()
141-
pass:draw( tex1, x1, y1, z1 + 0.001, dx1 )
142-
passes[ #passes + 1 ] = tex_pass1
143-
pass:draw( tex2, x2, y2, z2 + 0.001, dx2 )
144-
passes[ #passes + 1 ] = tex_pass2
145-
146-
-- NOTE test render main LCD
147-
-- font:setPixelDensity( 1 )
157+
function render.main_lcd( pass )
158+
-- font:setPixelDensity( 1 )
148159
local x, y, z = controls[ "amp_lcd_main_bg" ].pos:unpack()
149160
local dx, dy, dz = controls[ "amp_lcd_main_bg" ].dim:unpack()
150161
local tex = controls[ "amp_lcd_main_bg" ].tex
@@ -176,19 +187,19 @@ function render.stack( pass )
176187
end
177188

178189
if winamp_info.playing_state == 1 or winamp_info.playing_state == 3 then
179-
-- NOTE test render bars
190+
-- render bars and peaks
180191
tex_pass:setColor( 1, 1, 1, 1 )
181192

182193
local xoff = 58
183194
local yoff = 0
184-
local peak_y = 0
195+
local peaks_y = 0
185196
for i = 1, 19 do
186197
local val = skin.sa_bars.data[ i ]
187198
tex_pass:setMaterial( skin.sa_bars[ val ] )
188199
tex_pass:plane( xoff, 116, 0, 12, 56 )
189200

190-
peak_y = skin.sa_bars.peak[ i ].y
191-
yoff = map_range( 1, 14, 144, 88, peak_y )
201+
peaks_y = skin.sa_bars.peaks[ i ].y
202+
yoff = map_range( 1, 14, 144, 88, peaks_y )
192203
tex_pass:setMaterial()
193204
tex_pass:setColor( 0.59, 0.59, 0.59, 1 )
194205
tex_pass:plane( xoff, yoff, 0, 12, 4 )
@@ -201,44 +212,21 @@ function render.stack( pass )
201212
passes[ #passes + 1 ] = tex_pass
202213
end
203214

204-
function render.led( pass, led_id )
205-
local parent = controls[ led_id ].parent
206-
local x, y, z = controls[ led_id ].pos:unpack()
207-
local px, py, pz = controls[ parent ].model:getNodePosition( parent )
208-
local dx, dy, dz = controls[ led_id ].dim:unpack()
209-
pass:setColor( 0, 1, 0 )
210-
pass:plane( x, y, pz + 0.0026, dx, dy )
211-
end
212-
213-
function render.tint_slider( pass, slider_id, bg_id )
214-
local min = controls[ slider_id ].min
215-
local max = controls[ slider_id ].max
216-
local val, y, z = controls[ slider_id ].model:getNodePosition( slider_id )
217-
local t = (val - min) / (max - min)
218-
219-
if slider_id == "amp_slider_pan" then
220-
t = math.abs( 2 * t - 1 );
221-
end
222-
223-
local R = t
224-
local G = 1 - t
225-
local B = 0
226-
227-
228-
local x, y, z = controls[ bg_id ].pos:unpack()
229-
local dx, dy, dz = controls[ bg_id ].dim:unpack()
230-
pass:setColor( R, G, B, 1 )
231-
pass:plane( x, y, z + 0.001, dx, dy )
232-
pass:setColor( 1, 1, 1, 1 )
233-
end
215+
function render.label( pass, id, col, str )
216+
local x, y, z = controls[ id ].pos:unpack()
217+
local dx, dy, dz = controls[ id ].dim:unpack()
218+
local tex = controls[ id ].tex
219+
local tex_pass = controls[ id ].pass
220+
tex_pass:reset()
221+
tex_pass:setProjection( 1, mat4():orthographic( tex_pass:getDimensions() ) )
222+
tex_pass:setColor( col )
223+
local tdx, tdy = tex:getDimensions()
224+
tex_pass:text( str, tdx / 2, tdy / 2, 0, 1 )
234225

235-
function render.set_environment( pass )
236-
pass:setFaceCull( "back" )
237-
pass:setBlendMode()
238-
pass:skybox( skybox )
239-
pass:setShader( shader )
240-
pass:send( "cubemap", environmentMap )
241-
pass:send( "sphericalHarmonics", sphericalHarmonics )
226+
pass:setBlendMode( "alpha" )
227+
pass:setShader()
228+
pass:draw( tex, x, y, z + 0.001, dx )
229+
passes[ #passes + 1 ] = tex_pass
242230
end
243231

244232
return render

settings.lua

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ function settings.load()
2424
else
2525
settings.session = json.decode( contents )
2626
end
27+
28+
-- TODO on settings load query if winamp has eq/pl visible, then send commands to respect launch settings
29+
-- also, save settings on exit or immediately?
2730
end
2831

2932
return settings

skin.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ function skin.load()
1010
skin.mdl_pl = lovr.graphics.newModel( "skins/" .. settings.session.skin .. "/pl.glb" )
1111

1212
local texture = lovr.graphics.newTexture( "skins/" .. settings.session.skin .. "/sa_bars.png", { mipmaps = false } )
13-
skin.sa_bars = { texture = texture, data = {}, peak = {} }
13+
skin.sa_bars = { texture = texture, data = {}, peaks = {} }
1414
end
1515

1616
return skin

skins/classic/amp.glb

10.4 KB
Binary file not shown.

0 commit comments

Comments
 (0)