Аудио Время Узла На iOS
Q: Как делают Вы работаете со Временем Узла на iOS, например как делают я получаю текущее время узла или тактовую частоту с тех пор AudioGetCurrentHostTime и AudioGetHostClockFrequency не доступны?
A: В то время как лучший способ работать со временем узла на iOS использует класс помощника CAHostTimeBase, разработчики iOS могут просто вызвать mach_absolute_time получать текущее время узла.
Перечисление 1 , Получающее текущее время узла.
UInt64 theTime = mach_absolute_time(); |
Другой важный компонент времени узла является частотой или timebase. При помощи mach_timebase_info структура и mach_timebase_info (usr/include/mach/mach_time.h) можно выяснить длину каждого модуля абсолютного времени.
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; |
Перечисление 2 , Получающее время, базирует информацию.
# include <mach/mach_time.h> |
mach_timebase_info_data_t theTimeBaseInfo; |
mach_timebase_info(&theTimeBaseInfo); |
Например, если числитель возвратился, 1,000,000,000, и знаменатель 6,000,000, частота является 6 000 000 тыс из секунды. Каждый модуль абсолютного времени составил бы 166,67 наносекунд, и частота времени узла в галочках в секунды может быть вычислена как это, 1.0e9 * (denom / numer).
Перечисление 3 демонстрирует как CAHostTimeBase класс помощника вычисляет частоту.
Отрывок перечисления 3 от 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; |
Как ранее упомянуто, лучший способ работать со временем узла на iOS путем использования в своих интересах класса помощника CAHostTimeBase (CAHostTimeBase.h and CAHostTimeBase.cpp) если как часть Классов Утилиты Core Audio.
CAHostTimeBase обеспечивает следующие открытые методы:
ConvertToNanos(inHostTime); |
ConvertFromNanos(inNanos); |
GetCurrentTime(); |
GetCurrentTimeInNanos(); |
GetCurrentTimeInSeconds(); |
GetFrequency(); |
GetMinimumDelta() |
AbsoluteHostDeltaToNanos(inStartTime, inEndTime); |
HostDeltaToNanos(inStartTime, inEndTime); |
Вот простой и полезный пример использования CAHostTimeBase вместе с AudioQueueStart для запуска воспроизведения Аудио-очереди возражают 5 секундам в будущем.
AudioQueueStart берет указатель на AudioTimeStamp структура как inStartTime параметр, указывающий, в котором времени должна запуститься аудио-очередь и мы будем использовать mHostTime поле для указания нашего требуемого времени начала.
Перечисление 4 , Создающее время узла 5 секунд в будущем для 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); |
История версии документа
| Дата | Примечания |
|---|---|
| 15.01.2014 | Передовая статья |
| 18.05.2009 | Новый документ, описывающий, как работать со Временем Узла на iOS. |