2011-09-22 4 views
5

편집 : 글쎄요 ... 매우 흥미 롭습니다. 내가 포인터로 세팅하고 통과시켰다. 아름답게 일했습니다. 그래서, 이것은 해결되었습니다. 나는 그 대답에 호기심이 많은 사람들을 위해 그것을 열어 둘 것이다.FMod 메모리 스트림 문제

메모리 스트림에서 FMod에 사운드를 생성하는 데 문제가 있습니다. FMod와 함께 제공되는 loadfrommemory 예제를 살펴본 후 그것을 따라갔습니다. 이 같은이기 때문에 첫째, 내가 사용하고 코드 ...

CSFX::CSFX(CFileData *fileData) 
{ 
FMOD_RESULT result; 
FMOD_CREATESOUNDEXINFO settings; 
settings.cbsize = sizeof(FMOD_CREATESOUNDEXINFO); 
settings.length = fileData->getSize(); 
_Sound = 0; 
std::string temp = ""; 

for (int i = 0; i < fileData->getSize(); i++) 
    temp += fileData->getData()[i]; 

result = tempSys->createSound(temp.c_str(), FMOD_SOFTWARE | FMOD_OPENMEMORY, &settings,  &_Sound); 
} 

, 나는> createSound tempSys-에 액세스 위반을 얻을 수(). tempSys는 파일에서 사운드를 만들 때 작동하므로 유효하다는 것을 확인했습니다. 나는 또한 내 데이터가있는 char *가 미디어 플레이어에서 열 수있는 파일에 내용을 쓰는 것으로 유효하다는 것을 확인했습니다. 설정에 문제가 있다는 느낌이 들었습니다. 해당 매개 변수를 0으로 변경하면 프로그램이 폭발하지 않고 result = FMOD_ERR_INVALID_HANDLE로 끝납니다 (이는 세 번째 매개 변수가 0이라고 생각하면 의미가 있습니다). 내가 뭘 잘못하고 있는거야?

또한 std :: string을 사용하지 말고 시험용으로 사용했습니다.

답변

2

설정을 포인터로 바꾸어서 해결했습니다. 아래 코드를 참조하십시오 :

CSFX::CSFX(CFileData *fileData) 
{ 
FMOD_RESULT result; 
FMOD_CREATESOUNDEXINFO * settings; 

_Sound = 0; 
std::string temp = ""; 

for (int i = 0; i < fileData->getSize(); i++) 
    temp += fileData->getData()[i]; 
settings = new FMOD_CREATESOUNDEXINFO(); 
settings->cbsize = sizeof(FMOD_CREATESOUNDEXINFO); 
settings->length = fileData->getSize(); 

result = tempSys->createSound(temp.c_str(), FMOD_SOFTWARE | FMOD_OPENMEMORY, settings, &_Sound); 
delete settings; 
settings = 0; 
} 
1

사용하기 전에 설정을 memset해야합니다.

memset 함수 (& 설정, 0, sizeof 연산자 (FMOD_CREATESOUNDEXINFO). 그렇지 않으면

이 쓰레기를 포함하고 잠재적으로 충돌합니다