More Reviews




Authoring a setup menu with conditional resume play in DVD Studio Pro 3

September, 2004



Setup and Resume
Authoring a setup menu with conditional resume play in DVD Studio Pro 3


by: Alex Alexzander


The purpose of this tutorial is to illustrate how to create a setup menu that allows the user to activate varying audio streams and subtitle streams as well as to turn off subtitles. In addition, our setup menu will feature a special resume function. The special feature here is that our resume play is going to first check to see if a track can be resumed, and if so it will resume play of that track; otherwise, the resume function will simply take the user to the main menu from the setup menu.

Selecting audio and subtitles has been simplified in this tutorial so that scripting these two aspects will not be needed. However, we will go over how to script the special resume function in order to give your project a more professional feel.

We'll go over three registers.

1. SPRM 8 (Menu selections parameter).
2. GPRM 0 (User defined - menu selection processing and SPRM 8 conversion for GPRM-based menu buttons).
3. GPRM 1 (Used to determine whether the resume function will resume play or go to a selected menu).

GPRM 1 will be used to serve two functions:

1. GPRM 1 = 0 means a track has finished playing or has not played.
2. GPRM 1 = 1 means a track is in progress, but has been interrupted.

Project Structure

Main Menu

The Main Menu of this project has been designed in such a way as to keep tabs on when a track has been asked to play. We do this through the use of scripts. Take a look at the image below. You will see that the Main Menu points to a script called "play track" as well as the setup menu called, "Setup Menu".

In turn, the script "play track" points to three track assets called "Track 1", "Track 2", and "Track 3".

As you can see looking at the image of the Main Menu asset, I have four buttons. You would correctly assume that the buttons labeled "Track 1", "Track 2", and "Track 3" would lead directly to those corresponding track assets.

In this project, we will make use of a script which will accomplish a few tasks for us. It sits between the Main Menu asset and each of the three track assets. The job of this script is to set a value to GPRM 1, which will serve as a marker that a track is in play, then play the track that has been chosen by the user. We will later use this information as part of our resume function in the setup menu.

Take note that the Main Menu also links directly to the Setup Menu. Notice that in doing so, the script "play track" is not used.

Setup Menu

Here is our setup menu. I have another image of the project structure over the setup menu to help keep the structure of this project in mind. Notice that the setup menu links to a script called "resume", as well as the Main Menu.

There is a lot more going on in this menu. These audio buttons and the subtitle buttons all set up specific audio and subtitle streams. We'll go over this in the second half of this tutorial.

Notice that the script "resume" has four red arrows. One leads to the Main Menu, and the other three each leads to one of the three track assets. These red arrows are meant to illustrate that this resume script will make a choice. It will decide if a track is in play and eligible for the resume function. If it is, then it will resume play of any of the three tracks that may have been in play. If, on the other hand, no track was in play, then the resume function is not eligible and the resume script will send the user back to the Main Menu.

Track Asset

This is a sample of one of the three tracks. This track asset has three audio streams and three subtitle streams. This corresponds to the Setup Menu's ability to set up these varying audio and subtitle streams.

Notice to the right side of A1 and S1 that each of these audio and subtitle streams is marked with their country code: "en" for English, "es" for Spanish, and "fr" for French.

This is the basic structure of the project. With that in mind, this project is broken down into two sections.

1. How to create a smart resume function that will resume only if eligible.
2. How to, in the setup menu, allow the user to choose between the available audio and subtitle streams as well as resume eligible tracks with the resume function.

-Section 1

How to create a smart resume function that will resume only if eligible.

Look at the example image below of a DVD project.

Take note again of the main menu, which links to three tracks and a setup menu. That's what the user sees, anyway. In truth, the main menu leads to just a script to play track selections and the setup menu. So we have four buttons on my main menu.

Buttons one, two, and three appear to the user to go to tracks one, two, and three, but each of these buttons is assigned to a single script called "play track". The play track script processes which of the three buttons have been selected and adds a numeric value to a register as a marker before processing the user-requested selection.

The fourth button on the main menu goes directly to the setup menu. So again, if you look at the image, you see that the main menu leads to a script called "play track" and to the setup menu.

The purpose of this value we have created is to act as a flag that a track has been requested to play. So just before the track actually plays, we have set a value. We will erase that value after the track is finished playing using the track's End Jump property and another tiny script. This way, if a user interrupts the full playback of the track by hitting the menu button on the remote control, then the value will not have had the chance to erase itself. The track will remain "IN PLAY", so to speak. It is this "IN PLAY" status that makes the track eligible for the resume command in the setup menu.

Let's take a look at the "play track" script and see how this functions.

SCRIPT: play track

1. add GPRM 1, 1
2. mov GPRM 0, SPRM 8
3. div GPRM 0, 1024
4. Jump Track 1 if (GPRM 0 = 1)
5. Jump Track 2 if (GPRM 0 = 2)
6. Jump Track 3 if (GPRM 0 = 3)

There are three registers in use here:

