如何使用AudioQueues检索有效的mHostTime

时间:2009-04-01 21:21:26

标签: iphone audio time

我正在为iPhone开发,我正在尝试获取初始timeStamp来同步我的audioQueues。

我正在使用AudioQueueDeviceGetCurrentTime。根据文档,此函数返回有效的mHostTime 队列/设备是否正在运行。但是当我尝试这个时,我会回到kAudioHardwareNotRunningError (1937010544)。在调用函数之前,所有队列都有一个timeLine关联并已初始化。

如何检索有效的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 个答案:

答案 0 :(得分:1)

经过一些谷歌搜索后,我在CoreAudio邮件列表上找到了一个帖子,他们说主机时间与mach_absolute_time()相同。

Mach_absolute_time()确实给了我预期的时间戳值。

答案 1 :(得分:0)

我花了大约一个星期坚持这个确切的问题。据我所知,文档是错误的 - 你必须有一个正在运行的音频队列来查询当前的设备时间。

我的解决方案?它真的很不优雅,但是我只是让一个音频队列一直在运行,然后播放静音,以便我可以将其他队列排除在外。

答案 2 :(得分:0)

尝试此操作,函数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属性中。

希望它有效。

答案 3 :(得分:-1)

您必须先创建时间表,然后才能拨打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
}