mAudioDataから値を取り出したい
■環境
Mac/High Sierra 10.13.6/swift4.2/xcode 10.0
mAudioDataから音声データを取り出したいのですが、
https://developer.apple.com/documentation/audiotoolbox/audioqueuebuffer/1502113-maudiodata
を参照してもよくわかりませんでした。
試しに
let opaquePtr = OpaquePointer(inBuffer.pointee.mAudioData)
let mAudioDataPrt = UnsafeMutablePointer<Int8>(opaquePtr)
for i in 0..<numPackets{
print(mAudioDataPrt[Int(i)])
}
としたところ値は取り出せたのですが、値が正しいのかが全くわかりませんでした。
mAudioDataは下記のコールバック関数で取得しており、
AudioServiceクラス内部のprepareForRecordメソッドで基本的に準備をし
そのあとで
let err: OSStatus = AudioQueueStart(audioQueueObject!, nil)
を呼んで録音をスタートしていました。
memcpyでバッファにコピーすればよいというのも理解はしているのですが、
今やりたいことはmAudioDataを配列として取り出したいことです。
動的にバッファの先頭の何バイトかを削除しつつ末尾に付け加えることをしたいのですが、
何分にもバッファだと扱いづらいため、配列で扱うことを考えています。
==========================コールバック関数============================
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);
}
=====================以下AudioServiceのメソッド======================
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)
}
}