static mrb_value mrb_sdl2_mixer_set_distance(mrb_state *mrb, mrb_value self) { mrb_int channel, distance; mrb_get_args(mrb, "ii", &channel, &distance); return mrb_fixnum_value(Mix_SetDistance((int)channel, (Uint8)distance)); }
void SoundManager::playSound(int chunkIdx, Ogre::Vector3 soundPosition, Ogre::Camera* mCamera) { if (!initialized) { std::cout << "SoundManager: Manager not initialized." << std::endl; return; } if (sounding) { Mix_ChannelFinished(channelDoneWrapper); int channel = Mix_PlayChannel(-1, chunks[chunkIdx], 0); int dist = calcDistance(mCamera->getPosition(), soundPosition); // put this sound in our list of active sounds. Sound s; s.soundPosition = soundPosition; s.chunk = chunks[chunkIdx]; s.distance = dist; s.channel = channel; s.active = true; activeSounds.push_back(s); // Initialize sound position int rightIntensity = calcPanning(mCamera, soundPosition); Mix_SetPanning(s.channel, 254 - rightIntensity, rightIntensity); Mix_SetDistance(s.channel, dist); } }
static void do_distance_update(void) { static Uint8 distance = 1; static Uint8 distincr = 1; static int distanceok = 1; static Uint32 next_distance_update = 0; if ((distanceok) && (SDL_GetTicks() >= next_distance_update)) { distanceok = Mix_SetDistance(0, distance); if (!distanceok) { fprintf(stderr, "Mix_SetDistance(0, %d) failed!\n", (int) distance); fprintf(stderr, "Reason: [%s].\n", Mix_GetError()); } if (distance == 0) { printf("Distance at nearest point.\n"); distincr *= -1; } else if (distance == 255) { printf("Distance at furthest point.\n"); distincr *= -1; } distance += distincr; next_distance_update = SDL_GetTicks() + 15; } }
void SoundManager::SetVolume(int _channel, float _volume) { if(status_ != SoundStatus::OK) return; unsigned char distance = (1.0f - _volume) * 255; Mix_SetDistance(_channel, distance); }
void playBattleSound(int id, int x, int y) { float distance; int channel; float vol; if (player->alive == ALIVE_ALIVE) { lastPlayerX = player->x; lastPlayerY = player->y; } distance = getDistance(lastPlayerX, lastPlayerY, x, y); if (distance <= MAX_BATTLE_SOUND_DISTANCE) { channel = Mix_PlayChannel(-1, sounds[id], 0); if (channel != -1) { vol = 255; vol /= MAX_BATTLE_SOUND_DISTANCE; vol *= distance; Mix_SetDistance(channel, vol); } } }
// Volume 0-F1_0 int digi_mixer_start_sound(short soundnum, fix volume, int pan, int looping, int loop_start, int loop_end, int soundobj) { int mix_vol = fix2byte(fixmul(digi_volume, volume)); int mix_pan = fix2byte(pan); int mix_loop = looping * -1; int channel; if (!digi_initialised) return -1; Assert(GameSounds[soundnum].data != (void *)-1); mixdigi_convert_sound(soundnum); if (MIX_DIGI_DEBUG) con_printf(CON_DEBUG,"digi_start_sound %d, volume %d, pan %d (start=%d, end=%d)\n", soundnum, mix_vol, mix_pan, loop_start, loop_end); channel = Mix_PlayChannel(-1, &(SoundChunks[soundnum]), mix_loop); Mix_SetPanning(channel, 255-mix_pan, mix_pan); if (volume > F1_0) Mix_SetDistance(channel, 0); else Mix_SetDistance(channel, 255-mix_vol); return channel; }
/**\brief Plays the sound. */ bool Sound::Play( void ){ if ( this->sound == NULL ) return false; // Disable panning and distance int freechan = Audio::Instance().GetFreeChannel(); Mix_SetDistance( freechan, 0 ); Mix_SetPanning( freechan, 127, 127 ); Mix_Volume( freechan, this->volume ); this->channel = Audio::Instance().PlayChannel( freechan, this->sound, 0 ); if ( channel == -1 ) return false; return true; }
void SoundManager::updateSounds(Ogre::Camera* mCamera) { // Remove any sounds from our list of active sounds that might not be active. for(int i = 0; i < activeSounds.size(); i++) { Sound *s = &(activeSounds[i]); if(s->active == false) { // Reset sound position on the given channel, and remove the sound Mix_SetPanning(s->channel, 255, 255); Mix_SetDistance(s->channel, 0); activeSounds.erase(activeSounds.begin() + i); } } // update sound position for all active sounds for(int i = 0; i < activeSounds.size(); i++) { Sound *s = &(activeSounds[i]); int rightIntensity = calcPanning(mCamera, s->soundPosition); Mix_SetPanning(s->channel, 254 - rightIntensity, rightIntensity); int dist = calcDistance(mCamera->getPosition(), s->soundPosition); s->distance = dist; Mix_SetDistance(s->channel, dist); } }
static int lua_Mix_SetDistance(State & state){ Stack * stack = state.stack; int channel = MIX_CHANNEL_POST; Uint8 distance = 0; if (stack->is<LUA_TNUMBER>(1)){ channel = stack->to<int>(1); } if (stack->is<LUA_TNUMBER>(2)){ distance = static_cast<Uint8>(stack->to<int>(2)); } int result = Mix_SetDistance(channel, distance); stack->push<bool>(result != 0); return 1; }
int SoundSetChannelDistanceInt(int channel, unsigned char distance) { //FIXME: you know the drill if(Mix_Playing(channel)) { //TODO: how to moron check? distance wraps so it wont break either way if(Mix_SetDistance(channel, distance)) return 1; else return 0; //TODO: error checking? } else return 0; }
int SoundManager::PlayEnqueuedSample(std::string _filename, unsigned char _distance) { //Look the sound up, it's probably already loaded. If not then load it. if(status_ != SoundStatus::OK) return -1; Mix_Chunk* sample = GetChunk(_filename); if(sample) { //Play the sound int channel = Mix_PlayChannel(-1, sample, 0); if(channel >= 0) Mix_SetDistance(channel, _distance); return channel; } return -1; }
int SoundSetChannelDistanceFloat(int channel, float distance) { if(Mix_Playing(channel)) { distance = ClampFloat(distance, 0.0, 1.0); int dist; dist = (int)(255 * distance); //printf("Set distance to %d\n", dist); if(Mix_SetDistance(channel, dist)) return 1; else return 0; //TODO: error checking? } else return 0; }
/**\brief Plays the sound at a specified coordinate from origin. */ bool Sound::Play( Coordinate offset ){ if ( this->sound == NULL ) return false; // Distance fading double dist = this->fadefactor * offset.GetMagnitude(); if ( dist > 255 ) return false; // Sound is out of range Uint8 sounddist = static_cast<Uint8>( dist ); // Left-Right panning float panx = this->panfactor * static_cast<float>(offset.GetX())+127.f; Uint8 soundpan = 127; if ( panx < 0 ) soundpan = 0; else if ( panx > 254 ) soundpan = 254; else soundpan = static_cast<Uint8>( panx ); int freechan = Audio::Instance().GetFreeChannel(); if( Mix_SetDistance( freechan, sounddist ) == 0 ) LogMsg(ERR,"Set distance %d failed on channel %d.", sounddist, freechan ); //else // LogMsg(INFO,"Distance set to %d on channel %d.", sounddist, freechan ); /**\bug SDL_mixer bug possibly: Need to check whether SDL_mixer is getting * Left/Right speaker switched around. */ if( Mix_SetPanning( freechan, 254 - soundpan, soundpan ) == 0 ) LogMsg(ERR,"Set panning %d failed on channel %d.", soundpan - 127, freechan ); //else // LogMsg(INFO,"Panning set to %d on channel %d.", soundpan - 127, freechan ); Mix_Volume( freechan, this->volume ); this->channel = Audio::Instance().PlayChannel( freechan, this->sound, 0 ); if ( channel == -1 ) return false; return true; }
void reposition_sound(int id, unsigned int distance) { audio_lock lock; for (unsigned ch = 0; ch < channel_ids.size(); ++ch) { if (channel_ids[ch] != id) continue; if (distance >= DISTANCE_SILENT) { // Don't call Mix_FadeOutChannel if the channel's volume is set to // zero. It doesn't do anything in that case and the channel will // resume playing as soon as its volume is reset to a non-zero // value, which results in issues like sound sources deleted while // their volume is zero coming back to life and escaping Wesnoth's // sound source management code. if (Mix_Volume(ch, -1) == 0) { Mix_HaltChannel(ch); } else { Mix_FadeOutChannel(ch, 100); } } else { Mix_SetDistance(ch, distance); } } }
void play_sound_internal(const std::string& files, channel_group group, unsigned int repeats, unsigned int distance, int id, int loop_ticks, int fadein_ticks) { if(files.empty() || distance >= DISTANCE_SILENT || !mix_ok) { return; } audio_lock lock; // find a free channel in the desired group int channel = Mix_GroupAvailable(group); if(channel == -1) { LOG_AUDIO << "All channels dedicated to sound group(" << group << ") are busy, skipping.\n"; return; } Mix_Chunk *chunk; std::string file = pick_one(files); try { chunk = load_chunk(file, group); assert(chunk); } catch(const chunk_load_exception&) { return; } /* * This check prevents SDL_Mixer from blowing up on Windows when UI sound is played * in response to toggling the checkbox which disables sound. */ if(group != SOUND_UI) { Mix_SetDistance(channel, distance); } int res; if(loop_ticks > 0) { if(fadein_ticks > 0) { res = Mix_FadeInChannelTimed(channel, chunk, -1, fadein_ticks, loop_ticks); } else { res = Mix_PlayChannel(channel, chunk, -1); } if(res >= 0) { Mix_ExpireChannel(channel, loop_ticks); } } else { if(fadein_ticks > 0) { res = Mix_FadeInChannel(channel, chunk, repeats, fadein_ticks); } else { res = Mix_PlayChannel(channel, chunk, repeats); } } if(res < 0) { ERR_AUDIO << "error playing sound effect: " << Mix_GetError() << std::endl; //still keep it in the sound cache, in case we want to try again later return; } channel_ids[channel] = id; //reserve the channel's chunk from being freed, since it is playing channel_chunks[res] = chunk; }
void CSoundEffect::SetDistanceEffect(int dist) { Mix_SetDistance(Channel, dist); }
bool SDLAudio::SetDistance(int channel, int distance) { Mix_SetDistance(channel, distance); return true; }
void digi_mixer_set_channel_volume(int channel, int volume) { int mix_vol = fix2byte(volume); if (!digi_initialised) return; Mix_SetDistance(channel, 255-mix_vol); }