構築しているアプリケーションのオーディオをストリーミングしようとしていますが、使用しているライブラリで問題が発生しました。このライブラリはlibSndFileです。メモリ内のバッファにあるlibSndFileデコードデータが必要なため、sf_open_fd(int fd, int mode, SF_INFO *info, int close_desc);
代わりにこの関数を使用して呼び出すと、ライブラリには常にSEGFAULTがあります。sf_open(const char *path, int mode, SF_INFO *info)
ドキュメントを理解できなかった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;
私は本当にディスクに書き込みをしたくないのですが、有効なファイル記述子とストリームを取得する必要がありました。
注:私はG++4.6.3を使用してXubuntu12.04でコンパイルしています。