2016-12-27 6 views
2

звуковых сообщений Я пытаюсь преобразовать Swift 3 синтаксис следующий код:Swift выпуск 3 литье с UnsafeMutableRawPointer -

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 
    } 

я застрял:

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

Xcode жалуется:

Невозможно вызвать инициализатор для типа 'UnsafeMutablePointer' с списком аргументов типа '(UnsafeMutableRawPointer)'

enter image description here

Проект доступен на here

Любая помощь будет очень признателен :)

ответ

2

mAudioData является "нетипизированным указатель" (UnsafeMutableRawPointer), и вы можете преобразовать его в типизированный указатель с assumingMemoryBound:

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

См. SE-0107 UnsafeRawPointer API для получения дополнительной информации о необработанных указателях.

+0

Да, сейчас это довольно просто. Спасибо, Мартин! –