我正在为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, ¤tTimeStamp);
if (!result)
{
// rest of code
}
答案 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, ¤tTimeStamp);
if (!result)
{
// rest of code
}