Tôi có chức năng chuyển tiếp trong Swift, một trong các đối số của nó trong C là AudioBufferList *
. Trong Swift, điều này tạo ra một UnsafePointer<AudioBufferList>
. Tôi đã quản lý để trì hoãn con trỏ bằng cách gọi audioData[0]
(có cách nào tốt hơn không?). Nhưng tôi đang vật lộn với 2 tầng tiếp theo: mảng .mBuffers
của AudioBuffer
và void *
/UnsafePointer<()>
.mData
thành viên của chúng tôi.Sử dụng AudioBufferList với Swift
Trong C nó sẽ chỉ đơn giản là
Float32 *audioData = (Float 32*)abl->mBuffers[0]->mData;
output = audioData[sampleNum]...
Trong Swift điều kỳ lạ đầu tiên là nó sẽ không cho phép tôi truy cập vào các yếu tố của mBuffers
nhưng là hoàn toàn hạnh phúc khi tôi truy cập vào nó như là một tài sản. Nói cách khác, các công trình này và thậm chí còn có dữ liệu chính xác (đối với thành viên đầu tiên của mBuffers
tôi đoán) ...
println(abl[0].mBuffers.mNumberChannels) // But .mBuffers should be an []!
Thứ hai, nó cho phép của tôi in ra .mData
subscript nhưng giá trị luôn luôn là ()
println(abl[0].mBuffers.mData[10]) // Prints '()'
Tôi đã thử nhiều tính năng truyền khác nhau và truy cập với nhiều chỉ mục nhưng không có kết quả ... bất kỳ ý tưởng nào?
Dưới đây là C và định nghĩa Swift cho AudioBufferList
và AudioBuffer
để thuận tiện ...
// C
struct AudioBufferList
{
UInt32 mNumberBuffers;
AudioBuffer mBuffers[1]; // this is a variable length array of mNumberBuffers elements
// ...and a bit more for c++
}
struct AudioBuffer
{
UInt32 mNumberChannels;
UInt32 mDataByteSize;
void* mData;
};
...
// SWIFT
struct AudioBufferList {
var mNumberBuffers: UInt32
var mBuffers: (AudioBuffer)
}
struct AudioBuffer {
var mNumberChannels: UInt32
var mDataByteSize: UInt32
var mData: UnsafePointer<()>
}
Hi, đã không có một cơ hội để thử này ra trong dự án của tôi nhưng chỉ muốn nói nhanh rằng 'reinterpretCast' có thể giúp quá ... –
Đó là một điểm tốt, nhưng tôi không chắc chắn làm thế nào để sử dụng nó ở đây. Nó không có giấy tờ nên tôi không biết liệu nó có tác dụng trên cùng một vị trí trong bộ nhớ, sao chép mọi thứ xung quanh hay không ... – jtbandes
thx. quyết định cho bạn tín dụng ngay cả khi Adam tốt hơn :) –