Technical Q&A

QTMTB 52 - Playing memory-resident WAVE data using QuickTime 4 (21-July-1999)


Q: How do I play memory-resident WAVE data using QuickTime 4?

A: QuickTime 4 has a built-in WAV file importer. You can open and play a WAV file quite easily by opening the file as if it were a QuickTime movie file and playing the "movie" (WAV file). For example, here's some QuickTime code which you can use to play any WAV file (simply select your WAV file at the file prompt and QuickTime will play it as a sound-only movie):

OSErr PlayWAVfile ()
{
    SFTypeList        myTypeList;
    StandardFileReply myReply;
    OSErr             err = noErr;
    short             movieRefNum, resID = 0;
    Movie             movie;

        StandardGetFilePreview(NULL, -1, myTypeList, &myReply);
        if (!myReply.sfGood)
        {
            err = userCanceledErr;
            return err;
        }
        else
        {
            err = OpenMovieFile(&myReply.sfFile, &movieRefNum, fsRdPerm);
            if (!err)
            {
                err = NewMovieFromFile(&movie,
                                       movieRefNum,
                                       &resID,
                                       NULL,
                                       newMovieActive,
                                       NULL);
            }

            if (err)
            {
                if (movie)
                {
                    DisposeMovie(movie);
                }
            }
            else
            {
                SetMovieVolume(movie, kFullVolume);
                GoToBeginningOfMovie(movie);
                StartMovie(movie);
                while (!IsMovieDone(movie))
                {
                    MoviesTask(movie, 0);
                    err = GetMoviesError();
                }
            }
        }

        return err;
}  
  

It's a bit more work to play a WAV sound using QuickTime if your WAV data is in memory instead of in a file. In this case, one option is to create a new movie and add the WAV data as a separate sound track (since the QuickTime WAV importer only works with files). Inside Macintosh: QuickTime chapter 2 contains sample code which shows how to create a movie from scratch and add a sound track to the movie. Simply add the WAV data to the sound track of your movie as you would normally then play the movie.

You can also use the QuickTime WAV movie import component along with the MovieImportDataRef function to add memory-resident WAV file data to a movie. The MovieImportDataRef function lets you specify the data reference to use for the import operation (in this case, a handle data reference for the WAV file data). Note that this does not mean you actually pass the handle to your data in the dataRef parameter; instead, the dataRef is a handle that starts with the handle to your data (see code below):

void ImportWAVDataFromMemory(Ptr waveDataPtr, long waveDataSize)
{
    Handle                  myHandle, dataRef = nil;
    Movie                   movie;
    MovieImportComponent    miComponent;
    Track                   targetTrack = nil;
    TimeValue               addedDuration = 0;
    long                    outFlags = 0;
    OSErr                   err;
    ComponentResult         result;

        myHandle = NewHandleClear((Size)waveDataSize);
        BlockMove(waveDataPtr,
                    *myHandle,
                    waveDataSize);

        err = PtrToHand(&myHandle,
                        &dataRef,
                        sizeof(Handle));

        miComponent = OpenDefaultComponent(MovieImportType,
                                            kQTFileTypeWave);
        movie = NewMovie(0);

        result = MovieImportDataRef(miComponent,
                                    dataRef,
                                    HandleDataHandlerSubType,
                                    movie,
                                    nil,
                                    &targetTrack,
                                    nil,
                                    &addedDuration,
                                    movieImportCreateTrack,
                                    &outFlags);

        SetMovieVolume(movie, kFullVolume);
        GoToBeginningOfMovie(movie);
        StartMovie(movie);
        while (!IsMovieDone(movie))
        {
            MoviesTask(movie, 0);
            err = GetMoviesError();
        }
}
  

-- Scott Kuehle
Worldwide Developer Technical Support

Technical Q&As | Contents
Previous Question

To contact us, please use the Contact Us page.