Q: I'm working on a Movie Export Component which encodes and writes data to a file. This process takes some time and I'd like to support a progress procedure. I've read about the MovieProgressProc but it seems to only apply to functions like ConvertMovieToFile and PutMovieIntoTypedHandle . How do I support a ProgressProc in my Export Component?
A: Supporting a Progress Procedure in your Export Component is quite straightforward.
The application will supply a MovieProgressProc conforming to the prototype in Listing 1. This is the user function you will call from your component.
OSErr MyMovieProgressProc(Movie theMovie,
short message,
short whatOperation,
Fixed percentDone,
long refcon);
|
Listing 1. Prototype for an application defined MovieProgressProc.
|
You will need to support the SetProgressProc selector and implement the SetProgressProc function in your Export Component. This allows your component to be called with the MovieExportSetProgressProc API.
ComponentCall (SetProgressProc)
|
Listing 2. Supporting the SetProgressProc selector.
|
QuickTime will then call your Export Component with the ProgressProc (a MovieProgressUPP ) and refcon . Store this MovieProgressUPP and refcon in your component globals for later use.
pascal ComponentResult MyExport_SetProgressProc(
myExportGlobals glob,
MovieProgressUPP proc,
long refcon)
{
if ((NULL == proc) || (-1 == proc)) return paramErr;
glob->progressProc = proc;
glob->progressProcRefCon = refCon;
return noErr;
}
|
Listing 3. Export component SetProgressProc implementation.
|
During the export process (when your component is doing its work), call the progress procedure using InvokeMovieProgressUPP making sure to supply the appropriate messages and updated percentage values to indicate your progress.
The message parameter should be set to one of the following values:
movieProgressOpen - your exporter is starting long operation, this must always be the first message.
movieProgressUpdatePercent - relative completion of the operation.
movieProgressClose - export operation done, this must be the last message.
The whatOperation parameter should be set to reflect the export operation:
progressOpExportMovie - export operation.
InvokeMovieProgressUPP(
NULL, // movie
movieProgress..., // movieProgressOpen,
// movieProgressUpdatePercent
// or movieProgressClose
progressOpExportMovie, // exporting
myPercentDone, // a fixed value 1.0 == 100% done
store->progressProcRefCon,
glob->progressProc);
|
Listing 4. Calling the MovieProgressProc from an Export Component
|
Application developers should note that the "Default Progress Proc" value of -1 cannot be used with MovieExportSetProgressProc . This API requires that you supply a valid callback function.
References:
[Jan 31 2003]
|