简体   繁体   中英

How to start AUAudioFilePlayer in the middle of a track but loop to the beginning?

In iOS I'm using the AUAudioFilePlayer and I'm trying to do a 10 second lead in before looping the entire audio track. I've set the ScheduledAudioFileRegion as below to start on a non-zero frame (details here: https://developer.apple.com/library/ios/qa/qa1786/_index.html )

ScheduledAudioFileRegion playRegion;
playRegion.mTimeStamp.mFlags = kAudioTimeStampSampleTimeValid;
playRegion.mTimeStamp.mSampleTime = 0;
playRegion.mCompletionProc = NULL;
playRegion.mCompletionProcUserData = NULL;
playRegion.mAudioFile = audioFileId;
playRegion.mLoopCount = UInt32(-1);
playRegion.mStartFrame = startFrame;
playRegion.mFramesToPlay = UInt32(-1);  // i.e. all of it
_(AudioUnitSetProperty(_audioUnit,
                       kAudioUnitProperty_ScheduledFileRegion,
                       kAudioUnitScope_Global,
                       0,
                       &playRegion,
                       sizeof(playRegion)),
  @"Error setting Audio File Region on the FilePlayer AU");

The problem is that when it loops it starts again at startFrame . Any ideas how I get it start at the beginning?

The answer is to do two schedules. mTimeStamp.mSampleTime is how long relative to the scheduled start time to wait until playing:

/////////////////////////////////////////
// PRE-AMBLE
/////////////////////////////////////////

// Tell it to play the whole file with optional looping...
// more details: https://developer.apple.com/library/ios/qa/qa1786/_index.html
ScheduledAudioFileRegion playRegion;
playRegion.mTimeStamp.mFlags = kAudioTimeStampSampleTimeValid;
playRegion.mTimeStamp.mSampleTime = 0;  // PLAY IMMEDIATELY...
playRegion.mCompletionProc = NULL;
playRegion.mCompletionProcUserData = NULL;
playRegion.mAudioFile = audioFileId;
playRegion.mLoopCount = 0;
playRegion.mStartFrame = startFrame;   // ...FROM REQUEST START FRAME
playRegion.mFramesToPlay = UInt32(-1);  // i.e. all of it
_(AudioUnitSetProperty(_audioUnit,
                       kAudioUnitProperty_ScheduledFileRegion,
                       kAudioUnitScope_Global,
                       0,
                       &playRegion,
                       sizeof(playRegion)),
  @"Error setting Audio File Region on the FilePlayer AU");


/////////////////////////////////////////
// LOOP
/////////////////////////////////////////

playRegion.mTimeStamp.mFlags = kAudioTimeStampSampleTimeValid;
playRegion.mTimeStamp.mSampleTime = lengthInFrames - startFrame; // WAIT UNTIL PREAMBLE IS DONE...
playRegion.mCompletionProc = NULL;
playRegion.mCompletionProcUserData = NULL;
playRegion.mAudioFile = audioFileId;
playRegion.mLoopCount = UInt32(-1);
playRegion.mStartFrame = 0;         // ...THEN PLAY FROM THE BEGINNING
playRegion.mFramesToPlay = UInt32(-1);  // i.e. all of it
_(AudioUnitSetProperty(_audioUnit,
                       kAudioUnitProperty_ScheduledFileRegion,
                       kAudioUnitScope_Global,
                       0,
                       &playRegion,
                       sizeof(playRegion)),
  @"Error setting Audio File Region on the FilePlayer AU");

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM