2009-04-01 9 views
2

iPhone用に開発中で、audioQueuesを同期させるための初期タイムスタンプを取得しようとしています。AudioQueuesを使用して有効なmHostTimeを取得する方法

私はこれにAudioQueueDeviceGetCurrentTimeを使用しています。ドキュメントによると、この関数は、有効なmHostTime を返します。キュー/デバイスが実行中であるかどうかはです。しかし、私はこれを試すと私はkAudioHardwareNotRunningError(1937010544)を返す。すべてのキューにはtimeLineが関連付けられており、関数を呼び出す前に初期化されています。

(キューを実行する前に)AudioQueuesを同期する有効なmHostTimeを取得する方法を教えてください。

マイコード:

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 
} 
+0

私は、ホストタイム機能と変換に関するこの質問への返答について非常に詳細な回答を書いています。 http://stackoverflow.com/questions/675626?tab=newest#tab-top – Mecki

答えて

1

グーグルでは、CoreAudioのメーリングリストで、hostTimeがmach_absolute_time()と同じであると言う投稿を見つけました。

Mach_absolute_time()実際に私に期待されるタイムスタンプ値を与えています。あなたはこの機能を試してみてくださいAudioQueueGetCurrentTime(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

私はこの正確な問題で立ち往生週間ほど過ごしました。私が知る限り、ドキュメントは間違っています。現在のデバイス時間を問い合わせるには、実行中のオーディオキューが必要です。

私のソリューションですか?それは本当に控えめですが、私はただ1つのオーディオキューを常に稼働させて静かにしておき、他のキューをタイムアウトさせることができます。

+1

自分の質問への返信をご覧ください。私はいつもホスト時間を使ってオーディオ待ち行列を同期させますが、これはうまくいきます。現在のティックカウントを取得した場合は、目盛りで2秒を計算し、現在のティックカウントにそれらを追加し、タイムスタンプ構造体でこの値を設定し、フラグを有効なホスト時間のみに設定し、最後にバッファを既に実行中のキューにエンキューします2秒で正確に再生されます。すでに2秒で別のバッファを再生している場合、もう一方のバッファは中断され、代わりにスケジュールされた時間が再生されます。 – Mecki

-1

は)AudioTimeStamp構造を満たします。この構造体のmSampleTimeプロパティを取得し、オーディオサンプルレートで割ると、現在の秒位置が取得されます。コードでは:あなたが現在サンプルレートを知られていない場合は、これを制御するためにCAStreamBasicDescription構造を使用している場合

// 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プロパティに格納されます。

希望します。

0

を呼び出すことができます前に、タイムラインを作成する必要が

関連する問題