2014-06-06 6 views
9

Ich versuche mit Swift auf AVAudioPCMBuffer.floatChannelData zuzugreifen, aber es ist vom Typ UnsafePointer<UnsafePointer<CFloat>> (in Objective-C, @property(nonatomic, readonly) float *const *floatChannelData) und jeder Versuch, den ich mache, um darauf zuzugreifen, führt zur Ausführung fehlgeschlagen.Von UnsafePointer <UnsafePointer <CFloat>> zu einem Array von Schwimmern in Swift?

Beispielcode eine schnelle AVAudioPCMBuffer in einem Swift Spielplatz Set-up ist in einer früheren Frage enthalten:

Getting AVAudioPCMBuffer working (AVAudioFile.mm error code -50)

Antwort

6

funktionierts?

let channels = UnsafeBufferPointer(start: myAudioBuffer.floatChannelData, count: Int(myAudioBuffer.format.channelCount)) 
let floats = UnsafeBufferPointer(start: channels[0], count: Int(myAudioBuffer.frameLength)) 
+0

mehr darüber finden Nope: Ich bekomme einen „fatalen Fehler: Kann nicht auspacken Optional. Keine Spielplatz Ausführung fehlgeschlagen: Fehler: Die Ausführung wurde unterbrochen, Grund: EXC_BAD_INSTRUCTION (Code = EXC_I386_INVOP, Subcode = 0x0). – Matthew

+0

Ich bekomme diesen Fehler mit der Zeile "let channels = ...". Der '' Int (myAudioBuffer.format.channelCount) '' Teil wird jedoch korrekt ausgewertet. – Matthew

+0

Update: Das funktioniert! Danke dafür. Es verursacht einen Absturz in einem Swift Playground, funktioniert aber in-App. – Matthew

3

Was Sie auch tun können, ist, um AVAudioBuffer zuzugreifen:

for var i = 0; i < Int(audioBuffer.frameLength); i+=Int(audioMixerNode.outputFormatForBus(0).channelCount) { 
    self.audioBuffer.floatChannelData.memory[i] = 0.0f; // or whatever 
} 

Sie können in der Apple pre-release documentation:

The floatChannelData property returns pointers to the buffer’s audio samples, if the buffer’s format is 32-bit float. It returns nil if it is another format. The returned pointer is to format.channelCount pointers to float. Each of these pointers is to frameLength valid samples, which are spaced by stride samples.

Verwandte Themen