1. SPRM 8 is the last button selected.
2. GPRM 1 is a counter that adds a value of 1 to itself before a track is called.
3. GPRM 0 is a copy of SPRM 8, which we divide by 1024 to get a value of 1, 2, 3 depending on which of the first three buttons were selected in choosing tracks one, two, or three.

So basically, we are setting up a flag in GPRM 1, which we will look for later on in the resume script in the setup menu. I am using GPRM 1 to say that the user has requested a track to be played. Before that, the register GPRM 1 just equaled zero.

So a flag is set, then we look at which button was selected to get to this script. It's either one, two, or three since the button targets for buttons one, two, and three are this script. The answer can never be any other number.

In line 1, we use the "add" command to assign a value of 1 to the register GPRM 1. This is our flag that a track is about to be played. Again, we will erase this value when the track is finished playing by using the End Jump of each track in the project to execute a script that clears the value. That script is called "clear play".

In line 2 we copy the value of SPRM 8 into GPRM 0. Remember, GPRM 1 is our flag register. So we are introducing a whole new GPRM register. The job of this register is to convert the track selection into a simple number, such as 1024, 2048, or 3072.

In line 3, we convert those longer numbers of 1024, 2048, or 3072 into a more easily managed number by bit-shifting those potential values into 1, 2, or 3. We do this by using the "div" command.

If the SPRM 8 register value is 1024, it is now simply 1. If it is 2048, it is now simply 2, and if it is 3072, it is now just 3.

In lines 4 through 6, we launch the track that the user selected. It is either Track 1, 2, or 3.

We have now created a situation in which if a track is in play and the user were to hit the menu key on the remote control, GPRM 1 will hold a value of 1 and we will know that a track has started to play but never finished playing. This means that whenever we have a value of 1 in GPRM 1, the resume function is eligible to resume play. Without that, we know we should not execute a resume function because there is nothing to resume.

This is what happens when a track is called to play. We said that when a track is finished playing, we will erase this flag register in GPRM 1. This is accomplished using a script called "clear play". We call this script by setting the End Jump property of each track to the script "clear play".

Let's take a look at the "clear play" script.

SCRIPT: clear play

1. mov GPRM 1, 0
2. Jump main [GPRM 0]

Line 1 clears GPRM 1, which is used as our flag register.

Line 2 is more complex. GPRM 0 still holds the calculated value of the last menu selection made when we asked a track to play, and so we are using a GPRM-based button to call that last button highlight from the menu called "main".

There are really two ways to do this. The script "clear play" could call each button specifically with commands such as Jump Main::button 1 if (GPRM 0 = 1). We could do that three times, once for each of the three possible answers of 1, 2, or 3. A GPRM-based button is basically like saying: Jump to main, and highlight the button that corresponds to the value held in GPRM 0. It is a much shorter way of saying essentially the same thing.

The GPRM-based button is a function of the Jump command, as you can see here in the script command builder.

Note the red arrow, which points to the Command selection menu, is currently set to Jump.

The green arrow designates the jump target which is the menu called "main".

The blue arrow designates this Jump function as a GPRM-based button.

The yellow arrow designates which of my own registers to draw the button value from.

When using a GPRM-based button as we are, we want to jump to the button values of 1 through 36. SPRM 8 holds the values as 1024 for button 1, 2048 for button 2, and so forth. In the original "play track" script, we converted the SPRM 8 values from 1024 for button 1 to just 1 for button 1, and so forth. This has allowed us to use this simplified script to clear the track in play flag and return to the proper menu and highlight in just two lines of scripting code.

We are concluding the first half of this tutorial. We see how to set a flag now that we will use with a resume function that we have in our setup menu. Our main menu goes to either the tracks or the setup menu. What we have done so far is explain what happens when we go to a track.

When the track is in play and interrupted, we maintain the value set before the track is played. This value is stored in GPRM 1. If the track finishes its play, then the value stored in GPRM 1 is cleared using the "clear play" script set by the track End Jump property.

That leads us to the setup menu. From the main menu we can go to the setup menu to various tasks. Let's now begin Section #2.

-Section 2

How to, in the setup menu, allow the user to choose between the available audio and subtitle streams as well as resume eligible tracks with the resume function.

Our setup menu gives the user the choice of audio streams and subtitle streams in which to play. In addition to this, we want to give the user the opportunity to resume play of an already playing track. That means that if the user is in the middle of playing a track, then decides to use the menu key on the remote control in order to change the audio and/or subtitle, the user will have an option to resume the play of the track where they left off.

Let's look over a track asset with optional audio and subtitle streams to understand how we will be tapping into these streams within the setup menu.

We have three basic areas here.

1. Video
2. Audio
3. Subtitle

When we start to use the Property Inspector for our menu, we will use the advanced tab to set the streams for each button assignment. The streams section will directly correlate with these three sections using the following terms:

1. Angle
2. Audio
3. Subtitle, which as an optional check box called "View", which forces the subtitle stream to activate.

