When playing an uncompressed WAV sound file from memory using FMOD_OPENMEMORY_POINT with FMOD_CREATESAMPLE, there is an audible “click” or “pop” at the end when the sound stops playing. If I use FMOD_OPENMEMORY or FMOD_CREATESTREAM instead, there is no problem. I have tested my sound files in several different audio programs and players, including Audacity, and I’ve even played them through another opensource audio library (SoLoud on GitHub) from memory, and they only seem to produce the “click” in FMOD. The sound files I’m using are uncompressed WAVs in 16-bit signed int and 32-bit float. IMA-ADPCM files seem to work fine. What is most puzzling is that some uncompressed WAVs work fine, but most I’ve tried produce the “click”/“pop”.
I just would like to know if anyone has any insight as to why this might happen. I’ve provided a minimal working example that reproduces the problem below. I am using the FMOD API version 1.10.03 on Windows 7 64-bit with Visual Studio 2015. I get the same results for 32-bit/64-bit and logging/non-logging versions of the FMOD runtime.
// My code:
int main(int, char**) {
FMOD::System* system = nullptr;
FMOD::System_Create(&system);
system->init(512, FMOD_INIT_NORMAL, nullptr);
std::vector<char> buf = getBytesFromFile("Media/stone_impact.wav");
FMOD_MODE mode = FMOD_OPENMEMORY_POINT | FMOD_CREATESAMPLE;
FMOD_CREATESOUNDEXINFO exinfo;
memset(&exinfo, 0, sizeof(exinfo));
exinfo.cbsize = sizeof(exinfo);
exinfo.length = (unsigned int)buf.size();
FMOD::Sound* sound = nullptr;
system->createSound((const char*)buf.data(), mode, &exinfo, &sound);
FMOD::Channel* channel = nullptr;
system->playSound(sound, nullptr, false, &channel);
// the sound is about half a second long, so this is just long enough to hear the artifact
std::this_thread::sleep_for(std::chrono::seconds(2));
sound->release();
system->release();
return 0;
}