[Add] Primitive positional sound.
This commit is contained in:
parent
5e1ac24f68
commit
9bb4b6e90e
@ -1239,6 +1239,10 @@ void player_think(Pilot* pplayer) {
|
||||
vect_pset(&pplayer->solid->force, pplayer->thrust * player_acc,
|
||||
pplayer->solid->dir);
|
||||
|
||||
/* Update sound position. */
|
||||
sound_updateListener(pplayer->solid->dir,
|
||||
pplayer->solid->pos.x, pplayer->solid->pos.y);
|
||||
|
||||
}
|
||||
|
||||
/* Modify the radar resolution. */
|
||||
|
47
src/sound.c
47
src/sound.c
@ -8,6 +8,7 @@
|
||||
#include "log.h"
|
||||
#include "pack.h"
|
||||
#include "music.h"
|
||||
#include "physics.h"
|
||||
#include "sound.h"
|
||||
|
||||
#define SOUND_CHANNEL_MAX 256 /* Overkill. */
|
||||
@ -15,8 +16,10 @@
|
||||
#define SOUND_PREFIX "../snd/sounds/"
|
||||
#define SOUND_SUFFIX ".wav"
|
||||
|
||||
/* Global sound properties. */
|
||||
int sound_disabled = 0; /* Whether sound is disabled. */
|
||||
static int sound_reserved = 0; /* Amount of reserved channels. */
|
||||
static double sound_pos[3]; /* Position of listener. */
|
||||
|
||||
/* Give the buffers a name. */
|
||||
typedef struct alSound_ {
|
||||
@ -91,8 +94,9 @@ int sound_get(char* name) {
|
||||
if(sound_disabled) return 0;
|
||||
|
||||
for(i = 0; i < sound_nlist; i++)
|
||||
if(strcmp(name, sound_list[i].name)==0)
|
||||
if(strcmp(name, sound_list[i].name)==0) {
|
||||
return i;
|
||||
}
|
||||
|
||||
WARN("Sound '%s' not found in sound list", name);
|
||||
return -1;
|
||||
@ -110,11 +114,50 @@ int sound_play(int sound) {
|
||||
channel = Mix_PlayChannel(-1, sound_list[sound].buffer, 0);
|
||||
|
||||
if(channel < 0)
|
||||
DEBUG("SDL_Mixer: %s", Mix_GetError());
|
||||
WARN("Unable to play sound: %s", Mix_GetError());
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sound_playPos(int sound, double x, double y) {
|
||||
int channel;
|
||||
double angle, dist;
|
||||
double px, py;
|
||||
|
||||
if(sound_disabled) return 0;
|
||||
|
||||
if((sound < 0) || (sound > sound_nlist))
|
||||
return -1;
|
||||
|
||||
px = x - sound_pos[0];
|
||||
py = y - sound_pos[1];
|
||||
|
||||
angle = sound_pos[2] - ANGLE(px, py)/M_PI*180.;
|
||||
|
||||
dist = MOD(px, py);
|
||||
|
||||
channel = Mix_PlayChannel(-1, sound_list[sound].buffer, 0);
|
||||
|
||||
if(channel < 0) {
|
||||
WARN("Unable to play sound: %s", Mix_GetError());
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(Mix_SetPosition(channel, (int)angle, (int)dist/10) < 0) {
|
||||
WARN("Unable to set sound position: %s", Mix_GetError());
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sound_updateListener(double dir, double x, double y) {
|
||||
sound_pos[0] = x;
|
||||
sound_pos[1] = y;
|
||||
sound_pos[2] = dir/M_PI*180.;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Make list of available sounds. */
|
||||
static int sound_makeList(void) {
|
||||
char** files;
|
||||
|
@ -10,6 +10,8 @@ void sound_exit(void);
|
||||
int sound_get(char* name);
|
||||
int sound_volume(const double vol);
|
||||
int sound_play(int sound);
|
||||
int sound_playPos(int sound, double x, double y);
|
||||
int sound_updateListener(double dir, double x, double y);
|
||||
|
||||
/* Group functions. */
|
||||
int sound_reserve(int num);
|
||||
|
@ -428,7 +428,9 @@ static Weapon* weapon_create(const Outfit* outfit, const double dir, const Vec2*
|
||||
vect_cadd(&v, outfit->u.blt.speed*cos(rdir), outfit->u.blt.speed*sin(rdir));
|
||||
w->timer += outfit->u.blt.range/outfit->u.blt.speed;
|
||||
w->solid = solid_create(mass, rdir, pos, &v);
|
||||
sound_play(w->outfit->u.blt.sound);
|
||||
sound_playPos(w->outfit->u.blt.sound,
|
||||
w->solid->pos.x + w->solid->vel.x,
|
||||
w->solid->pos.y + w->solid->vel.y);
|
||||
break;
|
||||
|
||||
/* Treat seekers togther. */
|
||||
@ -450,7 +452,9 @@ static Weapon* weapon_create(const Outfit* outfit, const double dir, const Vec2*
|
||||
w->think = think_seeker;
|
||||
else if(outfit->type == OUTFIT_TYPE_MISSILE_SEEK_SMART_AMMO)
|
||||
w->think = think_smart;*/
|
||||
sound_play(w->outfit->u.amm.sound);
|
||||
sound_playPos(w->outfit->u.amm.sound,
|
||||
w->solid->pos.x + w->solid->vel.x,
|
||||
w->solid->pos.y + w->solid->vel.y);
|
||||
break;
|
||||
|
||||
/* Just dump it where the player is. */
|
||||
|
Loading…
Reference in New Issue
Block a user