Take a look at the graphic above. Here we have the setup menu. Let's go over the basic method in which this menu functions. We start with choices for setting the audio and subtitle streams. We then have our Resume Play button, and then the Home button.

Let's start with the audio.

Note the yellow arrows. There are two of them. One points to the menu button French, and the other points to the Property Inspector's Name field. You can see that the Audio French button is Button #3.

Look at the purple arrows. There are two of those.

The one on top points to the Property Inspector's Target field. It is pointing to "setup::Button 8". Now look at the second purple arrow at the bottom. That arrow points to the setup menu's "Resume Play" button, which is also button #8.

Now take a look at the green arrow. This arrow is pointing to the Property Inspector's Audio Stream field, which is currently set to Audio Stream 3. Notice the French audio button is pointing to that setting of Audio Stream 3.

From these arrows we can see that the French button in the "Choose Audio" section of the setup menu is to target the same menu we are in, but a different button. When we press the French audio button we highlight the Resume Play button and set the Audio Stream to Audio Stream 3.

Audio Stream #3 is the French audio stream we saw in the track outline graphic above.

What this method does is allow the user to set the default audio stream and remain in the same setup menu. This way the user is free to resume play or to make another choice. With this setup menu, any track the user now plays will use the default audio stream of #3.

The Spanish button and the English button above the French button work exactly this same way. They too target the Resume Play button at the bottom of the menu, and they both set their respective audio streams of 2 and 1.

Let's look at the same menu, but this time let's look at the way we work with subtitle streams.

This is almost exactly the same as the image and concept above with the exception that we are now turning on a subtitle stream. The other difference here is the blue arrow. Note that the blue arrow here is pointing to the "View" check-box. In addition to activating a subtitle stream, we are forcing the view of this subtitle as well. When the user selects Button #6, which we have set in our Advanced tab as Subtitle Stream 3 (On), the user will see the subtitles on their television.

Note the purple arrows again. Just as the example above we have set this button to target to the same menu we are in now.

Note that this time, the Audio Stream is set to "Not Set". This means that we will not overwrite the user's current selection of the default audio stream. That makes this function we have created an added function to the current default audio stream. This means that the user can set Spanish audio and French subtitles from this same menu.

What if the user would like to switch off the subtitles from this menu? Let's go over that button next.

Here with Button #7, marked by the yellow arrows, we are switching off the subtitle view. Note that the blue arrow points to the same "View" check box as before, but this time the box is no longer checked. We are telling the DVD not to view any longer.

The Resume Function

Let's now talk about the all-important Resume Play function we spent the first half of this tutorials preparing for. The Resume function can be created with a script that calls a single function, which is called "Resume". What we did earlier was create a flag to help us later execute a script that would not execute the resume function unless it was eligible to resume a track that was interrupted in play.

With that in mind, let's go over what is behind Button #8 of our setup menu. Remember, this is what almost every button in the setup menu is pointing to.

The "Resume Play" button points to a script, which checks the value of GPRM 1. If there is no value, then either a track was never in play or has concluded play. Remember that in the script "play track" we accept the user's button selection to play a track, then assign GPRM 1 a value. We take that value away only when the track is finished playing with the "clear play" script which is the End Jump target of each track asset.

Since my project has three tracks, that means each of these tracks is a potential resume target. I have set up my resume script to go to the main menu in the event that the resume function finds that there is no eligible track to resume play for.

Looking at the project overview above, we can see the potential targets of my resume script.

Let's look at the resume script now. It's a few more lines of code as you would guess.

SCRIPT: resume

1. Goto 5 if (GPRM 1 >=1)
2. Jump main
3. nop
4. nop
5. Resume

This script acts like two scripts.

The first line checks to see if GPRM 1 has a value in it. Remember, we set GPRM 1 to hold a value of 1 when a track is requested to play. And we clear that value when the track is done playing. So we are now checking that register to see what the status is.

1 = a track was requested to play, and has not concluded.
0 = no track is in play.

So if it is a value of 1, we should use the resume command to finish playing the track. If it is a value of less than 1, which means zero or nothing, then we should not use the resume command and instead go to the home menu.

Line 1 says, if GPRM 1 is greater than or equal to 1, then goto line 5. Line 5 says, let's resume play.

If line 1 is a true statement, we resume play, and this script goes no further.

If no track is in play, then GPRM 1 is less than 1 or zero, so the statement is false and we continue to line 2.

Line 2 says, go to the main menu.


So there you have it. A very simple conditional resume function built into a Setup menu. Your audience can now choose which audio to listen to, which subtitles to read, and to resume play if they decide to make these choices in interruption of any track that is in play.

If, on the other hand, the user goes directly to the Setup menu, the Resume Play button will not attempt to resume what isn't there. Instead, the Resume Play button changes its task to return to the main menu so that the user may choose a track to watch.

-Alex Alexzander

© Copyright 2004 Alex Alexzander
All Rights Reserved

copyright © Michael Horton 2000-2010 All rights reserved