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