Как использовать 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



Ошибка компиляции

680   2  

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'. Однако "я" должно быть чем-то, что может быть преобразовано в совместимые данные тип.

Https://developer.apple.com/library/prerelease/ios/documentation/MusicAudio/Reference/AudioStreamReference/index.html#//apple_ref/c/func/AudioFileStreamOpen

Comments

    Ничего не найдено.