如何在轨道中间启动AUAudioFilePlayer但循环到开头?

时间:2014-07-30 08:17:24

标签: ios audio core-audio audiounit

在iOS中,我正在使用AUAudioFilePlayer,我试图在循环整个音频轨道之前进行10秒的引导。我已将ScheduledAudioFileRegion设置为如下所示,以非零帧开头(详情请参阅: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");

问题是,当它循环时,它会在startFrame处再次启动。我是如何从一开始就开始的?

1 个答案:

答案 0 :(得分:3)

答案是做两个时间表。 mTimeStamp.mSampleTime是相对于预定开始时间等待播放的时间长度:

/////////////////////////////////////////
// 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");