

■環境  
Mac/High Sierra 10.13.6/swift4.2/xcode 10.0

mAudioDataから音声データを取り出したいのですが、  
<https://developer.apple.com/documentation/audiotoolbox/audioqueuebuffer/1502113-maudiodata>  
を参照してもよくわかりませんでした。

試しに

[code]

    let opaquePtr = OpaquePointer(inBuffer.pointee.mAudioData)
    let mAudioDataPrt = UnsafeMutablePointer<Int8>(opaquePtr)
    for i in 0..<numPackets{
        print(mAudioDataPrt[Int(i)])
    }
    
[/code]

としたところ値は取り出せたのですが、値が正しいのかが全くわかりませんでした。  
mAudioDataは下記のコールバック関数で取得しており、  
AudioServiceクラス内部のprepareForRecordメソッドで基本的に準備をし  
そのあとで

[code]

    let err: OSStatus = AudioQueueStart(audioQueueObject!, nil)
    
[/code]

を呼んで録音をスタートしていました。  
memcpyでバッファにコピーすればよいというのも理解はしているのですが、  
今やりたいことはmAudioDataを配列として取り出したいことです。  
動的にバッファの先頭の何バイトかを削除しつつ末尾に付け加えることをしたいのですが、  
何分にもバッファだと扱いづらいため、配列で扱うことを考えています。

==========================コールバック関数============================

[code]

    func AQAudioQueueInputCallback2(inUserData: UnsafeMutableRawPointer?,
                               inAQ: AudioQueueRef,
                               inBuffer: AudioQueueBufferRef,
                               inStartTime: UnsafePointer<AudioTimeStamp>,
                               inNumberPacketDescriptions: UInt32,
                               inPacketDescs: UnsafePointer<AudioStreamPacketDescription>?) {
        let audioService = unsafeBitCast(inUserData!, to:AudioService.self)
        audioService.writePackets(inBuffer: inBuffer)
        AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, nil);
    }
    
[/code]

=====================以下AudioServiceのメソッド======================

[code]

    func prepareForRecord() {
        print("prepareForRecord")
        var audioFormat = self.audioFormat
    
        AudioQueueNewInput(&audioFormat,
                           AQAudioQueueInputCallback,
                           unsafeBitCast(self, to: UnsafeMutableRawPointer.self),
                           CFRunLoopGetCurrent(),
                           CFRunLoopMode.commonModes.rawValue,
                           0,
                           &audioQueueObject)
    
        startingPacketCount = 0;
        var buffers = Array<AudioQueueBufferRef?>(repeating: nil, count: 3)
        let bufferByteSize: UInt32 = numPacketsToWrite * audioFormat.mBytesPerPacket
    
        for bufferIndex in 0 ..< buffers.count {
            AudioQueueAllocateBuffer(audioQueueObject!, bufferByteSize, &buffers[bufferIndex])
            AudioQueueEnqueueBuffer(audioQueueObject!, buffers[bufferIndex]!, 0, nil)
        }
    }
    
[/code]


CC BY-SA 4.0
2018-10-24T02:38:53.030
49593
2018-10-24T02:38:53.030
25745
question
xcode swift4
mAudioDataから値を取り出したい