У меня есть мостовая функция в Swift, один из аргументов которой в C - AudioBufferList *
. В Swift это генерирует UnsafePointer<AudioBufferList>
. Мне удастся опозорить указатель, вызвав audioData[0]
(есть ли лучший способ?). Но я борюсь со следующими двумя уровнями: массив .mBuffers
AudioBuffer
и их членов void *
/UnsafePointer<()>
.mData
.
В C это просто
Float32 *audioData = (Float 32*)abl->mBuffers[0]->mData;
output = audioData[sampleNum]...
В Swift первая особенность заключается в том, что он не позволит мне получить доступ к элементам mBuffers
, но совершенно счастлив, когда я обращаюсь к нему как к свойству. Другими словами, это работает и даже имеет правильные данные (для первого члена mBuffers
я полагаю)...
println(abl[0].mBuffers.mNumberChannels) // But .mBuffers should be an []!
Во-вторых, он позволяет мне распечатывать индексы .mData
, но значение всегда ()
println(abl[0].mBuffers.mData[10]) // Prints '()'
Я пробовал различные операции кастинга и доступ с несколькими индексами, но безрезультатно... любые идеи?
Ниже приведены определения C и Swift для AudioBufferList
и AudioBuffer
для удобства...
// 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<()>
}