2011-09-22 16 views
5

EDITAR: Bueno ... eso es muy interesante. Hice ajustes en un puntero y pasé eso. Funcionó maravillosamente. Entonces, esto está resuelto. Lo dejaré abierto para cualquiera que tenga curiosidad por la respuesta.FMod Memory Stream Problema

Tengo un problema al crear un sonido en FMod a partir de una secuencia de memoria. Miré el ejemplo loadfrommemory enviado con FMod y lo seguí. En primer lugar, el código que estoy usando ...

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); 
} 

Como esto es así, tengo una violación de acceso en tempSys-> createSound(). Confirmé que tempSys es válido, ya que funciona cuando se crean sonidos desde un archivo. También confirmó que el carácter * con mis datos es válido al escribir los contenidos en un archivo, que luego pude abrir en el Reproductor multimedia. Tengo la sensación de que hay un problema con la configuración. Si cambio ese parámetro a 0, el programa no explota y termino con result = FMOD_ERR_INVALID_HANDLE (lo cual tiene sentido considerando que el 3er parámetro es 0). ¿Alguna idea de lo que estoy haciendo mal?

Además, ignore el uso de std :: string, lo estaba usando para algunas pruebas.

Respuesta

2

Se soluciona al convertir la configuración en un puntero. Vea el código a continuación:

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

Usted necesita configuración de memset antes de usarla.

memset (& configuración, 0, sizeof (FMOD_CREATESOUNDEXINFO);.

De lo contrario, contendrá la basura y potencialmente chocar