void CAudioChannel::Stop (void) { m_info.bPlaying = 0; m_info.nSoundObj = -1; m_info.bPersistent = 0; #if USE_OPENAL if (gameOpts->sound.bUseOpenAL) { if (m_info.source != 0xFFFFFFFF) alSourceStop (m_info.source); } #endif #if USE_SDL_MIXER if (audio.Available () && gameOpts->sound.bUseSDLMixer) { if (m_info.mixChunkP) { Mix_HaltChannel (m_info.nChannel); if (m_info.bBuiltIn) m_info.bBuiltIn = 0; else Mix_FreeChunk (m_info.mixChunkP); m_info.mixChunkP = NULL; } //Mix_FadeOutChannel (nChannel, 500); } #endif if (m_info.bResampled) { m_info.sample.Destroy (); m_info.bResampled = 0; } }
//changed on 980905 by adb to cleanup, add nPan support and optimize mixer void _CDECL_ CAudio::MixCallback (void* userdata, Uint8* stream, int len) { if (!audio.Available ()) return; memset (stream, 0x80, len); // fix "static" sound bug on Mac OS X CAudioChannel* channelP = audio.m_channels.Buffer (); for (int i = audio.MaxChannels (); i; i--, channelP++) channelP->Mix (reinterpret_cast<ubyte*> (stream), len); }
void Mix_VolPan (int nChannel, int nVolume, int nPan) { #if USE_SDL_MIXER if (!audio.Available ()) return; if (gameOpts->sound.bUseSDLMixer && (nChannel >= 0)) { if (nVolume) { nVolume = (FixMul (nVolume, audio.Volume ()) + (SOUND_MAX_VOLUME / MIX_MAX_VOLUME) / 2) / (SOUND_MAX_VOLUME / MIX_MAX_VOLUME); if (!nVolume) nVolume = 1; Mix_Volume (nChannel, nVolume); if (nPan >= 0) { nPan /= (32767 / 127); Mix_SetPanning (nChannel, (ubyte) nPan, (ubyte) (254 - nPan)); } } } #endif }