@@ -29,7 +29,6 @@ local user_opts = {
29
29
-- internal track list management (and some
30
30
-- functions that depend on it)
31
31
font = ' mpv-osd-symbols' , -- default osc font
32
- seekbarhandlesize = 1.0 , -- size ratio of the slider handle, range 0 ~ 1
33
32
seekrange = true , -- show seekrange overlay
34
33
seekrangealpha = 128 , -- transparency of seekranges
35
34
seekbarkeyframes = true , -- use keyframes when dragging the seekbar
@@ -40,6 +39,7 @@ local user_opts = {
40
39
visibility = ' auto' , -- only used at init to set visibility_mode(...)
41
40
windowcontrols = ' auto' , -- whether to show window controls
42
41
volumecontrol = true , -- whether to show mute button and volumne slider
42
+ processvolume = true , -- volue slider show processd volume
43
43
language = ' eng' , -- eng=English, chs=Chinese
44
44
}
45
45
@@ -135,7 +135,9 @@ local state = {
135
135
maximized = false ,
136
136
osd = mp .create_osd_overlay (' ass-events' ),
137
137
mute = false ,
138
- lastvisibility = user_opts .visibility , -- save last visibility on pause if showtitle
138
+ lastvisibility = user_opts .visibility , -- save last visibility on pause if showtitle
139
+ sys_volume , -- system volume
140
+ proc_volume , -- processed volume
139
141
}
140
142
141
143
local window_control_box_width = 138
@@ -324,7 +326,14 @@ function ass_draw_rr_h_ccw(ass, x0, y0, x1, y1, r1, hexagon, r2)
324
326
end
325
327
end
326
328
327
-
329
+ -- set volume
330
+ function set_volume (val )
331
+ if user_opts .processvolume then
332
+ val = 10 * math.sqrt (val )
333
+ end
334
+ mp .commandv (' set' , ' volume' , val )
335
+ mp .commandv (' add' , ' volume' , 0 ) -- this prevent volume exceeds limit
336
+ end
328
337
--
329
338
-- Tracklist Management
330
339
--
@@ -485,7 +494,7 @@ function prepare_elements()
485
494
-- draw static slider parts
486
495
local slider_lo = element .layout .slider
487
496
-- calculate positions of min and max points
488
- element .slider .min .ele_pos = user_opts . seekbarhandlesize * elem_geo .h / 2
497
+ element .slider .min .ele_pos = elem_geo .h / 2
489
498
element .slider .max .ele_pos = elem_geo .w - element .slider .min .ele_pos
490
499
element .slider .min .glob_pos = element .hitbox .x1 + element .slider .min .ele_pos
491
500
element .slider .max .glob_pos = element .hitbox .x1 + element .slider .max .ele_pos
@@ -584,16 +593,16 @@ function render_elements(master_ass)
584
593
local s_max = element .slider .max .value
585
594
-- draw pos marker
586
595
local pos = element .slider .posF ()
587
- local seekRanges = element . slider . seekRangesF ()
588
- local rh = user_opts . seekbarhandlesize * elem_geo .h / 2 -- Handle radius
596
+ local seekRanges
597
+ local rh = elem_geo .h / 2 -- Handle radius
589
598
local xp
590
599
591
600
if pos then
592
601
xp = get_slider_ele_pos_for (element , pos )
593
602
ass_draw_cir_cw (elem_ass , xp , elem_geo .h / 2 , rh )
594
603
elem_ass :rect_cw (0 , slider_lo .gap , xp , elem_geo .h - slider_lo .gap )
595
604
end
596
-
605
+ if element . slider . seekRangesF ~= nil then seekRanges = element . slider . seekRangesF () end
597
606
if seekRanges then
598
607
elem_ass :draw_stop ()
599
608
elem_ass :merge (element .style_ass )
@@ -991,8 +1000,9 @@ layouts = function ()
991
1000
add_area (' input' , get_hitbox_coords (posX , posY , 1 , osc_geo .w , 104 ))
992
1001
993
1002
-- area for show/hide
994
- add_area (' showhide' , 0 , 0 , osc_param .playresx , osc_param .playresy )
995
-
1003
+ add_area (' showhide' , 0 , osc_param .playresy - 200 , osc_param .playresx , osc_param .playresy )
1004
+ add_area (' showhide_wc' , osc_param .playresx * 0.67 , 0 , osc_param .playresx , 48 )
1005
+
996
1006
-- fetch values
997
1007
local osc_w , osc_h =
998
1008
osc_geo .w , osc_geo .h
@@ -1380,7 +1390,23 @@ function osc_init()
1380
1390
ne .slider .tooltipF = function (pos )
1381
1391
local duration = mp .get_property_number (' duration' , nil )
1382
1392
if not ((duration == nil ) or (pos == nil )) then
1383
- possec = duration * (pos / 100 )
1393
+ local possec = duration * (pos / 100 )
1394
+ local chapters = mp .get_property_native (' chapter-list' , {})
1395
+ if # chapters > 0 then
1396
+ local ch = # chapters
1397
+ local i
1398
+ for i = 1 , # chapters do
1399
+ if chapters [i ].time / duration * 100 >= pos then
1400
+ ch = i - 1
1401
+ break
1402
+ end
1403
+ end
1404
+ if ch == 0 then
1405
+ return string.format (' [%s] [0/%d]' , mp .format_time (possec ), # chapters )
1406
+ elseif chapters [ch ].title then
1407
+ return string.format (' [%s] [%d/%d][%s]' , mp .format_time (possec ), ch , # chapters , chapters [ch ].title )
1408
+ end
1409
+ end
1384
1410
return mp .format_time (possec )
1385
1411
else
1386
1412
return ' '
@@ -1462,38 +1488,52 @@ function osc_init()
1462
1488
ne = new_element (' volumebar' , ' slider' )
1463
1489
ne .visible = (osc_param .playresx >= 700 ) and user_opts .volumecontrol
1464
1490
ne .enabled = (get_track (' audio' )> 0 )
1465
- ne .slider .markerF = function ()
1466
- return {}
1467
- end
1468
- ne .slider .seekRangesF = function ()
1469
- return nil
1470
- end
1491
+ ne .slider .tooltipF =
1492
+ function (pos )
1493
+ local refpos = state .proc_volume
1494
+ if refpos > 100 then refpos = 100 end
1495
+ if pos + 3 >= refpos and pos - 3 <= refpos then
1496
+ return string.format (' %d' , state .proc_volume )
1497
+ else
1498
+ return ' '
1499
+ end
1500
+ end
1501
+ ne .slider .markerF = nil
1502
+ ne .slider .seekRangesF = nil
1471
1503
ne .slider .posF =
1472
1504
function ()
1473
- local val = mp .get_property_number (' volume' , nil )
1474
- return val * val / 100
1505
+ return state .proc_volume
1475
1506
end
1476
1507
ne .eventresponder [' mouse_move' ] =
1477
1508
function (element )
1478
- if not element .state .mbtnleft then return end -- allow drag for mbtnleft only!
1509
+ if not element .state .mbtnleft then return end
1479
1510
local seekto = get_slider_value (element )
1480
1511
if (element .state .lastseek == nil ) or
1481
1512
(not (element .state .lastseek == seekto )) then
1482
- mp . commandv ( ' set ' , ' volume ' , 10 * math.sqrt ( seekto ) )
1513
+ set_volume ( seekto )
1483
1514
element .state .lastseek = seekto
1484
1515
end
1485
1516
end
1486
1517
ne .eventresponder [' mbtn_left_down' ] = -- exact seeks on single clicks
1487
1518
function (element )
1488
1519
local seekto = get_slider_value (element )
1489
- mp . commandv ( ' set ' , ' volume ' , 10 * math.sqrt ( seekto ) )
1520
+ set_volume ( seekto )
1490
1521
element .state .mbtnleft = true
1491
1522
end
1492
1523
ne .eventresponder [' mbtn_left_up' ] =
1493
- function (element ) element .state .mbtnleft = false end
1524
+ function (element )
1525
+ element .state .mbtnleft = false
1526
+ end
1494
1527
ne .eventresponder [' reset' ] =
1495
1528
function (element ) element .state .lastseek = nil end
1496
-
1529
+ ne .eventresponder [' wheel_up_press' ] =
1530
+ function (element )
1531
+ set_volume (state .proc_volume + 5 )
1532
+ end
1533
+ ne .eventresponder [' wheel_down_press' ] =
1534
+ function (element )
1535
+ set_volume (state .proc_volume - 5 )
1536
+ end
1497
1537
-- tc_left (current pos)
1498
1538
ne = new_element (' tc_left' , ' button' )
1499
1539
ne .content = function () return (mp .get_property_osd (' playback-time' )) end
@@ -1576,7 +1616,7 @@ function pause_state(name, enabled)
1576
1616
if user_opts .showtitle then
1577
1617
if enabled then
1578
1618
state .lastvisibility = user_opts .visibility
1579
- visibility_mode (" always" , true )
1619
+ visibility_mode (' always' , true )
1580
1620
show_osc ()
1581
1621
else
1582
1622
visibility_mode (state .lastvisibility , true )
@@ -2005,6 +2045,16 @@ mp.observe_property('mute', 'bool',
2005
2045
state .mute = val
2006
2046
end
2007
2047
)
2048
+ mp .observe_property (' volume' , ' number' ,
2049
+ function (name , val )
2050
+ state .sys_volume = val
2051
+ if user_opts .processvolume then
2052
+ state .proc_volume = val * val / 100
2053
+ else
2054
+ state .proc_volume = val
2055
+ end
2056
+ end
2057
+ )
2008
2058
mp .observe_property (' border' , ' bool' ,
2009
2059
function (name , val )
2010
2060
state .border = val
@@ -2098,7 +2148,7 @@ function visibility_mode(mode, no_osd)
2098
2148
elseif mode == ' never' then
2099
2149
enable_osc (false )
2100
2150
else
2101
- msg .warn (' Ignoring unknown visibility mode \" ' .. mode .. ' \" ' )
2151
+ msg .warn (' Ignoring unknown visibility mode \' ' .. mode .. ' \' ' )
2102
2152
return
2103
2153
end
2104
2154
0 commit comments