- float dx=Sector::current()->player->get_pos().x-position.x;
- float dy=Sector::current()->player->get_pos().y-position.y;
- float distance=sqrt(dx*dx+dy*dy);
-
- distance-=distance_bias;
-
- if (distance<0)
- distance=0;
-
- targetvolume=1/(1+distance*distance_factor);
- float rise=targetvolume/currentvolume;
- currentvolume*=pow(rise,.05);
- currentvolume += 1e-30;
- // std::cout << currentvolume << " " << targetvolume << std::endl;
- Mix_Volume(playing,(int)(currentvolume*MIX_MAX_VOLUME));
+ if (latency--<=0) {
+
+ float dx=Sector::current()->player->get_pos().x-position.x;
+ float dy=Sector::current()->player->get_pos().y-position.y;
+ float sqrdistance=dx*dx+dy*dy;
+
+ sqrdistance-=distance_bias;
+
+ if (sqrdistance<0)
+ sqrdistance=0;
+
+ targetvolume=1/(1+sqrdistance*distance_factor);
+ float rise=targetvolume/currentvolume;
+ currentvolume*=pow(rise,deltat*10);
+ currentvolume += 1e-30;
+
+ if (playing>=0) {
+ Mix_Volume(playing,(int)(currentvolume*maximumvolume*MIX_MAX_VOLUME));
+ if (sqrdistance>=silence_distance && currentvolume<0.05)
+ stop_playing();
+ latency=0;
+ } else {
+ if (sqrdistance<silence_distance) {
+ start_playing();
+ latency=0;
+ }
+ else
+ latency=(int)(10*((sqrdistance-silence_distance)/silence_distance));
+ }