2016-12-27 3 views
2

Ich versuche zu Swift 3 Syntax, um den folgenden Code zu konvertieren:Swift 3 Guss Ausgabe mit UnsafeMutableRawPointer - Audioqueue

fileprivate func generateTone(_ buffer: AudioQueueBufferRef) { 
     if noteAmplitude == 0 { 
      memset(buffer.pointee.mAudioData, 0, Int(buffer.pointee.mAudioDataBytesCapacity)) 
     } else { 
      let count: Int = Int(buffer.pointee.mAudioDataBytesCapacity)/MemoryLayout<Float32>.size 
      var x: Double = 0 
      var y: Double = 0 
      let audioData = UnsafeMutablePointer<Float32>(buffer.pointee.mAudioData) 

      for frame in 0..<count { 
       x = noteFrame * noteFrequency/kSampleRate 
       y = sin (x * 2.0 * M_PI) * noteAmplitude 
       audioData[frame] = Float32(y) 

       noteAmplitude -= noteDecay 
       if noteAmplitude < 0.0 { 
        noteAmplitude = 0 
       } 

       noteFrame += 1 
      } 
     } 

     buffer.pointee.mAudioDataByteSize = buffer.pointee.mAudioDataBytesCapacity 
    } 

Ich bin fest mit:

let audioData = UnsafeMutablePointer<Float32>(buffer.pointee.mAudioData) 

Xcode klagt:

Kann Initialisierer für den Typ 'UnsafeMutablePointer' mit einer Argumentliste vom Typ '(UnsafeMutableRawPointer) nicht aufrufen'

enter image description here

Das Projekt zur Verfügung steht bei here

Jede Hilfe sehr geschätzt :)

Antwort

2

mAudioData würde, ist ein "nicht typisierten Zeiger" (UnsafeMutableRawPointer), und Sie können wandeln Sie es in einen getippten Zeiger mit assumingMemoryBound um:

let audioData = buffer.pointee.mAudioData.assumingMemoryBound(to: Float32.self) 

Weitere Informationen zu Rohzeigern finden Sie unter SE-0107 UnsafeRawPointer API .

+0

Ja, es ist jetzt ziemlich einfach für mich. Danke Martin! –