Swift 4 доступа к значениям структуры C в библиотеке
Я пытаюсь получить доступ к значениям C, хранящимся в библиотеке Aubio, и считаю, что именно так я получаю доступ к значению Struct.
Библиотека имеет функцию C Struct и 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;
}
Вернувшись к быстрому, я затем прочитал данные, как было предложено:
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, который делает это:
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.
1 ответ
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)
}