0
0

So I have the following code:
[code:1rifj8d1]
FMOD_RESULT hRes;
FMOD::Sound* aSound = NULL;

FMOD_CREATESOUNDEXINFO exinfo;
memset(&exinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO));
exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO);
exinfo.length = aFile->GetSize();

DWORD a2Dor3D = FMOD_2D;
if (mIs3DSounds)
    a2Dor3D = FMOD_3D;

if (mLoadUsingStream)
    hRes = mFMODSystem->createStream((const char *)aFile->GetData(), FMOD_HARDWARE | FMOD_OPENMEMORY | a2Dor3D | FMOD_CREATECOMPRESSEDSAMPLE | FMOD_LOWMEM , &exinfo, &aSound);
else
    hRes = mFMODSystem->createSound((const char *)aFile->GetData(), FMOD_HARDWARE | FMOD_OPENMEMORY | a2Dor3D | FMOD_CREATECOMPRESSEDSAMPLE | FMOD_LOWMEM , &exinfo, &aSound);[/code:1rifj8d1]

Where (const char *)aFile->GetData() is the name of a compressed file that has been loaded into memory that I want to play. The code works fine on 360 but I always get FMOD_ERR_INVALID_PARAM on Windows.

Removing the exinfo structure eliminates the invalid param error but replaces it with a FMOD_ERR_FORMAT error.

I’m relatively inexperienced with FMOD so if there’s something I’m missing here please let me know. This code was originally written by someone else who I am not able to contact.

  • You must to post comments
0
0

The first thing I notice is that you’re combining compressed samples with hardware sounds. Those two are incompatible. If you want compressed samples, they must be software sounds. Try changing FMOD_HARDWARE to FMOD_SOFTWARE.

Also, createStream() is basically the same as createSound() but passing in FMOD_CREATESTREAM, which is also incompatible with FMOD_CREATECOMPRESSEDSAMPLE. Try removing FMOD_CREATECOMPRESSEDSAMPLE from the createStream() call.

To open a file from memory, you’ll definitely need the EXINFO structure. However, I’m confused. You say:
[quote:2rgoyd2k](const char *)aFile->GetData() is the name of a compressed file that has been loaded into memory[/quote:2rgoyd2k]
Is it the name of the file, or is it a pointer to the file data? You should pass in a pointer to the actual file data, not the name of the file.

Assuming that that’s correct, I would check that the GetSize() and GetData() calls are returning the values that you’re expecting them to.

Hope that helps!

  • You must to post comments
0
0

Sadly that didn’t seem to work, I even removed all the flags except FMOD_OPENMEMORY and I still get invalid param.

aFile->GetSize(); does appear to be returning the correct size.

aFile->GetData() returns a BYTE* that points to the file data, not the file name sorry for the confusion.

I know this code works on 360 but I’m confused as to why it doesn’t work on PC…

  • You must to post comments
0
0

I should also note that removing the passed in exinfo changes the error from invalid param to file not found (which makes sense as) so I don’t know if this indicates that there is something wrong with how I’m doing the exinfo or not. It lines up okay with the samples.

  • You must to post comments
0
0

That is odd.

My next suggestion would be to link against the logging version of FMOD (fmodexL.lib and fmodexL.dll) and see what extra information it gives you. (Also have a look at FMOD::Debug_SetLevel() when linking against fmodexL.lib.)

  • You must to post comments
0
0

I think I’ve discovered the issue. I was using a combination of FMOD for 360 and FMOD for PC, by cleaning things up so I am only using FMOD PC everything works as originally coded.

  • You must to post comments
Showing 5 results
Your Answer

Please first to submit.