в любом случае, чтобы ограничить размер буфера AvAudioEngine? - PullRequest
0 голосов
/ 17 апреля 2019

Я не могу найти где-нибудь, как я могу ограничить буфер вывода avaudioengine или узлов микшера? я нашел это с сайта учебника raywenderlich, но они говорят, что размер буфера не гарантируется

"installTap (onBus: 0, bufferSize: 1024, format: format) предоставляет вам> доступ к аудиоданным на выходной шине mainMixerNode. Вы> запрашиваете размер буфера в 1024 байта, но запрошенный размер не равен ' t> гарантировано, особенно если вы запрашиваете слишком маленький или> большой буфер. В документации Apple не указано, что это за пределы. "

https://www.raywenderlich.com/5154-avaudioengine-tutorial-for-ios-getting-started

Я уже попробовал методы installTap и SetCurrentIOBufferFrameSize (OSstatus), но все они не работают с ограничением буфера.

func SetCurrentIOBufferFrameSize(inAUHAL: AudioUnit,inIOBufferFrameSize: UInt32) -> OSStatus {
        var inIOBufferFrameSize = inIOBufferFrameSize
        var propSize = UInt32(MemoryLayout<UInt32>.size)
        return AudioUnitSetProperty(inAUHAL, AudioUnitPropertyID(kAudioUnitProperty_ScheduledFileBufferSizeFrames), kAudioUnitScope_Global, 0, &inIOBufferFrameSize, propSize)
    }
func initalizeEngine() {

sampleRateConversionRatio = Float(44100 / SampleRate)

 engine = AVAudioEngine()
        SetCurrentIOBufferFrameSize(inAUHAL: engine.outputNode.audioUnit!, inIOBufferFrameSize: 15)

     do {
            try AVAudioSession.sharedInstance().setCategory(.playAndRecord , mode: .default , options: .defaultToSpeaker)
            try AVAudioSession.sharedInstance().setPreferredIOBufferDuration(ioBufferDuration)
            try AVAudioSession.sharedInstance().setPreferredSampleRate(Double(SampleRate))
            try AVAudioSession.sharedInstance().setPreferredInputNumberOfChannels(channelCount)

        } catch {

            assertionFailure("AVAudioSession setup error: \(error)")
        }

}
func startRecording() {

   downMixer.installTap(onBus: 0, bufferSize: bufferSize, format: format) { buffer, when in

            self.serialQueue.async {

                let pcmBuffer = AVAudioPCMBuffer(pcmFormat: self.format16KHzMono, frameCapacity: AVAudioFrameCount(Float(buffer.frameCapacity)/self.sampleRateConversionRatio))
                var error: NSError? = nil

                let inputBlock: AVAudioConverterInputBlock = {inNumPackets, outStatus in
                    outStatus.pointee = AVAudioConverterInputStatus.haveData
                    return buffer
                }

                self.formatConverter.convert(to: pcmBuffer!, error: &error, withInputFrom: inputBlock)

                if error != nil {
                    print(error!.localizedDescription)
                }
                else if let channelData = pcmBuffer!.int16ChannelData {

                    let channelDataPointer = channelData.pointee
                    let channelData = stride(from: 0,
                                             to: Int(pcmBuffer!.frameLength),
                                             by: buffer.stride).map{ channelDataPointer[$0] }
                    //Return channelDataValueArray
                    let data = Data(fromArray: channelData)
                    var byteArray = data.toByteArray()
                }
            }
        }
}
...