Как получить действительный mHostTime, используя AudioQueues - PullRequest
2 голосов
/ 02 апреля 2009

Я занимаюсь разработкой для iPhone и пытаюсь получить начальную метку времени для синхронизации моих аудиоQueues.

Я использую AudioQueueDeviceGetCurrentTime для этого. Согласно документации эта функция возвращает действительный mHostTime независимо от того, работает очередь / устройство или нет . Но когда я пытаюсь это , я получаю kAudioHardwareNotRunningError (1937010544). Все очереди имеют временную шкалу и были инициализированы перед вызовом функции.

Как я могу получить действительный mHostTime для синхронизации моих AudioQueues (до запуска очередей)?

Мой код:

AudioSessionInitialize(NULL, NULL, interruptionListenerCallback, self);

UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;

AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,
                        sizeof(sessionCategory), &sessionCategory);

// initialize all queues
// ....

AudioSessionSetActive(true);

OSStatus result;
AudioTimestamp currentTime;

result = AudioQueueDeviceGetCurrentTime(audioQueueRef, &currentTimeStamp);

if (!result)
{
  // rest of code
}

Ответы [ 4 ]

1 голос
/ 02 апреля 2009

После некоторого поиска я нашел в списке рассылки CoreAudio сообщение о том, что hostTime такой же, как mach_absolute_time().

Mach_absolute_time() действительно дает мне ожидаемые значения меток времени.

0 голосов
/ 20 июля 2010

Попробуйте, функция AudioQueueGetCurrentTime() заполняет структуру AudioTimeStamp. Если вы получите свойство mSampleTime этой структуры и поделите на частоту дискретизации звука , вы получите текущую позицию в секундах. В коде:

// AudioTimeStamp struct to store the value.
AudioTimeStamp timeStamp;

// Gets the current audio queue time.
AudioQueueGetCurrentTime(
                         mQueue,        // The audio queue whose current time you want to get.
                         NULL,        
                         &timeStamp,    // On output, the current audio queue time.
                         NULL         
                         );

// Return the value.
NSTimeInterval seconds = timeStamp.mSampleTime / mRecordFormat.mSampleRate;

Если вы не знаете текущую частоту дискретизации , эта информация сохраняется в свойстве mSampleRate, если для управления этим используется структура CAStreamBasicDescription.

Надеюсь, это сработает.

0 голосов
/ 02 декабря 2009

Вы должны создать временную шкалу, прежде чем сможете позвонить AudioQueueDeviceGetCurrentTime

AudioSessionSetActive(true);
// initialize all queues
// ....

// initialize time line
AudioQueueTimelineRef audioTimeline;
status = AudioQueueCreateTimeline(audioQueueRef, &audioTimeline);

// now you can do what you want.
OSStatus result;
AudioTimestamp currentTime;

result = AudioQueueDeviceGetCurrentTime(audioQueueRef, &currentTimeStamp);    
if (!result)
{
    // rest of code
}
0 голосов
/ 02 апреля 2009

Я провел около недели с этой проблемой. Насколько я могу судить, документация неверна - у вас должна быть запущенная аудио-очередь для запроса текущего времени устройства.

Мое решение? Это действительно не элегантно, но я просто продолжаю работать одну аудио-очередь, воспроизводя тишину, чтобы можно было отключить другие очереди.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...