1

構築しているアプリケーションのオーディオをストリーミングしようとしていますが、使用しているライブラリで問題が発生しました。このライブラリは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でコンパイルしています。

4

1 に答える 1

4

おそらく最初の行:

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

後でポインタパラメータとしてmInfoを使用してsf_open_fd()を呼び出しているので、mInfoは実際にはSF_INFOではなくSF_INFO*であると推測しています。memset()は任意のポインタ型を許可するため、コンパイルエラーは発生しません。

ちなみに、ディスクに書き込む必要はありません。tmpfile()は、fileno()で動作する開いているファイルを返します。

編集:実際にあなたの質問を読み直すあなたがSEGFAULTがどこで起こっているのかわからないと言ったとき、私は誤解したかもしれません。libsndfileのドキュメントで私が見つけた1つのことは、プログラムがライブラリとは異なるランタイムに対してリンクされている場合、sf_open_fd()を使用できないことです。それが問題かもしれません。

于 2012-11-19T17:36:04.597 に答える