Audio Host Time On iOS
Q:
How do you work with Host Time on iOS, for example how do I get the current host time or clock frequency since AudioGetCurrentHostTime and AudioGetHostClockFrequency are not available?
A: While the best way to work with host time on iOS is using the CAHostTimeBase helper class, iOS developers may simply call mach_absolute_time to retrieve the current host time.
Listing 1 Getting the current host time.
UInt64 theTime = mach_absolute_time(); |
The other important component of the host time is the frequency or timebase. By using the mach_timebase_info structure and mach_timebase_info (usr/include/mach/mach_time.h) you can figure out the length of every unit of absolute time.
struct mach_timebase_info { |
uint32_t numer; |
uint32_t denom; |
}; |
typedef struct mach_timebase_info *mach_timebase_info_t; |
typedef struct mach_timebase_info mach_timebase_info_data_t; |
Listing 2 Getting the time base info.
# include <mach/mach_time.h> |
mach_timebase_info_data_t theTimeBaseInfo; |
mach_timebase_info(&theTimeBaseInfo); |
For example, if the numerator returned is 1,000,000,000 and the denominator is 6,000,000, the frequency is 6,000,000ths of a second. Every unit of absolute time would be 166.67 nanoseconds and host time frequency in ticks per seconds may be calculated like this, 1.0e9 * (denom / numer).
Listing 3 demonstrates how the CAHostTimeBase helper class calculates frequency.
Listing 3 Snippet from CAHostTimeBase.
#include "CAHostTimeBase.h" |
Float64 CAHostTimeBase::sFrequency = 0; |
UInt32 CAHostTimeBase::sToNanosNumerator = 0; |
UInt32 CAHostTimeBase::sToNanosDenominator = 0; |
... |
// get the info about Absolute time |
struct mach_timebase_info theTimeBaseInfo; |
mach_timebase_info(&theTimeBaseInfo); |
sToNanosNumerator = theTimeBaseInfo.numer; |
sToNanosDenominator = theTimeBaseInfo.denom; |
... |
// the frequency of that clock is: (sToNanosDenominator / sToNanosNumerator) * 10^9 |
sFrequency = static_cast<Float64>(sToNanosDenominator) / static_cast<Float64>(sToNanosNumerator); |
sFrequency *= 1000000000.0; |
As previously mentioned, the best way to work with host time on iOS is by taking advantage of the CAHostTimeBase helper class (CAHostTimeBase.h and CAHostTimeBase.cpp) provided as part of the Core Audio Utility Classes.
CAHostTimeBase provides the following public methods:
ConvertToNanos(inHostTime); |
ConvertFromNanos(inNanos); |
GetCurrentTime(); |
GetCurrentTimeInNanos(); |
GetCurrentTimeInSeconds(); |
GetFrequency(); |
GetMinimumDelta() |
AbsoluteHostDeltaToNanos(inStartTime, inEndTime); |
HostDeltaToNanos(inStartTime, inEndTime); |
Here's an easy and useful example of using CAHostTimeBase along with AudioQueueStart to start the playback of an Audio Queue object 5 seconds in the future.
AudioQueueStart takes a pointer to an AudioTimeStamp structure as the inStartTime parameter indicating at which time the audio queue should start and we'll use the mHostTime field to specify our wanted start time.
Listing 4 Creating a host time 5 seconds in the future for AudioQueueStart.
#include "CAHostTimeBase.h" |
AudioTimeStamp myAudioQueueStartTime = {0}; |
UInt32 theNumberOfSecondsInTheFuture = 5; |
Float64 hostTimeFreq = CAHostTimeBase::GetFrequency(); |
UInt64 startHostTime = CAHostTimeBase::GetCurrentTime() + theNumberOfSecondsInTheFuture * hostTimeFreq; |
myAudioQueueStartTime.mFlags = kAudioTimeStampHostTimeValid; |
myAudioQueueStartTime.mHostTime = startHostTime; |
AudioQueueStart(myAudioQueue, &myAudioQueueStartTime); |
Document Revision History
| Date | Notes |
|---|---|
| 2014-01-15 | Editorial |
| 2009-05-18 | New document that describes how to work with Host Time on iOS. |
Copyright © 2014 Apple Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2014-01-15