К сожалению, такое добавление, как referenceTime + bufferDuration с переменной AVAudioTime, невозможно в цели c, и метод now () также не существует.
Они не существуют, потому чтоэто не часть AVAudioTime, это расширение AudioKit.
Если вы посмотрите на их исходный код , вы найдете:
// An AVAudioTime with a valid hostTime representing now.
public static func now() -> AVAudioTime {
return AVAudioTime(hostTime: mach_absolute_time())
}
/// Returns an AVAudioTime offset by seconds.
open func offset(seconds: Double) -> AVAudioTime {
if isSampleTimeValid && isHostTimeValid {
return AVAudioTime(hostTime: hostTime + seconds / ticksToSeconds,
sampleTime: sampleTime + AVAudioFramePosition(seconds * sampleRate),
atRate: sampleRate)
} else if isHostTimeValid {
return AVAudioTime(hostTime: hostTime + seconds / ticksToSeconds)
} else if isSampleTimeValid {
return AVAudioTime(sampleTime: sampleTime + AVAudioFramePosition(seconds * sampleRate),
atRate: sampleRate)
}
return self
}
public func + (left: AVAudioTime, right: Double) -> AVAudioTime {
return left.offset(seconds: right)
}
Вы можете реализоватьэти расширения сами также.Я не думаю, что вы можете реализовать оператор + в Objective C, поэтому вам просто нужно использовать метод смещения.(ПРИМЕЧАНИЕ: я не проверял следующее)
double ticksToSeconds() {
struct mach_timebase_info tinfo;
kern_return_t err = mach_timebase_info(&tinfo);
double timecon = (double)(tinfo.numer) / (double)(tinfo.denom);
return timecon * 0.000000001;
}
@interface AVAudioTime (Extensions)
+ (AVAudioTime *)now;
- (AVAudioTime *)offsetWithSeconds:(double)seconds;
@end
@implementation AVAudioTime (Extensions)
+ (AVAudioTime *)now {
return [[AVAudioTime alloc] initWithHostTime:mach_absolute_time()];
}
- (AVAudioTime *)offsetWithSeconds:(double)seconds {
if ([self isSampleTimeValid] && [self isHostTimeValid]) {
return [[AVAudioTime alloc] initWithHostTime:self.hostTime + (seconds / ticksToSeconds())
sampleTime:self.sampleTime + (seconds * self.sampleRate)
atRate:self.sampleRate];
}
else if ([self isHostTimeValid]) {
return [[AVAudioTime alloc] initWithHostTime:self.hostTime + (seconds / ticksToSeconds())];
}
else if ([self isSampleTimeValid]) {
return [[AVAudioTime alloc] initWithSampleTime:self.sampleTime + (seconds * self.sampleRate)
atRate:self.sampleRate];
}
return self;
}
@end