2

ボタンをタップしたときにサウンドを再生しようとしており、iOS 5 ファイル プレーヤー オーディオ ユニットを使用しています。

ファイル プレーヤーは、ScheduledAudioFileRegion を使用してオーディオを再生し、必要な数のフレームを再生するようにスケジュールできます。

ScheduledAudioFileRegion rgn;
memset (&rgn.mTimeStamp, 0, sizeof(rgn.mTimeStamp));
rgn.mTimeStamp.mFlags = kAudioTimeStampSampleTimeValid;
rgn.mTimeStamp.mSampleTime = 0;
rgn.mCompletionProc = NULL;
rgn.mCompletionProcUserData = NULL;
rgn.mAudioFile = audioFile;
rgn.mLoopCount = INT_MAX;
rgn.mStartFrame = 0;
rgn.mFramesToPlay = nPackets * fileASBD.mFramesPerPacket; // plays entire file.

ボタンが押されるたびに最初からサウンドを再生するようにこのファイルプレーヤーに指示するにはどうすればよいですか?または、新しいリージョンを作成して毎回 memset する必要がありますか? ボタンを最初から最後まで押したときにサウンドを再生したいのですが、ボタンをもう一度タップすると、ファイルが現在再生中であっても最初から開始する必要があります。これは fileplayer オーディオ ユニットで可能ですか?

4

2 に答える 2

3

を呼び出しAudioUnitResetて再生を停止し、プライミングしてもう一度再生します。即座に発生します (またはほとんど違いはありません)。

ユーザーがボタンを押すたびにこれを行います。

// Reset
AudioUnitReset(filePlayerUnit, kAudioUnitScope_Global, 0);
// Prime (have to do this before every play call.)
UInt32 defaultVal = 0;
AudioUnitSetProperty(filePlayerUnit, 
                     kAudioUnitProperty_ScheduledFilePrime,                
                     kAudioUnitScope_Global, 
                     0, 
                     &defaultVal, 
                     sizeof(defaultVal));
// Play (again)
AudioUnitSetProperty(_playerUnit,
                     kAudioUnitProperty_ScheduleStartTimeStamp,
                     kAudioUnitScope_Global,
                     0,
                     &startTime,
                     sizeof(startTime));

リージョンには既にタイムスタンプがあります。それらが必要ですが、次のものも作成する必要がありますAudioTimeStamp

AudioTimeStamp startTime;
memset(&startTime, 0, sizeof(startTime));
startTime.mFlags = kAudioTimeStampSampleTimeValid;
startTime.mSampleTime = -1;

これを作成し、play を初めて呼び出す前に、上記の最初のスニペットから関連する SetProperty を呼び出します。

于 2012-12-10T02:30:22.650 に答える
1

Play.. を呼び出す前に UIButton に Stop アクションをトリガーさせることはできませんか?

于 2012-11-30T16:49:06.450 に答える