PUP Reverse Engineering - dekay/vpinball-wiki GitHub Wiki
Despite the incredible works of the developers so far, PUP Pack functionality in Visual Pinball Standalone has a ways to go yet before it reaches parity with its counterpart on Windows. This page attempts to bring together what is known about the closed-source PUP Pack format so far to aid in its reverse engineering effort.
Note
This is not a manual for making PuP packs. It is research for implementing PuP pack functionality on non-Windows systems.
Table of Contents
- Credits
- What Are Pup Packs and Where Are They Used
- Current Status
- Basics
-
Missing features and bugs
- General
- Missing functions
- Screen z-order
- Missing alpha support in videos
- Video overlays can cause video to stop playing
- No transparent background
- Multiple sounds playing
- Triggers on screens which are off
- Conflict vbscript/screens file
- Triggers skip same priority
- Label font scaled wrong
- Label which is an image
- Label animations
- Important Files
- Scripting API
This page was initally pulled together from various sources, so let's first give credit where it is due.
- PUP Pack Table Configuration from LegendsUnchained vpx-standalone-alp4k wiki. Their material is Apache licensed so presumably it is OK to pull it in here.
- VPX Standalone: Reverse Engineering PinUP Player gist created by @jsm174 with contributions from @francisdb
- PuP-Pack Research created by @francisdb
- Miscellaneous Discord discussions in the #vpx-standalone Discord channel
- Nailbuster's official PUP-Pack documentation
PuP Packs are a mix of media and metadata to render animated pinball table backbox screens for the Visual Pinball and Future Pinball ecosystems. The Windows PuP-Pack player is closed-source software written by NailBuster.
Several games are playable but not necessarily perfect. Many have missing video layers and labels with incorrect font sizes. jsm174 regularly tests with the following games:
- Batman 66
- Total Nuclear Annihilation
- Transformers
- Monster Bash
- Tron NEON
- Darkest Dungeon
- Futurama
To try a pup pack, you need to put the puppack folder (same name as the rom) in a pupvideos
folder in the tables external/vpx-table
folder. You'll also need to update the VBS file to set 'use pup packs' to true
for those tables where the PuP Pack is optional.
The system is very flexible and has a lot of options and therefore it is complex. If an option or feature is not implemented, a message is logged in the table log file. Look for the text "Not implemented" in the log for what is not implemented.
The following functions called from the vbscript on the pindisplay
object (CreateObject("PinUpPlayer.PinDisplay")) are not implemented yet. These are used rarely. The most used functions are implemented.
- playlistplay
- play
- playpause
- playresume
- setAspect
- setVolume
- SetLength
This is important for the order in which the screens lay on top of each other. There are screen options ForceBack
(set it to the back), ForceOn
(always on top, always visible) and ForcePop
(always on top, but only shown if media is played). There are more. Standalone sometimes messes up what should be in front/back. The only workaround is to play with the different options in the screen definitions to try to get it in the correct order.
Z-order in Visual Pinball Standalone is a bit counterintuitive. The z-order is more based on when videos start and stop, what goes into the background etc. In Windows, notice that you can move everything around separately and see that they are all physical windows. Standalone puts them all in the same window so there isn't all that overhead. (Reference)
Some items: PuPShapes is a special playlist where the following bmp would reside.
PuPShapes you put 24bit bmps files in there and the pixel color (0,0) will be used as a mask to make a see-through (transparent) shape.
The order in
screens.pup
is more important than thepupID (#)
. Screens are created in the order they appear in the csv file (not ordered by pupid#). But windows z-order/creation is different than how standalone is painting on one-canvas, so that needs to be looked at differently.
From follow-on discussion in that Github issue between @tocatta10 and @francisdb, it looks like standalone creates screens in the order of #pupid
instead of the order they appear in the csv file. So instead of storing them in a map by id they should be stored in a vector in the order of the screens file (or both if further lookup is a bottleneck).
@toccata10 goes into more details for other tables here on this issue for four tables: Gilligan's Island, Cactus Canyon, Flintstones, and Addams Family.
Gilligan's Island by classicradios
If you take the "Option 4 - Topper on BG No DMD", then no video will play on the topper, nor on the central part (background videos are playing). You need to change:
0,Topper,,,0,ForceBack,,"2,34.2,0.8,31.2,14.8"
to
0,Topper,,,0,ForceOn,,"2,34.2,0.8,31.2,14.8"
and
7,Other1/BackGlass2,,,0,ForcePopBack,,"2,23.5,16.3,54.0,69.5"
to
7,Other1/BackGlass2,,,0,ForcePop,,"2,23.5,16.3,54.0,69.5"
Then it plays well.
For Cactus Canyon, the layers are more complicated.
Option 1 - BG and DMD Separate
By default, most of the time it's a bluescreen. Replacing this line in the screens.pup:
12,"Backglass Videos",,,0,ForcePopBack,,"2,10.8,6.7,78.4,78.1"
with
12,"Backglass Videos",,,0,ForcePop,,"2,10.8,6.7,78.4,78.1"
And removing this line
16,"PupShapes Videos",,,0,ForcePop,,"2,0,0,100,100"
gives me the best results. There are 3 overlapping layers, so for example, a ball drain will trigger:
3,1,Ball_Drain,D1,12,Drain,,,20,,,,SkipSamePrty,0
54,1,Underlay_Drain,D1,14,PupUnderlays,Underlay_Drain.mp4,,20,,,,SkipSamePrty,0
100,1,PupShapes_Drain,D1,16,ShapesVideos,PupShapes_Drain.mp4,,20,,,,SkipSamePrty,0
With 3 and 54 only, it's ok. But with 100: it seems to be over the others.
Flinstones by radioclassics
Option 1 - BG, DMD, Topper By default, blue screen very often.
This is more or less the same as Cactus Canyon. So the best results were obtained by changing
7,Other1/BackGlass2,,,0,ForcePopBack,,"2,21.44,3.11,55.19,73.67"
to
7,Other1/BackGlass2,,,0,ForcePop,,"2,21.44,3.11,55.19,73.67"
Otherwise these central videos will play, but in the background (so sound, but no video will display because it's hidden by Underlay_Default.mp4
)
And remove 12,Shapes_Text,,,0,ForcePop,,"2,0,0,100,100"
because it appears below the Overlay_Default.png
but over the screen 11
defined by
11,Underlays,PupUnderlays,Underlay_Default.mp4,,ForceBack,,"2,0,0,100,100"
The screen 12
should be overlaying the letters as shown in this video.
Maybe those are old puppack and now, there are some new ways to create them, but it's fun to get them working. Main problem seems to be able to control which video is on top (specially when 3 of them are playing).
Option 1 - BG, DMD, Topper, change
13,"Backglass Videos",,,0,ForceBack,,"2,21.56,11.33,55.12,73.44"
to
13,"Backglass Videos",,,0,ForceOn,,"2,21.56,11.33,55.12,73.44"
in order to see some videos in the central part of the screen.
The Flintstones PuP Pack is currently broken, apparently because of missing alpha support in some cases. From @toccata10 in Discord: In the Flinstones puppack, "Animated_Text" videos are displayed in blue. Same goes for CactusCanyon "ShapesVideos_TEXT". I suppose the blue part should be rendered transparent ?". @nailbuster has confirmed that the pixel color (0,0) in 24bit BMPs is used as a mask to make a see-through (transparent) shape.
This is how it should look (Reference)
From @somatik on Discord: "There's also an existing issue where a overlay layer in front if the video layer can cause the video to stop playing. Seen this with trigger that have PlayAction (Loop) on SetBG
"
e.g. 1,1,Startup,D0,12,PuPOverlays,1.png,,1,,,,SetBG,0
NeedInfo: A reference to an example table would be useful here.
A pup screen always has a black background, but this can also be transparent (can generate performance issues?). This is a big problem when also the B2S is used, you get blinking in stead of two screens laying on top of each other. When you have the following construction in screens there are two problems:
ScreenNum,ScreenDes,PlayList,PlayFile,Loopit,Active,Priority,CustomPos<br>
2,Backglass,,,0,off,,<br>
11,"Backglass 2",bg,"Movie.mp4",0,ForceOn,,"2,19.5,17,60.9,58.5"
The backglass is turned off, but there is an extra screen 11 with custom position on screen 2 with forceon option. At the moment because in standalone the backglass is turned off everything is not displayed. This is incorrect, because of forceon screen 11 should be shown on a transparent backglass. This is a problem for example in Star Tours and in Tom and Jerry table/puppack combination. This can be fixed to replace off with show for screen 2, but then you have a black background.
There is a bug in the playstop function. Sometimes, e.g. a background music is playing on a music-only screen, when this function is called the music is not stopped, but keeps playing and when the loop option is set, this plays forever. This can also be the case when there is a stop trigger. If this is called from the script a workaround can be to disable the loop and force to play a sound with zero volume (fix used in Space Cadet Galaxy Edition).
A trigger on a screen which is turned off, is sometimes still played. For instance there is a topper screen which is turned off (this has to do with the different display layout you find in puppacks), but the media is still started. Solution is to remove the screens which are turned off and remove the triggers for this screen. But remember a screen can be turned on from the script and then it should not be removed, unless it is a screen which should not be used anyway (e.g. topper) but then also the script code has to be removed.
Sometimes there is a screens.pup
file but the same screens numbers are also created from the script. This gives in standalone a conflict and is handled wrong. The script should overrule the screens.pup
. A workaround is to conbine the options from the script in the screens.pup
file and remove the script calls.
In triggers you have the option SkipSamePrty
which means that if the new media has the same or lower priority as the currently playing media then the new one is skipped. This is for when there are multiple triggers to determine which one has to play and is the most important. At the moment the problem is in standalone that this should only be done if there is media playing, but in standalone this is also done if there is no media playing. This means you are missing triggers. A workaround is to remove the option, but then you get to many or the wrong one is playing. A better workaround is to play around with the priorities, but this is a lot of try and error. You also have to play the table a lot to test the triggers. I sometimes change the script to trigger the events quicker/more easy.
Sometimes it works, sometimes it does not. When a text is displayed with LabelSet function on a screen, which has a custom position,width and height, sometimes the font size is wrong. A scaling factor has to be applied. I have not found out yet when it works and when not. Workaround is to apply the font scaling factor (have to calculated by hand) in the script for all the LabelInit calls for this screen.
At the moment the labelset in standalone only accepts text. But this is not always the case, it can also be an image. For example:
PuPlayer.LabelSet 2,"InfoText","PuPOverlays\\\\info.png",1,"{'mt':2,'color':111111,'width':31,'height':8,'yalign':0,'ypos':0.0,'xpos':50.4 }"
At the moment the image name is displayed and not the image itself. Workaround is to remove the image name from the call to remove the text, but of course you are missing the image.
A label can also have animations (e.g. blinking or motion). This is done with a labelset
with the option mt:1
. This is not supported at the moment and difficult to emulate. For example:
PuPlayer.LabelSet 2,"Service","Blinking text", 1,"{'mt':1,'at':1,'fq':150,'len':1}"
These options are discarded but if the text is totally displayed wrong you have to change mt:1
into mt:2
and you probably have to add options (see mt:2
example above) to correct it. Of course you are missing the animation.
Pup packs are distributed as directories. Depending on the operating system and the flavour of pinball emulator you have to place them in a specific directory to be activated.
There are usually four main files that set up the PuP-Pack:
-
PinUpPlayer.ini
- This file includes master settings for all screens -
screens.pup
- Lists all screens and where they are displayed -
playlists.pup
- Media playlists -
triggers.pup
- Controls what is loaded where and when (can react to PinMAME events)
Older PuP Packs don't have these files and define this data at runtime in the table script.
Note
Most pup packs come with different .pup
files for different screen configurations. Check the .bat
files in the root of the pup pack to see what they do. Most of the time it's copying over .pup files from the PuP-Pack_Options/chosen_option
directory to the root of the pup pack.
Here's an example PinUpPlayer.ini
file:
[INFO]
ScreenXPos=4
ScreenYPos=7
ScreenWidth=500
ScreenHeight=125
volume=100
hidestopped=3
AspectWide=0
AspectHigh=0
fitToWindow=1
ScreenRotation=0
DebugMode=1
VideoDriver=0
FirstRun=0
[INFO1]
ScreenXPos=1400
ScreenYPos=302
ScreenWidth=512
ScreenHeight=128
volume=100
hidestopped=3
AspectWide=0
AspectHigh=0
fitToWindow=1
ScreenRotation=0
DebugMode=1
VideoDriver=0
FirstRun=0
.
.
[INFO10]
In VPX Standalone, these are in the VPinballX.ini
:
[Standalone]
PUP<Name>Screen =
PUP<Name>Window =
PUP<Name>WindowX =
PUP<Name>WindowY =
PUP<Name>WindowWidth =
PUP<Name>WindowHeight =
PUP<Name>WindowRotation =
Since all screens are supported, at this time, only the following can render physical windows:
Name | Screen |
---|---|
Topper | 0 |
Backglass | 2 |
DMD | 1 |
Playfield | 3 |
FullDMD | 5 |
If for example you needed to change the Topper
to screen 2
, you would have the entry:
[Standalone]
PUPTopperScreen = 2
This csv file sets the layout of screens:
ScreenNum,ScreenDes,PlayList,PlayFile,Loopit,Active,Priority,CustomPos
0,Topper,Topper,Topper_Frame1.mp4,0,ForceOn,,
1,DMD,,,0,off,,
2,Backglass,BGDefault,BG_Default1.mp4,0,ForceOn,,
3,PlayField,,,0,off,,
4,Music,,,0,off,,
5,Menu,,,0,off,,
6,Select,,,0,off,,
7,Other1/BackGlass2,,,0,off,,
8,Other2/Topper2,,,0,off,,
9,GameInfo,,,0,off,,
10,GameHelp,,,0,off,,
The headers in the csv do not appear to match the the PuP Pack Editor:
screens.pup | PuP Pack Editor |
---|---|
ScreenNum | ScreenNum |
ScreenDes | ScreenDes |
PlayList | Background Playlist |
PlayFile | Background Filename |
Loopit | Transparent |
Active | Mode |
Priority | Volume % |
CustomPos | CustomPos |
Question: What are values when the columns are empty? ex, volume% 100 or 0?
This csv file represents media playlists. Playlists are folders in pupvideos/<rom>
directory
ScreenNum,Folder,Des,AlphaSort,RestSeconds,Volume,Priority
0,Topper,,0,30,100,0
0,AttractMode,,0,30,100,0
0,BallDrain,,1,3,100,0
0,BGDefault,,0,30,100,5
0,ExtraBall,,0,30,100,0
0,MultiBall,,0,30,100,0
0,PuPOverlays,,0,30,100,0
0,RandomScoring,,0,30,100,0
0,ShootAgain,,0,30,100,0
0,SkillShot,,1,30,100,0
playlists.pup | PuP Pack Editor |
---|---|
ScreenNum | |
Folder | Folder (Playlist) |
Des | Description |
AlphaSort | Randomize |
RestSeconds | RestSeconds |
Volume | Volume |
Priority | Priority |
From PinUpPlayerReference.txt:
- playlists (unlimited) that are really just subfolders of your table root that contain videos.
- the PinUpPlayer(PUP) will manage playlists and shuffle them
-
RestSeconds
is what I use to 'limit' the amount of videos being played. So lets say you want a ramp video to play, but since I set it to 60... you can hit that ramp multiple times but no videos will play until therestSeconds
time has passed since last video played. - <Sort 1=shuffle, 0 = alpha> So if you want to progress game videos you could name the first one 001.mp4, 002.mp4...099.mp4 That way alpha sort will play in your order.
From PuP-Pack Editor v1.4 Help:
- AlphaSort: OFF=Random/shuffle, 1= alpha sort
- Priority (0..10): if another video is playing the one with higher prioirty 'wins'...
Question: What are values when the columns are empty? ex, volume% 100 or 0? Question: Are the files sorted by case sensitivity? ie: alpha1.png, bat1.png, Alpha2.png Note: I think I've seen really priorities way different than 0..10, maybe -1, and 60 (double check so not confusing this with volume, etc)
Update 03-31-2025:
- Confirmed with @nailbuster that PuP-Pack Editor v1.4 Help is incorrect about AlphaSort. The correct values are: Random=1, AlphaSort=0
This csv file represents triggers
ID,Active,Descript,Trigger,ScreenNum,PlayList,PlayFile,Volume,Priority,Length,Counter,RestSeconds,Loop,Defaults
2,1,Overlay_Frame,D0,2,PuPOverlays,Metal.png,,,,6,,,0
71,1,Creature1,D1,2,Creature,"Creature Surfacing.mp4",0,3,,,3,,0
4,1,Creature2,D2,2,Creature,"Creature Hand.mp4",0,3,,,3,,0
6,1,Creature3,D3,2,Creature,"Creature Swim2.mp4",0,3,,,3,,0
9,1,"Creature Feature",D4,2,"Creature_Creature Feature",,0,3,,,3,,0
10,1,"Creature Targets",D5,2,Creature,,0,3,,,3,,0
11,1,"Monster Torso",D6,2,Monster_Torso,,0,2,,,3,,0
triggers.pup | PuP Pack Editor |
---|---|
ID | |
Active | Active |
Descript | Descript |
Trigger | Trigger |
ScreenNum | Screen |
PlayList | Playlist |
PlayFile | PlayFile |
Volume | Volume |
Priority | Priority |
Counter | Counter |
RestSeconds | RestSeconds |
Loop | PlayAction |
Defaults |
From PinUpPlayerReference.txt:
- priority(0=none, 1..9) will override the restSeconds....so for a drain or something similar
- if filename="" then will play next file in playlist (don't have to specify filename, only playlist).
From PuP-Pack Editor v1.4 Help:
- Trigger example separate by ',' commas (unlimited triggers, but max 5 checks/trigger)
- if you don't put = then assumes '1'
- do *NOT use leading zeros like S04=1, its S4=1
- Counter=20 means it will 'FIRE' video every 20 triggers.
- loop will loop video until a new video is displayed.
- restseconds: will not repeat trigger until restseconds have passed. if you leave blank then will use playlist default.
Question: Does Counter 'FIRE' the very first time? or does it wait for 20 triggers? does restseconds factor into counter?
Virtual pinball tables also interact with the PuP-Pack player in their script. All examples below use VBScript
which is the scripting language in use by Visual Pinball.
Dim PuPlayer
Set PuPlayer = CreateObject("PinUpPlayer.PinDisplay")
PuPlayer.LabelNew pBackglass,"Play2score",numberfont, 5,0 ,0,0,1,55,85,1,0
PuPlayer.B2SData "E"&EventNum,1 'send event to Pup-Pack
...
Important
Thanks to @NailBuster himself for providing us with the latest PUPDMD framework documentation for v1.5 and allowing it inclusion on the wiki. "v1.4 is the older framework that is a bit different as well for older pupdmds)"
Earlier documentation for the various message types is provided in the subsections that follow.
TODO
All trigger PlayAction
types are documented on Nailbuster's wiki
Note
NailBuster thinks nobody should be using these calls directly. However, " many of the PuPDMD authors find it easy enough to just directly use the custom msg/json manually so you'll see them scattered around their table code as well." Some of these are implemented in Visual Pinball Standalone.
Example:
PuPlayer.SendMSG "{ 'mt':301, 'SN': 2, 'FN':15, 'CP':'99,15,15,70,70' }" 'custompos
JSON body but extended where properties can also be quoted with single quotes.
-
MT
= ??? (always 301?) -
SN
= screen number (seescreens.pup
orAddScreen
in script) -
FN
= function
Functions:
-
2
- ???Sub pDisableLoopRefresh(PuPID) PuPlayer.SendMSG "{ ""mt"":301, ""SN"": "&PuPID& ", ""FN"": 2, ""FF"":0, ""FO"":0 }" end Sub
-
3
- hide/show overlay text -{ "mt":301, "SN": XX, "FN":3, "OT": 0 }
- OT 0/1 overlay text on off boolsub pAllVisible(lvis) '0/1 to show hide pup text overlay and HUD PuPlayer.SendMSG "{ ""mt"":301, ""SN"": "& "5"& ",""OT"":"&lvis&", ""FN"": 3 }" 'hideoverlay text force end Sub
-
4
- set StayOnTop -{ "mt":301, "SN": XX, "FN":4, "FS":1/0 }
-
6
- bring screen to front{ "mt":301, "SN": XX, "FN":6 }
-
10
- set ??? volume{ "mt":301, "SN": XX, "FN":10, "VL":9}
VL=volume level -
11
- set screen sound volume 0-100"{ ""mt"":301, ""SN"": "&pMusic&", ""FN"":11, ""VL"":"&VolMusic&" }"
-
12
- STOPSCREEN{screenNum=18, screenDes=Apron Right, mode=PUP_SCREEN_MODE_FORCE_BACK}, fn=12, szMsg={ "mt":301, "SN": 18, "FN":12 }
-
15
- set screen custom position (relative positions in %){ 'mt':301, 'SN':15,'FN':15,'CP':'5,0,0,100,100'} ' show screen
{ 'mt':301, 'SN':15,'FN':15,'CP':'5,0,0,0,0'} ' Hide the screen
-
16
- launch executable - WT: Window Title{ ""mt"":301, ""SN"": 2, ""FN"":16, ""EX"": """&PuPMiniGameExe &""", ""WT"": """&PuPMiniGameTitle&""", ""RS"":1 , ""TO"":15 , ""WZ"":0 , ""SH"": 1 , ""FT"":""Visual Pinball Player"" }
{ ""mt"":301, ""SN"": 2, ""FN"":16, ""EX"": ""Pupinit.bat"", ""WT"": """", ""RS"":1 , ""TO"":15 , ""WZ"":0 , ""SH"": 1 , ""FT"":""Visual Pinball Player"" }
-
17
{ ""mt"":301, ""SN"": ""2"", ""FN"":17, ""WT"":""Visual Pinball Player"", ""WZ"": 1, ""WP"": 1 } - WT: Window Title / WZ: HWND_BOTTOM=1 / WP: SWP_NOSIZE=1Sub pResynchLayers() ' For desktop users this will force VPX to the back so pup is in front (Disabled since David has cut through working now) exit sub if bDesktop then ' WT: Window Title ' WZ: HWND_BOTTOM=1 ' WP: SWP_NOSIZE=1 PuPlayer.SendMSG "{ ""mt"":301, ""SN"": ""2"", ""FN"":17, ""WT"":""Visual Pinball Player"", ""WZ"": 1, ""WP"": 1 }" End if End Sub
-
20
-{ "mt":301, "SN"": XX, "FN":20, "AM": 1, "AV": 170 }
also related to transparency? -
22
- set transparencyPuPlayer.SendMSG "{ ""mt"":301, ""SN"": " & pTransp &", ""FN"":22, ""AM"":1, ""AV"":255 }" ' make opaque
PuPlayer.SendMSG "{ ""mt"":301, ""SN"": " & pTransp &", ""FN"":22, ""AM"":1, ""AV"":80 }" ' Make Transparent
-
30
- PUPDisplayAsJukebox -{'mt':301, 'SN': XX, 'FN':30, 'PM':1 }
'jukebox mode will auto advance to next media in playlist and you can use next/prior sub to manuall advance 'you should really have a specific pupid# display like musictrack that is only used for the playlist 'sub PUPDisplayAsJukebox(pupid) needs to be called/set prior to sending your first media to that pupdisplay. 'pupid=pupdiplay# like pMusic Sub PUPDisplayAsJukebox(pupid) PuPlayer.SendMSG("{'mt':301, 'SN': " & pupid & ", 'FN':30, 'PM':1 }") End Sub
-
31
- pup jukebox control -{'mt':301, 'SN': XX, 'FN':31, 'PM':1 }
- PM 1 = next, PM 2 = previousSub PuPlayListPrior(pupid) PuPlayer.SendMSG("{'mt':301, 'SN': " & pupid & ", 'FN':31, 'PM':1 }") End Sub Sub PuPlayListNext(pupid) PuPlayer.SendMSG("{'mt':301, 'SN': " & pupid & ", 'FN':31, 'PM':2 }") End Sub
-
32
- no antialias on font render{ "mt":301, "SN": 1, "FN":32, "FQ":3 }
FQ - font quality (3 = no aa?) -
33
- set pupdmd for mirror and hide behind other pups???"{ "mt":301, "SN": XX, "FN":33 }
-
34
- hideoverlay text during next videoplay on DMD auto return???{ "mt":301, "SN": XX, "FN": 34 }
-
41
- set safeloop mode on current playing media -{ "mt":301, "SN": XX, "FN":41 }
'set safeloop mode on current playing media. Good for background videos that refresh often? { "mt":301, "SN": XX, "FN":41 } Sub pSafeLoopModeCurrentVideo(PuPID) PuPlayer.SendMSG "{ ""mt"":301, ""SN"": "&PuPID& ", ""FN"": 41 }" end Sub
-
42
- duck audio volume -{ "mt":301, "SN": XX, "FN": 42, "DV": duck_volume , "ALL":1 }
ALL 1 = optionalSub AudioDuckPuP(MasterPuPID,VolLevel) 'will temporary volume duck all pups (not masterid) till masterid currently playing video ends. will auto-return all pups to normal. 'VolLevel is number, 0 to mute 99 for 99% PuPlayer.SendMSG "{ ""mt"":301, ""SN"": "& MasterPuPID& ", ""FN"": 42, ""DV"": "&VolLevel&" }" end Sub Sub AudioDuckPuPAll(MasterPuPID,VolLevel) 'will temporary volume duck all pups (not masterid) till masterid currently playing video ends. will auto-return all pups to normal. 'VolLevel is number, 0 to mute 99 for 99% PuPlayer.SendMSG "{ ""mt"":301, ""SN"": "& MasterPuPID& ", ""FN"": 42, ""DV"": "&VolLevel&" , ""ALL"":1 }" end Sub
-
45
- slow pc mode{ "mt":301, "SN":XX, "FN":45, "SP":1 }
- SP 0/1 = slow pc mode boolSub pSetLowQualityPc 'sets fulldmd to run in lower quality mode (slowpc mode) AAlevel for text is removed and other performance/quality items. default is always run quality, PuPlayer.SendMSG "{ ""mt"":301, ""SN"": 5, ""FN"":45, ""SP"":1 }" 'slow pc mode end Sub
-
46
- pad all text{ "mt":301, "SN": XX, "FN":46, "PA":1 }
- PA 0/1 = padd text boolSub pDMDAlwaysPAD 'will pad all text with a space before and after to help with possible text clipping. PuPlayer.SendMSG "{ ""mt"":301, ""SN"": XX, ""FN"":46, ""PA"":1 }" 'slow pc mode end Sub
-
50
- set aspect ratio{ "mt":301, ""SN": XX, "FN": 50, "WIDTH": arWidth, "HEIGHT": arHeight }
Sub pSetAspectRatio(PuPID, arWidth, arHeight) PuPlayer.SendMSG "{ ""mt"":301, ""SN"": "&PuPID& ", ""FN"": 50, ""WIDTH"": "&arWidth&", ""HEIGHT"": "&arHeight&" }" end Sub
-
51
- set media play position in ms{ "mt":301, "SN": XX, "FN":51, "SP": 3431}
- SP position in msSub pSetVideoPosMS(mPOS) 'set position of video/audio in ms, must be playing already or will be ignored. { "mt":301, "SN": XX, "FN":51, "SP": 3431} PuPlayer.SendMSG "{ ""mt"":301, ""SN"": "& "5"& ", ""FN"": 51, ""SP"":"&mPOS&" }" end Sub
-
52
- set text quality, anti aliassing (similar to 32?) -{ "mt":301, "SN": XX, "FN":52, "SC": aa_level }
SC 0-4 from low to highSub pDMDSetTextQuality(AALevel) '0 to 4 aa. 4 is sloooooower. default 1, perhaps use 2-3 if small desktop view. only affect text quality. can set per label too with 'qual' settings. PuPlayer.SendMSG "{ ""mt"":301, ""SN"": 5, ""FN"":52, ""SC"": "& AALevel &" }" 'slow pc mode end Sub
-
53
experimental frame rescale -Sub pForceFrameRescale(PuPID, fWidth, fHeight) 'Experimental, FORCE higher frame size to autosize and rescale nicer, like AA and auto-fit. PuPlayer.SendMSG "{ ""mt"":301, ""SN"": "&PuPID& ", ""FN"": 53, ""XW"": "&fWidth&", ""YH"": "&fHeight&", ""FR"":1 }" end Sub