2015-07-02 36 views
1

我似乎无法绕过这个问题。试图玩音频文件流服务Xcode 7 - 无法调用AudioFileStreamOpen

一些代码:

import Foundation 
import AudioToolbox 

public class StreamingPlayback { 
    var audioFileStream: UnsafeMutablePointer<AudioFileStreamID>? 
    var inClientData: UnsafeMutablePointer<Void> = nil 

    init() { 
    } 

    func start() { 
     AudioFileStreamOpen(&inClientData, propertyProc, packetProc, kAudioFileMP3Type, &audioFileStream) 
    } 

    func propertyProc(inClientData: UnsafeMutablePointer<()>,inFileStreamId: AudioFileStreamID,inPropertyId: AudioFileStreamPropertyID,ioFlags: UnsafeMutablePointer<UInt32>) -> Void { 
    } 

    func packetProc(inClientData: UnsafeMutablePointer<()>,inNumberOfBytes: UInt32,inNumberOfPackets: UInt32, UnsafeMutablePointer<()>, inPacketDescriptions: UnsafePointer<AudioStreamPacketDescription>) -> Void { 
    } 
} 

这给了我:

Cannot invoke 'AudioFileStreamOpen' with an argument list of type '(inout UnsafeMutablePointer<Void>, (UnsafeMutablePointer<()>, inFileStreamId: AudioFileStreamID, inPropertyId: AudioFileStreamPropertyID, ioFlags: UnsafeMutablePointer<UInt32>) -> Void, (UnsafeMutablePointer<()>, inNumberOfBytes: UInt32, inNumberOfPackets: UInt32, UnsafeMutablePointer<()>, inPacketDescriptions: UnsafePointer<AudioStreamPacketDescription>) -> Void, AudioFileTypeID, inout UnsafeMutablePointer<AudioFileStreamID>?)' 

Expected an argument list of type '(UnsafeMutablePointer<Void>, AudioFileStream_PropertyListenerProc, AudioFileStream_PacketsProc, AudioFileTypeID, UnsafeMutablePointer<AudioFileStreamID>)' 

谁能告诉我什么,我做错了什么?

回答

0

我刚碰到这个问题。尽管Swift 2.0支持c函数回调,但仍然有一些令人兴奋的事情发生。但我确实找到了解决方法。试试这个:

@objc protocol HandleAudioPacketsDelegate { 
    func handlePacketsProc(ioActionFlags: UnsafeMutablePointer<AudioUnitRenderActionFlags>, 
     inTimeStamp: UnsafePointer<AudioTimeStamp>, 
     inBufNumber: UInt32, 
     inNumberFrames: UInt32, 
     ioData: UnsafeMutablePointer<AudioBufferList>) -> OSStatus 
} 

func packetsProc(inRefCon: UnsafeMutablePointer<Void>, 
    ioActionFlags: UnsafeMutablePointer<AudioUnitRenderActionFlags>, 
    inTimeStamp: UnsafePointer<AudioTimeStamp>, 
    inBufNumber: UInt32, 
    inNumberFrames: UInt32, 
    ioData: UnsafeMutablePointer<AudioBufferList>) 
    -> OSStatus 
{ 
    let delegate = unsafeBitCast(inRefCon, HandleAudioPacketsDelegate.self) 
    let result = delegate.handlePacketsProc(ioActionFlags, 
     inTimeStamp: inTimeStamp, 
     inBufNumber: inBufNumber, 
     inNumberFrames: inNumberFrames, 
     ioData: ioData) 
    return result 
} 

然后在StreamingPlayback类使用这种方法回调:

func handlePacketsProcioActionFlags: UnsafeMutablePointer<AudioUnitRenderActionFlags>, 
    inTimeStamp: UnsafePointer<AudioTimeStamp>, 
    inBufNumber: UInt32, 
    inNumberFrames: UInt32, 
    ioData: UnsafeMutablePointer<AudioBufferList>) -> OSStatus { 
} 
+0

我可以步行通过这个通过Skype /电子邮件/ FB使者。如果你愿意的话,也很乐意谈论音频流/迅速。这个组合有很多障碍,只有一个知道与这两者合作的小社区。你的联系信息是什么? – 3254523