Технические вопросы и ответы QA1643

Аудио Время Узла На 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.