swift 4 访问库中的 C 结构值
swift 4 access C struct values in library
我正在尝试访问存储在 Aubio 库中的 C 值,我相信这就是我访问 Struct 值的方式。
该库具有 C 结构和 fvec_get_data 函数:
typedef struct {
uint_t length; /**< length of buffer */
smpl_t *data; /**< data vector of length ::fvec_t.length */
} fvec_t;
//in fvec.c
smpl_t * fvec_get_data(const fvec_t *s) {
return s->data;
}
回到swift然后我按照提示读入数据:
let oout = new_fvec(n_coefs)
let c = new_aubio_mfcc(win_s, n_filters, n_coefs, samplerate);
var read: uint_t = 0
var dataStore = [smpl_t]()
while (true) {
aubio_source_do(b, a, &read)
aubio_mfcc_do(c, iin, oout)
dataStore.append(fvec_get_data(oout).pointee)
total_frames += read
if (read < hop_size) { break }
}
然而,这并没有检索到所有数据,数组中只有第一个值。相比之下,在 while 循环中你可以调用:
fvec_print(oout) // this prints out ALL values not just the first
...
查看执行此操作的 c code:
void fvec_print(const fvec_t *s) {
uint_t j;
for (j=0; j< s->length; j++) {
AUBIO_MSG(AUBIO_SMPL_FMT " ", s->data[j]);
}
AUBIO_MSG("\n");
}
非常感谢任何关于如何将所有值输入 Swift 的建议。
fvec_get_data(oout)
和out.data
一样,都是指向第一个的指针
元素,而 out.data.pointee
只是第一个元素本身。
如同在 C 代码中一样,您可以使用
遍历所有数据元素
if let data = fvec_get_data(oout) {
for j in 0..<Int(n_coefs) {
dataStore.append(data[j])
}
}
这可以通过创建 UnsafeBufferPointer
来简化
这是一个 Sequence
:
if let data = fvec_get_data(oout) {
let buffer = UnsafeBufferPointer(start: data, count: Int(n_coefs))
dataStore.append(contentsOf: buffer)
}
我正在尝试访问存储在 Aubio 库中的 C 值,我相信这就是我访问 Struct 值的方式。
该库具有 C 结构和 fvec_get_data 函数:
typedef struct {
uint_t length; /**< length of buffer */
smpl_t *data; /**< data vector of length ::fvec_t.length */
} fvec_t;
//in fvec.c
smpl_t * fvec_get_data(const fvec_t *s) {
return s->data;
}
回到swift然后我按照提示读入数据:
let oout = new_fvec(n_coefs)
let c = new_aubio_mfcc(win_s, n_filters, n_coefs, samplerate);
var read: uint_t = 0
var dataStore = [smpl_t]()
while (true) {
aubio_source_do(b, a, &read)
aubio_mfcc_do(c, iin, oout)
dataStore.append(fvec_get_data(oout).pointee)
total_frames += read
if (read < hop_size) { break }
}
然而,这并没有检索到所有数据,数组中只有第一个值。相比之下,在 while 循环中你可以调用:
fvec_print(oout) // this prints out ALL values not just the first
...
查看执行此操作的 c code:
void fvec_print(const fvec_t *s) {
uint_t j;
for (j=0; j< s->length; j++) {
AUBIO_MSG(AUBIO_SMPL_FMT " ", s->data[j]);
}
AUBIO_MSG("\n");
}
非常感谢任何关于如何将所有值输入 Swift 的建议。
fvec_get_data(oout)
和out.data
一样,都是指向第一个的指针
元素,而 out.data.pointee
只是第一个元素本身。
如同在 C 代码中一样,您可以使用
遍历所有数据元素if let data = fvec_get_data(oout) {
for j in 0..<Int(n_coefs) {
dataStore.append(data[j])
}
}
这可以通过创建 UnsafeBufferPointer
来简化
这是一个 Sequence
:
if let data = fvec_get_data(oout) {
let buffer = UnsafeBufferPointer(start: data, count: Int(n_coefs))
dataStore.append(contentsOf: buffer)
}