libsndfile всегда вызывает ошибки при использовании sf_open_fd ()

Я пытаюсь воспроизвести аудио для приложения, которое я создаю, но столкнулся с проблемой с библиотекой, которую использую. Эта библиотека является libSndFile. В библиотеке всегда есть SEGFAULT, когда я звоню sf_open_fd(int fd, int mode, SF_INFO *info, int close_desc); Я использую эту функцию вместо sf_open(const char *path, int mode, SF_INFO *info) потому что мне нужно иметь libSndFile декодировать данные, которые находятся в буфере в памяти. Я не мог понять смысл sf_virtual_open() документация, поэтому я использую это вместо. Я могу получить действительный файловый дескриптор, используя fileno () (обычно он возвращает 14), и мой поток FILE действителен, так что это просто эта функция. Я не знаю, где это может быть SEGFAULTing или на что. Есть ли лучший способ для меня, чтобы libSndFile декодировал буфер памяти, или я не правильно что-то использую?

Вот код проблемы (я добавил несколько комментариев, чтобы иметь больше смысла)

memset(&/*SF_INFO*/mInfo, 0, sizeof(SF_INFO));

/* FILE* */mpFileStream = tmpfile();

fwrite(/* void* */aBuffer, /*int*/aSize, 1, mpFileStream);

int iDescriptor = fileno(mpFileStream);

if(iDescriptor == -1)
{
return /*enum EError*/EError_Unknown;
}

/* SNDFILE* */mFile = sf_open_fd(iDescriptor, SFM_READ, mInfo, SF_TRUE);

return mFile != NULL ? /*enum EError*/EError_None : /*enum EError*/EError_Unknown;

Я действительно предпочитаю не записывать на диск, но мне нужно было получить действительный дескриптор файла и поток.

ПРИМЕЧАНИЕ: я компилирую на Xubuntu 12.04 с g ++ 4.6.3.

1

Решение

Вероятно, в первой строке:

MemSet (&/ * SF_INFO * / mInfo, 0, sizeof (SF_INFO));

Вы вызываете sf_open_fd () позже, используя mInfo в качестве параметра указателя, поэтому я предполагаю, что mInfo на самом деле является SF_INFO *, а не SF_INFO. memset () допускает любой тип указателя, поэтому вы не получите ошибку компиляции.

Кстати, вам не нужно записывать на диск — tmpfile () возвращает открытый файл, который должен работать с fileno ().

Изменить: На самом деле перечитывая ваш вопрос, я, возможно, неправильно понял, когда вы сказали, что не знаете, где происходит SEGFAULT. В документации по libsndfile я обнаружил, что sf_open_fd () нельзя использовать, если ваша программа связана с другой средой выполнения, нежели библиотека. Это может быть проблемой.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]