2009-04-01 6 views
2

Ich entwickle für das iPhone und versuche, einen ersten timeStamp zu bekommen, um meine audioQueues zu synchronisieren.Wie bekomme ich eine gültige mHostTime mit AudioQueues

Ich verwende AudioQueueDeviceGetCurrentTime dafür. Gemäß der Dokumentation gibt diese Funktion eine gültige mHostTime zurück, ob die Queue/das Gerät läuft oder nicht. Aber wenn ich das versuche, bekomme ich eine kAudioHardwareNotRunningError (1937010544) zurück. Alle Warteschlangen sind mit einer timeLine verknüpft und wurden vor dem Aufruf der Funktion initialisiert.

Wie kann ich eine gültige mHostTime abrufen, um meine AudioQueues zu synchronisieren (vor dem Ausführen der Warteschlangen)?

Mein Code:

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

Ich habe eine sehr detaillierte Antwort über Host-Time-Funktionen und Konvertierung in Antwort auf diese Frage geschrieben (nur für den Fall, dass Sie weitere Informationen wünschen). http://stackoverflow.com/questions/675626?tab=newest#tab-top – Mecki

Antwort

1

Nach etwas googeln fand ich einen Beitrag auf der CoreAudio Mailingliste, wo sie sagen, dass die hostTime die gleiche wie mach_absolute_time() ist.

Mach_absolute_time() gibt mir tatsächlich die erwarteten Zeitstempelwerte.

0

verbrachte ich eine Woche mit genau diesem Problem stecken. Soweit ich das beurteilen kann, ist die Dokumentation falsch - Sie müssen eine laufende Audio-Queue haben, um die aktuelle Gerätezeit abzufragen.

Meine Lösung? Es ist wirklich unelegant, aber ich lasse immer nur eine Audio-Warteschlange laufen, die still läuft, damit ich andere Warteschlangen aus der Zeit abmelden kann.

+1

Siehe meine Antwort auf Ihre eigene Frage. Ich synchronisiere Audio-Warteschlangen immer mit Host-Zeit und das funktioniert gut. Wenn ich die aktuelle Tick-Anzahl erhalte, berechne 2 Sekunden in Ticks, füge sie zur aktuellen Tick-Anzahl hinzu, setze diesen Wert in der Zeitstempel-Struktur, setze Flags auf nur die Host-Zeit gültig und lege schließlich den Puffer in die bereits laufende Queue Es wird genau in 2 Sekunden abgespielt. Wenn in 2 Sekunden bereits ein anderer Puffer gespielt wird, wird der andere Puffer unterbrochen und stattdessen die geplante Zeit gespielt. – Mecki

-1

Sie einen Zeitplan erstellen, bevor Sie diese 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

Versuchen Sie anrufen können, die Funktion AudioQueueGetCurrentTime() füllt eine AudioTimeStamp Struktur. Wenn Sie die Eigenschaft dieser Struktur erhalten und durch Audio-Abtastrate teilen, erhalten Sie die aktuelle Sekundenposition. In Code:

// 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; 

Wenn Sie nicht die aktuelle Abtastrate bekannt ist, wird diese Information auf der mSampleRate Eigenschaft gespeichert, wenn Sie die CAStreamBasicDescription Struktur verwenden diese zu steuern.

Ich hoffe, es funktioniert.