|
|
|||||||||
|
|||||||||
テクニカル Q&AQTMTB 52 - QuickTime 4 でメモリ上の WAVE データを再生する方法 (1999 年 8 月 21 日)
Q: QuickTime 4 でメモリ上にある WAVE データを再生する方法を教えてください。 A: QuickTime 4 には組み込みの WAV ファイルインポータがあります。まるで QuickTime のムービーファイルであるかのように、いとも簡単に WAV ファイルを開いて再生することができます。例えば次に示すのは、読者がそのまま利用できる、QuickTime で WAV ファイルを再生するコードです (ファイルプロンプトで WAV ファイルを選ぶと QuickTime は音だけのムービーとして再生します)。 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;
}
WAV データがファイルではなくメモリ上にある場合、WAV サウンドを QuickTime で再生するにはもう少し作業が必要です。このような場合、ひとつの方法は、新しいムービーを作成し、WAV データを別のサウンドトラックとして追加する方法です (QuickTime の WAV インポータはファイルにしか対応しないため)。『Inside Macintosh: QuickTime』第 2 章にはスクラッチレベルから新しいムービーを作成し、それにサウンドトラックを追加するサンプルコードがあります。同じ方法でムービーのサウンドトラックに WAV データを追加し、ムービーを再生することができます。 もうひとつの方法は、QuickTime の WAV ムービーインポートコンポーネントと MovieImportDataRef 関数を使って、メモリ上の WAV ファイルデータをムービーに追加する方法です。MovieImportDataRef 関数にはインポート操作で使用するデータ参照 (data reference) を指定します (この場合は WAV ファイルデータのデータ参照へのハンドル)。dataRef パラメータには、WAV データへのハンドルではなく、先頭のデータハンドルへのハンドルを渡すことに注意してください (以下のコードを参照)。 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 Kuechle Worldwide Developer Technical Support テクニカル Q&A | 目次 To contact us, please use the Contact Us page. |