Как использовать CoreAudio API в Swift
Я нахожусь в процессе миграции моего потокового аудио двигателя на swift. мне трудно использовать C Audio API в swift.
У меня есть проблема с AudioFileStreamOpen api, где он принимает 2 функции C в качестве параметра. Я не знаю, как использовать этот API swift.
AudioFileStreamOpen(self as UnsafePointer<()>, propertyProc, packetProc, kAudioFileMP3Type, audioStreamId)
Я определил метод обратного вызова, как показано ниже для этого API. Но я получаю ошибку компиляции.
func propertyProc(inClientData: UnsafePointer<()>,inFileStreamId: AudioFileStreamID,inPropertyId: AudioFileStreamPropertyID,ioFlags: UnsafePointer<UInt32>) -> Void {
.....
}
func packetProc(inClientData: UnsafePointer<()>,inNumberOfBytes: UInt32,inNumberOfPackets: UInt32, ConstUnsafePointer<()>, inPacketDescriptions: UnsafePointer<AudioStreamPacketDescription>) -> Void {
.....
}
Любая помощь ценится, чтобы правильно определить этот C API в swift

2 ответов:
Вы не можете (в настоящее время) использовать API, требующий указатель обратного вызова C из чистого Swift-кода. Вызов Swift-функций или методов с помощью указателя на функцию C не поддерживается текущей реализацией языка beta 4, согласно ответам на форуме Swift по адресу devforums.apple.com
Обновление: приведенный выше ответ устарел по состоянию на Swift 2.0
Одна из альтернатив заключается в том, чтобы поместить некоторые небольшие функции обратного вызова trampoline C в файл Objective C, который может взаимодействовать с Swift и иметь эти функции C, в свою очередь, вызывают блок или закрытие, которые могут быть в Swift-коде. Настройте обратные вызовы C с помощью Swift-замыканий, а затем передайте эти обратные вызовы C функциям CoreAudio.
Я не очень разбираюсь в аудио API, однако вы должны заменить UnsafePointer указателем на объект. например:
var clientData : AnyObject? var listenerProc : AudioFileStream_PropertyListenerProc = AudioFileStream_PropertyListenerProc.convertFromNilLiteral() var packetsProc : AudioFileStream_PacketsProc = AudioFileStream_PacketsProc.convertFromNilLiteral() var audioFileTypyeId : AudioFileTypeID = 0 AudioFileStreamOpen(&clientData, listenerProc, packetsProc, audioFileTypyeId, &streamId)Код инициализации для переменных listenerProc, packetsProc или других предназначен только для обхода ошибки компилятора.
В вашей ситуации попробуйте заменить 'self as UnsafePointer' на '&self'. Однако "я" должно быть чем-то, что может быть преобразовано в совместимые данные тип.
Comments