Я пытаюсь воспроизвести аудио для приложения, которое я создаю, но столкнулся с проблемой с библиотекой, которую использую. Эта библиотека является 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.
Вероятно, в первой строке:
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 () нельзя использовать, если ваша программа связана с другой средой выполнения, нежели библиотека. Это может быть проблемой.
Других решений пока нет …