4b825dc642cb6eb9a060e54bf8d69288fbee4904ebd360ec63ec976c05699f3180e866b3f69e5472
 
 
1
#include <AL/al.h>
 
 
2
#include <AL/alc.h>
 
 
3
#include "stratdef.h"
 
 
4
#include "files.h"
 
 
5
#include "system.h"
 
 
6
#include "psndplat.h"
 
 
7
#include "bh_types.h"
 
 
8
#include "userprofile.h"
 
 
9
#include <stdlib.h>
 
 
10
#include <string.h>
 
 
11
#include <stdio.h>
 
 
12
 
 
 
13
//#define OPENAL_DEBUG 1
 
 
14
ACTIVESOUNDSAMPLE ActiveSounds[SOUND_MAXACTIVE];
 
 
15
SOUNDSAMPLEDATA GameSounds[SID_MAXIMUM];
 
 
16
 
 
 
17
static const ACTIVESOUNDSAMPLE BlankActiveSound =
 
 
18
{
 
 
19
    SID_NOSOUND,
 
 
20
    ASP_Minimum,
 
 
21
    VOLUME_DEFAULT,
 
 
22
    0,
 
 
23
    NULL,
 
 
24
    -1,
 
 
25
    -1,
 
 
26
    0,
 
 
27
    0,
 
 
28
    0,
 
 
29
    0,
 
 
30
    0,
 
 
31
    { {0,0,0}, {0,0,0}, 0, 0 },
 
 
32
    0,
 
 
33
    0,
 
 
34
    {0.0, 0.0, 0.0},
 
 
35
    {0.0, 0.0, 0.0}
 
 
36
};
 
 
37
 
 
 
38
static ALCdevice *AvpSoundDevice = NULL;
 
 
39
static ALvoid *AvpSoundContext = NULL;
 
 
40
int DopplerShiftIsOn = 0;
 
 
41
int SoundActivated = 0;
 
 
42
 
 
 
43
// this table plots the frequency change for
 
 
44
// 128/ths of a semitone for one octave (0-1535),
 
 
45
// divide or multiply by 2 to subtract or add an octave
 
 
46
static const float pitch_to_frequency_mult_table [] = 
 
 
47
{
 
 
48
    1.0F,        1.00045137F,    1.000902943F,    1.00135472F,    1.001806701F,    1.002258886F,    1.002711275F,    1.003163868F,
 
 
49
    1.003616666F,    1.004069668F,    1.004522874F,    1.004976285F,    1.005429901F,    1.005883722F,    1.006337747F,    1.006791977F,
 
 
50
    1.007246412F,    1.007701053F,    1.008155898F,    1.008610949F,    1.009066205F,    1.009521667F,    1.009977334F,    1.010433207F,
 
 
51
    1.010889286F,    1.011345571F,    1.011802061F,    1.012258758F,    1.012715661F,    1.01317277F,    1.013630085F,    1.014087607F,
 
 
52
    1.014545335F,    1.01500327F,    1.015461411F,    1.01591976F,    1.016378315F,    1.016837077F,    1.017296046F,    1.017755223F,
 
 
53
    1.018214607F,    1.018674198F,    1.019133996F,    1.019594002F,    1.020054216F,    1.020514637F,    1.020975266F,    1.021436104F,
 
 
54
    1.021897149F,    1.022358402F,    1.022819863F,    1.023281533F,    1.023743411F,    1.024205498F,    1.024667793F,    1.025130297F,
 
 
55
    1.025593009F,    1.026055931F,    1.026519061F,    1.026982401F,    1.027445949F,    1.027909707F,    1.028373674F,    1.028837851F,
 
 
56
    1.029302237F,    1.029766832F,    1.030231638F,    1.030696653F,    1.031161878F,    1.031627313F,    1.032092958F,    1.032558813F,
 
 
57
    1.033024879F,    1.033491155F,    1.033957641F,    1.034424338F,    1.034891246F,    1.035358364F,    1.035825694F,    1.036293234F,
 
 
58
    1.036760985F,    1.037228947F,    1.037697121F,    1.038165506F,    1.038634102F,    1.03910291F,    1.039571929F,    1.04004116F,
 
 
59
    1.040510603F,    1.040980258F,    1.041450125F,    1.041920204F,    1.042390495F,    1.042860998F,    1.043331714F,    1.043802642F,
 
 
60
    1.044273782F,    1.044745136F,    1.045216702F,    1.045688481F,    1.046160473F,    1.046632678F,    1.047105096F,    1.047577727F,
 
 
61
    1.048050572F,    1.04852363F,    1.048996902F,    1.049470387F,    1.049944086F,    1.050417999F,    1.050892125F,    1.051366466F,
 
 
62
    1.051841021F,    1.05231579F,    1.052790773F,    1.053265971F,    1.053741383F,    1.05421701F,    1.054692851F,    1.055168907F,
 
 
63
    1.055645178F,    1.056121664F,    1.056598366F,    1.057075282F,    1.057552413F,    1.05802976F,    1.058507323F,    1.058985101F,
 
 
64
    1.059463094F,    1.059941304F,    1.060419729F,    1.06089837F,    1.061377227F,    1.061856301F,    1.06233559F,    1.062815096F,
 
 
65
    1.063294818F,    1.063774757F,    1.064254913F,    1.064735285F,    1.065215874F,    1.06569668F,    1.066177703F,    1.066658943F,
 
 
66
    1.067140401F,    1.067622075F,    1.068103967F,    1.068586077F,    1.069068404F,    1.069550949F,    1.070033712F,    1.070516692F,
 
 
67
    1.070999891F,    1.071483308F,    1.071966943F,    1.072450796F,    1.072934868F,    1.073419158F,    1.073903666F,    1.074388394F,
 
 
68
    1.07487334F,    1.075358505F,    1.075843889F,    1.076329492F,    1.076815315F,    1.077301356F,    1.077787617F,    1.078274098F,
 
 
69
    1.078760798F,    1.079247718F,    1.079734857F,    1.080222216F,    1.080709796F,    1.081197595F,    1.081685615F,    1.082173855F,
 
 
70
    1.082662315F,    1.083150996F,    1.083639897F,    1.084129019F,    1.084618362F,    1.085107926F,    1.085597711F,    1.086087716F,
 
 
71
    1.086577943F,    1.087068391F,    1.087559061F,    1.088049952F,    1.088541065F,    1.089032399F,    1.089523955F,    1.090015733F,
 
 
72
    1.090507733F,    1.090999955F,    1.091492399F,    1.091985065F,    1.092477954F,    1.092971065F,    1.093464399F,    1.093957956F,
 
 
73
    1.094451735F,    1.094945737F,    1.095439962F,    1.09593441F,    1.096429082F,    1.096923976F,    1.097419095F,    1.097914436F,
 
 
74
    1.098410001F,    1.09890579F,    1.099401803F,    1.099898039F,    1.1003945F,    1.100891184F,    1.101388093F,    1.101885226F,
 
 
75
    1.102382583F,    1.102880165F,    1.103377972F,    1.103876003F,    1.104374259F,    1.10487274F,    1.105371446F,    1.105870377F,
 
 
76
    1.106369533F,    1.106868914F,    1.107368521F,    1.107868354F,    1.108368412F,    1.108868695F,    1.109369205F,    1.10986994F,
 
 
77
    1.110370902F,    1.11087209F,    1.111373503F,    1.111875143F,    1.11237701F,    1.112879103F,    1.113381423F,    1.113883969F,
 
 
78
    1.114386743F,    1.114889743F,    1.11539297F,    1.115896424F,    1.116400106F,    1.116904015F,    1.117408152F,    1.117912516F,
 
 
79
    1.118417107F,    1.118921927F,    1.119426974F,    1.119932249F,    1.120437752F,    1.120943484F,    1.121449444F,    1.121955632F,
 
 
80
    1.122462048F,    1.122968693F,    1.123475567F,    1.12398267F,    1.124490002F,    1.124997562F,    1.125505352F,    1.12601337F,
 
 
81
    1.126521619F,    1.127030096F,    1.127538803F,    1.12804774F,    1.128556906F,    1.129066302F,    1.129575929F,    1.130085785F,
 
 
82
    1.130595871F,    1.131106188F,    1.131616734F,    1.132127512F,    1.13263852F,    1.133149758F,    1.133661227F,    1.134172928F,
 
 
83
    1.134684859F,    1.135197021F,    1.135709414F,    1.136222039F,    1.136734895F,    1.137247982F,    1.137761301F,    1.138274852F,
 
 
84
    1.138788635F,    1.139302649F,    1.139816896F,    1.140331374F,    1.140846085F,    1.141361028F,    1.141876204F,    1.142391612F,
 
 
85
    1.142907253F,    1.143423126F,    1.143939233F,    1.144455572F,    1.144972144F,    1.14548895F,    1.146005989F,    1.146523261F,
 
 
86
    1.147040767F,    1.147558506F,    1.148076479F,    1.148594686F,    1.149113126F,    1.149631801F,    1.15015071F,    1.150669853F,
 
 
87
    1.15118923F,    1.151708842F,    1.152228688F,    1.152748769F,    1.153269085F,    1.153789635F,    1.154310421F,    1.154831441F,
 
 
88
    1.155352697F,    1.155874188F,    1.156395914F,    1.156917876F,    1.157440074F,    1.157962507F,    1.158485176F,    1.159008081F,
 
 
89
    1.159531222F,    1.160054599F,    1.160578212F,    1.161102062F,    1.161626148F,    1.16215047F,    1.16267503F,    1.163199826F,
 
 
90
    1.163724859F,    1.164250129F,    1.164775636F,    1.16530138F,    1.165827362F,    1.16635358F,    1.166880037F,    1.167406731F,
 
 
91
    1.167933663F,    1.168460833F,    1.16898824F,    1.169515886F,    1.17004377F,    1.170571892F,    1.171100252F,    1.171628851F,
 
 
92
    1.172157689F,    1.172686765F,    1.17321608F,    1.173745634F,    1.174275427F,    1.174805459F,    1.175335731F,    1.175866241F,
 
 
93
    1.176396992F,    1.176927981F,    1.177459211F,    1.17799068F,    1.178522389F,    1.179054338F,    1.179586527F,    1.180118957F,
 
 
94
    1.180651627F,    1.181184537F,    1.181717688F,    1.182251079F,    1.182784711F,    1.183318584F,    1.183852698F,    1.184387053F,
 
 
95
    1.184921649F,    1.185456487F,    1.185991566F,    1.186526886F,    1.187062448F,    1.187598252F,    1.188134298F,    1.188670585F,
 
 
96
    1.189207115F,    1.189743887F,    1.190280901F,    1.190818158F,    1.191355657F,    1.191893398F,    1.192431383F,    1.19296961F,
 
 
97
    1.19350808F,    1.194046793F,    1.194585749F,    1.195124949F,    1.195664392F,    1.196204079F,    1.196744009F,    1.197284182F,
 
 
98
    1.1978246F,    1.198365262F,    1.198906167F,    1.199447317F,    1.199988711F,    1.200530349F,    1.201072232F,    1.201614359F,
 
 
99
    1.202156731F,    1.202699348F,    1.20324221F,    1.203785317F,    1.204328669F,    1.204872266F,    1.205416109F,    1.205960197F,
 
 
100
    1.206504531F,    1.20704911F,    1.207593935F,    1.208139006F,    1.208684324F,    1.209229887F,    1.209775696F,    1.210321752F,
 
 
101
    1.210868055F,    1.211414604F,    1.211961399F,    1.212508442F,    1.213055731F,    1.213603267F,    1.214151051F,    1.214699082F,
 
 
102
    1.21524736F,    1.215795886F,    1.216344659F,    1.21689368F,    1.217442948F,    1.217992465F,    1.21854223F,    1.219092243F,
 
 
103
    1.219642504F,    1.220193013F,    1.220743771F,    1.221294778F,    1.221846033F,    1.222397537F,    1.22294929F,    1.223501292F,
 
 
104
    1.224053543F,    1.224606044F,    1.225158794F,    1.225711793F,    1.226265042F,    1.226818541F,    1.227372289F,    1.227926288F,
 
 
105
    1.228480536F,    1.229035035F,    1.229589784F,    1.230144783F,    1.230700033F,    1.231255533F,    1.231811285F,    1.232367287F,
 
 
106
    1.23292354F,    1.233480044F,    1.234036799F,    1.234593806F,    1.235151064F,    1.235708573F,    1.236266335F,    1.236824348F,
 
 
107
    1.237382612F,    1.237941129F,    1.238499898F,    1.239058919F,    1.239618193F,    1.240177719F,    1.240737497F,    1.241297528F,
 
 
108
    1.241857812F,    1.242418349F,    1.242979139F,    1.243540182F,    1.244101478F,    1.244663027F,    1.24522483F,    1.245786887F,
 
 
109
    1.246349197F,    1.246911761F,    1.247474579F,    1.248037651F,    1.248600977F,    1.249164558F,    1.249728392F,    1.250292482F,
 
 
110
    1.250856826F,    1.251421424F,    1.251986278F,    1.252551386F,    1.25311675F,    1.253682369F,    1.254248243F,    1.254814372F,
 
 
111
    1.255380757F,    1.255947398F,    1.256514294F,    1.257081446F,    1.257648855F,    1.258216519F,    1.25878444F,    1.259352616F,
 
 
112
    1.25992105F,    1.26048974F,    1.261058687F,    1.26162789F,    1.26219735F,    1.262767068F,    1.263337042F,    1.263907274F,
 
 
113
    1.264477763F,    1.26504851F,    1.265619515F,    1.266190777F,    1.266762297F,    1.267334075F,    1.26790611F,    1.268478405F,
 
 
114
    1.269050957F,    1.269623768F,    1.270196838F,    1.270770166F,    1.271343753F,    1.271917599F,    1.272491703F,    1.273066067F,
 
 
115
    1.273640691F,    1.274215573F,    1.274790715F,    1.275366117F,    1.275941778F,    1.2765177F,    1.277093881F,    1.277670322F,
 
 
116
    1.278247024F,    1.278823985F,    1.279401208F,    1.27997869F,    1.280556434F,    1.281134438F,    1.281712703F,    1.282291229F,
 
 
117
    1.282870016F,    1.283449065F,    1.284028374F,    1.284607946F,    1.285187778F,    1.285767873F,    1.28634823F,    1.286928848F,
 
 
118
    1.287509728F,    1.288090871F,    1.288672276F,    1.289253943F,    1.289835873F,    1.290418066F,    1.291000521F,    1.29158324F,
 
 
119
    1.292166221F,    1.292749466F,    1.293332973F,    1.293916744F,    1.294500779F,    1.295085077F,    1.295669639F,    1.296254465F,
 
 
120
    1.296839555F,    1.297424909F,    1.298010527F,    1.298596409F,    1.299182556F,    1.299768967F,    1.300355643F,    1.300942584F,
 
 
121
    1.30152979F,    1.302117261F,    1.302704997F,    1.303292998F,    1.303881265F,    1.304469797F,    1.305058595F,    1.305647659F,
 
 
122
    1.306236989F,    1.306826584F,    1.307416446F,    1.308006574F,    1.308596968F,    1.309187629F,    1.309778556F,    1.310369751F,
 
 
123
    1.310961212F,    1.311552939F,    1.312144935F,    1.312737197F,    1.313329726F,    1.313922523F,    1.314515588F,    1.31510892F,
 
 
124
    1.31570252F,    1.316296388F,    1.316890524F,    1.317484929F,    1.318079601F,    1.318674542F,    1.319269752F,    1.31986523F,
 
 
125
    1.320460977F,    1.321056993F,    1.321653278F,    1.322249832F,    1.322846655F,    1.323443748F,    1.32404111F,    1.324638742F,
 
 
126
    1.325236643F,    1.325834815F,    1.326433256F,    1.327031968F,    1.327630949F,    1.328230202F,    1.328829724F,    1.329429517F,
 
 
127
    1.330029581F,    1.330629916F,    1.331230522F,    1.331831399F,    1.332432547F,    1.333033967F,    1.333635657F,    1.33423762F,
 
 
128
    1.334839854F,    1.33544236F,    1.336045138F,    1.336648188F,    1.337251511F,    1.337855105F,    1.338458972F,    1.339063112F,
 
 
129
    1.339667524F,    1.340272209F,    1.340877167F,    1.341482398F,    1.342087903F,    1.34269368F,    1.343299731F,    1.343906056F,
 
 
130
    1.344512654F,    1.345119526F,    1.345726672F,    1.346334092F,    1.346941786F,    1.347549755F,    1.348157998F,    1.348766515F,
 
 
131
    1.349375307F,    1.349984374F,    1.350593716F,    1.351203333F,    1.351813225F,    1.352423392F,    1.353033835F,    1.353644553F,
 
 
132
    1.354255547F,    1.354866817F,    1.355478362F,    1.356090184F,    1.356702282F,    1.357314656F,    1.357927306F,    1.358540233F,
 
 
133
    1.359153437F,    1.359766917F,    1.360380675F,    1.360994709F,    1.361609021F,    1.362223609F,    1.362838476F,    1.363453619F,
 
 
134
    1.364069041F,    1.36468474F,    1.365300717F,    1.365916972F,    1.366533506F,    1.367150317F,    1.367767407F,    1.368384776F,
 
 
135
    1.369002423F,    1.369620349F,    1.370238554F,    1.370857038F,    1.371475801F,    1.372094843F,    1.372714165F,    1.373333766F,
 
 
136
    1.373953647F,    1.374573808F,    1.375194249F,    1.37581497F,    1.376435971F,    1.377057252F,    1.377678814F,    1.378300656F,
 
 
137
    1.378922779F,    1.379545183F,    1.380167867F,    1.380790833F,    1.38141408F,    1.382037608F,    1.382661418F,    1.383285509F,
 
 
138
    1.383909882F,    1.384534537F,    1.385159473F,    1.385784692F,    1.386410193F,    1.387035977F,    1.387662042F,    1.388288391F,
 
 
139
    1.388915022F,    1.389541936F,    1.390169133F,    1.390796613F,    1.391424376F,    1.392052422F,    1.392680752F,    1.393309366F,
 
 
140
    1.393938263F,    1.394567445F,    1.39519691F,    1.395826659F,    1.396456693F,    1.397087011F,    1.397717613F,    1.398348501F,
 
 
141
    1.398979673F,    1.399611129F,    1.400242871F,    1.400874898F,    1.40150721F,    1.402139808F,    1.402772691F,    1.40340586F,
 
 
142
    1.404039315F,    1.404673055F,    1.405307082F,    1.405941395F,    1.406575994F,    1.407210879F,    1.407846051F,    1.40848151F,
 
 
143
    1.409117256F,    1.409753289F,    1.410389608F,    1.411026215F,    1.411663109F,    1.412300291F,    1.41293776F,    1.413575517F,
 
 
144
    1.414213562F,    1.414851895F,    1.415490516F,    1.416129426F,    1.416768623F,    1.417408109F,    1.418047884F,    1.418687948F,
 
 
145
    1.4193283F,    1.419968942F,    1.420609873F,    1.421251093F,    1.421892602F,    1.422534401F,    1.42317649F,    1.423818868F,
 
 
146
    1.424461537F,    1.425104495F,    1.425747744F,    1.426391283F,    1.427035113F,    1.427679233F,    1.428323644F,    1.428968346F,
 
 
147
    1.429613338F,    1.430258622F,    1.430904197F,    1.431550064F,    1.432196222F,    1.432842672F,    1.433489413F,    1.434136447F,
 
 
148
    1.434783772F,    1.43543139F,    1.4360793F,    1.436727502F,    1.437375997F,    1.438024785F,    1.438673866F,    1.439323239F,
 
 
149
    1.439972906F,    1.440622866F,    1.441273119F,    1.441923666F,    1.442574506F,    1.44322564F,    1.443877069F,    1.444528791F,
 
 
150
    1.445180807F,    1.445833118F,    1.446485723F,    1.447138622F,    1.447791816F,    1.448445306F,    1.44909909F,    1.449753169F,
 
 
151
    1.450407543F,    1.451062213F,    1.451717178F,    1.452372439F,    1.453027996F,    1.453683848F,    1.454339997F,    1.454996442F,
 
 
152
    1.455653183F,    1.45631022F,    1.456967554F,    1.457625185F,    1.458283113F,    1.458941337F,    1.459599859F,    1.460258678F,
 
 
153
    1.460917794F,    1.461577208F,    1.462236919F,    1.462896929F,    1.463557236F,    1.464217841F,    1.464878744F,    1.465539946F,
 
 
154
    1.466201446F,    1.466863245F,    1.467525342F,    1.468187738F,    1.468850433F,    1.469513428F,    1.470176721F,    1.470840314F,
 
 
155
    1.471504207F,    1.472168399F,    1.472832891F,    1.473497683F,    1.474162775F,    1.474828167F,    1.475493859F,    1.476159852F,
 
 
156
    1.476826146F,    1.47749274F,    1.478159635F,    1.478826832F,    1.479494329F,    1.480162128F,    1.480830228F,    1.481498629F,
 
 
157
    1.482167333F,    1.482836338F,    1.483505645F,    1.484175254F,    1.484845166F,    1.48551538F,    1.486185896F,    1.486856715F,
 
 
158
    1.487527837F,    1.488199262F,    1.48887099F,    1.489543021F,    1.490215355F,    1.490887993F,    1.491560934F,    1.492234179F,
 
 
159
    1.492907728F,    1.493581581F,    1.494255739F,    1.4949302F,    1.495604966F,    1.496280037F,    1.496955412F,    1.497631092F,
 
 
160
    1.498307077F,    1.498983367F,    1.499659962F,    1.500336863F,    1.50101407F,    1.501691582F,    1.502369399F,    1.503047523F,
 
 
161
    1.503725953F,    1.504404689F,    1.505083732F,    1.505763081F,    1.506442736F,    1.507122698F,    1.507802968F,    1.508483544F,
 
 
162
    1.509164428F,    1.509845618F,    1.510527117F,    1.511208923F,    1.511891036F,    1.512573458F,    1.513256187F,    1.513939225F,
 
 
163
    1.514622571F,    1.515306226F,    1.515990189F,    1.516674461F,    1.517359041F,    1.518043931F,    1.51872913F,    1.519414638F,
 
 
164
    1.520100455F,    1.520786582F,    1.521473019F,    1.522159765F,    1.522846822F,    1.523534189F,    1.524221866F,    1.524909853F,
 
 
165
    1.525598151F,    1.526286759F,    1.526975679F,    1.527664909F,    1.52835445F,    1.529044303F,    1.529734467F,    1.530424942F,
 
 
166
    1.53111573F,    1.531806829F,    1.53249824F,    1.533189963F,    1.533881998F,    1.534574345F,    1.535267006F,    1.535959978F,
 
 
167
    1.536653264F,    1.537346862F,    1.538040774F,    1.538734999F,    1.539429537F,    1.540124388F,    1.540819553F,    1.541515032F,
 
 
168
    1.542210825F,    1.542906932F,    1.543603354F,    1.544300089F,    1.544997139F,    1.545694504F,    1.546392183F,    1.547090177F,
 
 
169
    1.547788487F,    1.548487111F,    1.549186051F,    1.549885307F,    1.550584878F,    1.551284764F,    1.551984967F,    1.552685486F,
 
 
170
    1.553386321F,    1.554087472F,    1.55478894F,    1.555490724F,    1.556192825F,    1.556895243F,    1.557597978F,    1.558301031F,
 
 
171
    1.5590044F,    1.559708087F,    1.560412092F,    1.561116415F,    1.561821055F,    1.562526013F,    1.56323129F,    1.563936885F,
 
 
172
    1.564642798F,    1.56534903F,    1.566055581F,    1.566762451F,    1.56746964F,    1.568177148F,    1.568884975F,    1.569593122F,
 
 
173
    1.570301589F,    1.571010375F,    1.571719481F,    1.572428908F,    1.573138654F,    1.573848721F,    1.574559108F,    1.575269816F,
 
 
174
    1.575980845F,    1.576692195F,    1.577403866F,    1.578115858F,    1.578828171F,    1.579540806F,    1.580253763F,    1.580967041F,
 
 
175
    1.581680641F,    1.582394564F,    1.583108809F,    1.583823376F,    1.584538265F,    1.585253478F,    1.585969013F,    1.586684871F,
 
 
176
    1.587401052F,    1.588117556F,    1.588834384F,    1.589551536F,    1.590269011F,    1.59098681F,    1.591704933F,    1.59242338F,
 
 
177
    1.593142151F,    1.593861247F,    1.594580668F,    1.595300413F,    1.596020483F,    1.596740878F,    1.597461598F,    1.598182643F,
 
 
178
    1.598904014F,    1.599625711F,    1.600347733F,    1.601070081F,    1.601792756F,    1.602515756F,    1.603239083F,    1.603962736F,
 
 
179
    1.604686716F,    1.605411023F,    1.606135656F,    1.606860617F,    1.607585905F,    1.60831152F,    1.609037463F,    1.609763734F,
 
 
180
    1.610490332F,    1.611217258F,    1.611944513F,    1.612672095F,    1.613400006F,    1.614128246F,    1.614856814F,    1.615585711F,
 
 
181
    1.616314938F,    1.617044493F,    1.617774377F,    1.618504592F,    1.619235135F,    1.619966009F,    1.620697212F,    1.621428745F,
 
 
182
    1.622160609F,    1.622892803F,    1.623625327F,    1.624358182F,    1.625091368F,    1.625824885F,    1.626558732F,    1.627292911F,
 
 
183
    1.628027422F,    1.628762264F,    1.629497437F,    1.630232943F,    1.63096878F,    1.63170495F,    1.632441452F,    1.633178286F,
 
 
184
    1.633915453F,    1.634652953F,    1.635390785F,    1.636128951F,    1.63686745F,    1.637606282F,    1.638345447F,    1.639084947F,
 
 
185
    1.63982478F,    1.640564947F,    1.641305448F,    1.642046283F,    1.642787453F,    1.643528957F,    1.644270796F,    1.645012969F,
 
 
186
    1.645755478F,    1.646498322F,    1.647241501F,    1.647985016F,    1.648728866F,    1.649473052F,    1.650217574F,    1.650962432F,
 
 
187
    1.651707626F,    1.652453156F,    1.653199024F,    1.653945227F,    1.654691768F,    1.655438645F,    1.65618586F,    1.656933412F,
 
 
188
    1.657681301F,    1.658429528F,    1.659178092F,    1.659926995F,    1.660676235F,    1.661425814F,    1.662175731F,    1.662925986F,
 
 
189
    1.66367658F,    1.664427513F,    1.665178785F,    1.665930396F,    1.666682346F,    1.667434636F,    1.668187265F,    1.668940234F,
 
 
190
    1.669693543F,    1.670447192F,    1.671201181F,    1.67195551F,    1.67271018F,    1.67346519F,    1.674220541F,    1.674976233F,
 
 
191
    1.675732267F,    1.676488641F,    1.677245357F,    1.678002414F,    1.678759814F,    1.679517555F,    1.680275638F,    1.681034063F,
 
 
192
    1.681792831F,    1.682551941F,    1.683311393F,    1.684071189F,    1.684831327F,    1.685591809F,    1.686352633F,    1.687113802F,
 
 
193
    1.687875313F,    1.688637169F,    1.689399368F,    1.690161912F,    1.690924799F,    1.691688031F,    1.692451608F,    1.693215529F,
 
 
194
    1.693979795F,    1.694744405F,    1.695509361F,    1.696274663F,    1.697040309F,    1.697806302F,    1.69857264F,    1.699339324F,
 
 
195
    1.700106354F,    1.70087373F,    1.701641453F,    1.702409522F,    1.703177937F,    1.7039467F,    1.70471581F,    1.705485266F,
 
 
196
    1.706255071F,    1.707025222F,    1.707795721F,    1.708566568F,    1.709337763F,    1.710109306F,    1.710881197F,    1.711653437F,
 
 
197
    1.712426025F,    1.713198962F,    1.713972248F,    1.714745883F,    1.715519867F,    1.7162942F,    1.717068883F,    1.717843916F,
 
 
198
    1.718619298F,    1.719395031F,    1.720171113F,    1.720947546F,    1.721724329F,    1.722501463F,    1.723278948F,    1.724056783F,
 
 
199
    1.72483497F,    1.725613508F,    1.726392397F,    1.727171638F,    1.727951231F,    1.728731176F,    1.729511472F,    1.730292121F,
 
 
200
    1.731073122F,    1.731854476F,    1.732636182F,    1.733418241F,    1.734200653F,    1.734983419F,    1.735766537F,    1.73655001F,
 
 
201
    1.737333835F,    1.738118015F,    1.738902548F,    1.739687436F,    1.740472678F,    1.741258274F,    1.742044225F,    1.742830531F,
 
 
202
    1.743617191F,    1.744404207F,    1.745191578F,    1.745979304F,    1.746767386F,    1.747555824F,    1.748344617F,    1.749133767F,
 
 
203
    1.749923272F,    1.750713134F,    1.751503353F,    1.752293928F,    1.75308486F,    1.753876149F,    1.754667796F,    1.755459799F,
 
 
204
    1.75625216F,    1.757044879F,    1.757837956F,    1.75863139F,    1.759425183F,    1.760219334F,    1.761013843F,    1.761808711F,
 
 
205
    1.762603938F,    1.763399524F,    1.764195468F,    1.764991772F,    1.765788436F,    1.766585459F,    1.767382842F,    1.768180585F,
 
 
206
    1.768978687F,    1.769777151F,    1.770575974F,    1.771375158F,    1.772174703F,    1.772974609F,    1.773774875F,    1.774575503F,
 
 
207
    1.775376493F,    1.776177843F,    1.776979556F,    1.77778163F,    1.778584067F,    1.779386865F,    1.780190027F,    1.78099355F,
 
 
208
    1.781797436F,    1.782601685F,    1.783406297F,    1.784211273F,    1.785016611F,    1.785822313F,    1.786628379F,    1.787434809F,
 
 
209
    1.788241602F,    1.78904876F,    1.789856282F,    1.790664169F,    1.79147242F,    1.792281036F,    1.793090017F,    1.793899363F,
 
 
210
    1.794709075F,    1.795519152F,    1.796329595F,    1.797140403F,    1.797951578F,    1.798763118F,    1.799575025F,    1.800387298F,
 
 
211
    1.801199938F,    1.802012945F,    1.802826319F,    1.80364006F,    1.804454168F,    1.805268643F,    1.806083487F,    1.806898698F,
 
 
212
    1.807714277F,    1.808530224F,    1.809346539F,    1.810163223F,    1.810980276F,    1.811797697F,    1.812615487F,    1.813433647F,
 
 
213
    1.814252176F,    1.815071074F,    1.815890341F,    1.816709979F,    1.817529987F,    1.818350364F,    1.819171112F,    1.819992231F,
 
 
214
    1.82081372F,    1.821635579F,    1.82245781F,    1.823280412F,    1.824103385F,    1.82492673F,    1.825750446F,    1.826574535F,
 
 
215
    1.827398995F,    1.828223827F,    1.829049031F,    1.829874608F,    1.830700558F,    1.831526881F,    1.832353576F,    1.833180645F,
 
 
216
    1.834008086F,    1.834835902F,    1.835664091F,    1.836492654F,    1.83732159F,    1.838150901F,    1.838980587F,    1.839810647F,
 
 
217
    1.840641081F,    1.84147189F,    1.842303075F,    1.843134634F,    1.843966569F,    1.844798879F,    1.845631565F,    1.846464627F,
 
 
218
    1.847298065F,    1.848131879F,    1.84896607F,    1.849800636F,    1.85063558F,    1.851470901F,    1.852306598F,    1.853142673F,
 
 
219
    1.853979125F,    1.854815955F,    1.855653162F,    1.856490747F,    1.857328711F,    1.858167052F,    1.859005772F,    1.859844871F,
 
 
220
    1.860684348F,    1.861524205F,    1.86236444F,    1.863205054F,    1.864046048F,    1.864887422F,    1.865729175F,    1.866571309F,
 
 
221
    1.867413822F,    1.868256716F,    1.86909999F,    1.869943645F,    1.87078768F,    1.871632097F,    1.872476895F,    1.873322074F,
 
 
222
    1.874167634F,    1.875013576F,    1.8758599F,    1.876706606F,    1.877553694F,    1.878401165F,    1.879249018F,    1.880097254F,
 
 
223
    1.880945872F,    1.881794874F,    1.882644259F,    1.883494027F,    1.884344179F,    1.885194715F,    1.886045634F,    1.886896938F,
 
 
224
    1.887748625F,    1.888600698F,    1.889453154F,    1.890305996F,    1.891159223F,    1.892012834F,    1.892866831F,    1.893721214F,
 
 
225
    1.894575982F,    1.895431135F,    1.896286675F,    1.897142601F,    1.897998914F,    1.898855613F,    1.899712698F,    1.900570171F,
 
 
226
    1.90142803F,    1.902286277F,    1.903144911F,    1.904003932F,    1.904863342F,    1.905723139F,    1.906583324F,    1.907443898F,
 
 
227
    1.90830486F,    1.909166211F,    1.91002795F,    1.910890079F,    1.911752596F,    1.912615503F,    1.913478799F,    1.914342486F,
 
 
228
    1.915206561F,    1.916071027F,    1.916935883F,    1.91780113F,    1.918666767F,    1.919532795F,    1.920399213F,    1.921266023F,
 
 
229
    1.922133224F,    1.923000816F,    1.9238688F,    1.924737176F,    1.925605944F,    1.926475103F,    1.927344656F,    1.9282146F,
 
 
230
    1.929084938F,    1.929955668F,    1.930826791F,    1.931698307F,    1.932570217F,    1.93344252F,    1.934315217F,    1.935188308F,
 
 
231
    1.936061793F,    1.936935673F,    1.937809947F,    1.938684615F,    1.939559678F,    1.940435136F,    1.94131099F,    1.942187238F,
 
 
232
    1.943063882F,    1.943940922F,    1.944818358F,    1.94569619F,    1.946574418F,    1.947453042F,    1.948332063F,    1.949211481F,
 
 
233
    1.950091295F,    1.950971507F,    1.951852116F,    1.952733123F,    1.953614527F,    1.954496329F,    1.955378529F,    1.956261128F,
 
 
234
    1.957144124F,    1.958027519F,    1.958911313F,    1.959795506F,    1.960680098F,    1.961565089F,    1.96245048F,    1.963336271F,
 
 
235
    1.964222461F,    1.965109051F,    1.965996041F,    1.966883432F,    1.967771223F,    1.968659415F,    1.969548008F,    1.970437002F,
 
 
236
    1.971326397F,    1.972216194F,    1.973106392F,    1.973996992F,    1.974887994F,    1.975779399F,    1.976671205F,    1.977563415F,
 
 
237
    1.978456026F,    1.979349041F,    1.980242459F,    1.98113628F,    1.982030505F,    1.982925133F,    1.983820165F,    1.984715601F,
 
 
238
    1.985611441F,    1.986507685F,    1.987404335F,    1.988301388F,    1.989198847F,    1.990096711F,    1.99099498F,    1.991893654F,
 
 
239
    1.992792734F,    1.99369222F,    1.994592112F,    1.99549241F,    1.996393115F,    1.997294226F,    1.998195744F,    1.999097668F
 
 
240
};
 
 
241
 
 
 
242
/* table generated by:
 
 
243
   vol_to_gain_table[volume] = (float) pow(10.0, (double) vol_to_atten_table[volume] / 2000.0);
 
 
244
*/   
 
 
245
static const float vol_to_gain_table[] = {
 
 
246
0.000010f, 0.000011f, 0.000056f, 0.000146f, 0.000287f, 0.000486f, 0.000748f, 0.001076f,
 
 
247
0.001474f, 0.001945f, 0.002495f, 0.003122f, 0.003837f, 0.004629f, 0.005514f, 0.006494f,
 
 
248
0.007560f, 0.008720f, 0.009977f, 0.011337f, 0.012794f, 0.014355f, 0.016014f, 0.017783f,
 
 
249
0.019656f, 0.021652f, 0.023741f, 0.025942f, 0.028281f, 0.030726f, 0.033266f, 0.035934f,
 
 
250
0.038726f, 0.041639f, 0.044668f, 0.047863f, 0.051168f, 0.054576f, 0.058076f, 0.061731f,
 
 
251
0.065539f, 0.069502f, 0.073536f, 0.077714f, 0.082130f, 0.086596f, 0.091201f, 0.095940f,
 
 
252
0.100809f, 0.105803f, 0.110917f, 0.116279f, 0.121759f, 0.127350f, 0.133045f, 0.138995f,
 
 
253
0.144877f, 0.151182f, 0.157398f, 0.163870f, 0.170608f, 0.177419f, 0.184289f, 0.191426f,
 
 
254
0.198609f, 0.206063f, 0.213550f, 0.221309f, 0.229087f, 0.237137f, 0.245188f, 0.253805f,
 
 
255
0.262120f, 0.270707f, 0.279576f, 0.288735f, 0.297852f, 0.307256f, 0.316592f, 0.326212f,
 
 
256
0.336124f, 0.345939f, 0.356451f, 0.366438f, 0.377138f, 0.387704f, 0.398566f, 0.409732f,
 
 
257
0.420727f, 0.432016f, 0.443609f, 0.455512f, 0.467197f, 0.479181f, 0.491473f, 0.504081f,
 
 
258
0.516416f, 0.529663f, 0.542625f, 0.555265f, 0.568853f, 0.582103f, 0.596348f, 0.610239f,
 
 
259
0.623735f, 0.638263f, 0.652379f, 0.667575f, 0.682339f, 0.696626f, 0.712033f, 0.727780f,
 
 
260
0.743019f, 0.758578f, 0.774462f, 0.790679f, 0.807235f, 0.824138f, 0.840427f, 0.857038f,
 
 
261
0.873977f, 0.891251f, 0.908866f, 0.926830f, 0.945148f, 0.962720f, 0.980618f, 1.000000f
 
 
262
};
 
 
263
 
 
 
264
/*
 
 
265
openal.c TODO:
 
 
266
1. There is no EAX/Reverb.  But there's probably not much I can do...
 
 
267
2. Restarting sound system may or may not work.
 
 
268
3. Better Error Handling (device not avail, etc).
 
 
269
*/
 
 
270
int PlatStartSoundSys()
 
 
271
{
 
 
272
    int i;
 
 
273
    for (i=0; i < SID_MAXIMUM; i++)
 
 
274
    {
 
 
275
        GameSounds[i].loaded = 0;
 
 
276
        GameSounds[i].activeInstances = 0;
 
 
277
        GameSounds[i].volume = VOLUME_DEFAULT;
 
 
278
        GameSounds[i].pitch = 0;
 
 
279
        GameSounds[i].dsBufferP = 0;
 
 
280
        GameSounds[i].flags = SAMPLE_IN_HW;
 
 
281
        GameSounds[i].dsFrequency = 0;
 
 
282
        GameSounds[i].wavName = NULL;
 
 
283
    }
 
 
284
 
 
 
285
    for (i = 0; i < SOUND_MAXACTIVE; i++)
 
 
286
        ActiveSounds[i] = BlankActiveSound;
 
 
287
 
 
 
288
    if(UserProfile.loadsounds)
 
 
289
    {
 
 
290
        static const int AvpFrequency = 44100;
 
 
291
 
 
 
292
        AvpSoundDevice = alcOpenDevice(NULL);
 
 
293
 
 
 
294
        if (NULL != AvpSoundDevice)
 
 
295
        {
 
 
296
            int attrlist[6] =
 
 
297
            {
 
 
298
                ALC_FREQUENCY, 0,
 
 
299
                ALC_SYNC, AL_FALSE,
 
 
300
                0
 
 
301
            };
 
 
302
 
 
 
303
            attrlist[0] = ALC_FREQUENCY;
 
 
304
            attrlist[1] = AvpFrequency;
 
 
305
            attrlist[2] = ALC_SYNC;
 
 
306
            attrlist[3] = AL_FALSE;
 
 
307
            attrlist[4] = 0;
 
 
308
 
 
 
309
            AvpSoundContext = alcCreateContext(AvpSoundDevice, attrlist);
 
 
310
 
 
 
311
            if (NULL != AvpSoundContext)
 
 
312
            {
 
 
313
                ALfloat pos[] = { 0.0, 0.0, 0.0 };
 
 
314
                ALfloat    vel[] = { 0.0, 0.0, 0.0 };
 
 
315
                ALfloat    or[]  = { 0.0, 0.0, 1.0, 0.0, -1.0, 0.0 };
 
 
316
 
 
 
317
                if(ALC_TRUE == alcMakeContextCurrent(AvpSoundContext))
 
 
318
                {
 
 
319
                    alListenerfv(AL_POSITION, pos);
 
 
320
                    alListenerfv(AL_VELOCITY, vel);
 
 
321
                    alListenerfv(AL_ORIENTATION, or);
 
 
322
 
 
 
323
                    alDistanceModel(AL_NONE);
 
 
324
 
 
 
325
                    if (alGetError() != AL_NO_ERROR)
 
 
326
                    {
 
 
327
                        fprintf(stderr, "alListenerfv() error = ...\n");
 
 
328
                        exit(1);
 
 
329
                    }
 
 
330
 
 
 
331
                    for (i = 0; i < SOUND_MAXACTIVE; i++)
 
 
332
                    {
 
 
333
                        ALuint p;
 
 
334
                        alGenSources(1, &p);
 
 
335
 
 
 
336
                        if (alGetError () != AL_NO_ERROR)
 
 
337
                        {
 
 
338
                            fprintf(stderr, "alGenSources () error = ...");
 
 
339
                            return 0;
 
 
340
                        }
 
 
341
 
 
 
342
                        ActiveSounds[i].ds3DBufferP = p;
 
 
343
 
 
 
344
                        alSourcef(p, AL_PITCH, 1.0f);
 
 
345
                        alSourcef(p, AL_GAIN, 1.0f);
 
 
346
                        alSourcefv(p, AL_POSITION, ActiveSounds[i].PropSetP_pos);
 
 
347
                        alSourcefv(p, AL_VELOCITY, ActiveSounds[i].PropSetP_vel);
 
 
348
                        alSourcef(p, AL_ROLLOFF_FACTOR, 0.01f);
 
 
349
                        alSourcef(p, AL_REFERENCE_DISTANCE, 1.0f);
 
 
350
                    }
 
 
351
 
 
 
352
                    alListenerf(AL_GAIN, vol_to_gain_table[UserProfile.EffectsSoundVolume]);
 
 
353
                    return (SoundActivated = 1);
 
 
354
                }
 
 
355
            }
 
 
356
 
 
 
357
            alcCloseDevice(AvpSoundDevice);
 
 
358
        }
 
 
359
    }
 
 
360
 
 
 
361
return 0;
 
 
362
}
 
 
363
 
 
 
364
int SoundHasStopped(int activeIndex)
 
 
365
{
 
 
366
    ALint val;
 
 
367
 
 
 
368
    alGetSourcei(ActiveSounds[activeIndex].ds3DBufferP, AL_SOURCE_STATE, &val);
 
 
369
 
 
 
370
    if(AL_NO_ERROR == alGetError())
 
 
371
    {
 
 
372
        switch(val)
 
 
373
        {
 
 
374
            case AL_INITIAL:
 
 
375
            case AL_PLAYING:
 
 
376
            case AL_PAUSED:
 
 
377
            return 0;
 
 
378
            case AL_STOPPED:
 
 
379
                //printf("has stopped sound %d %s\n", activeIndex, GameSounds[ActiveSounds[activeIndex].soundIndex].wavName);
 
 
380
            default:
 
 
381
            return 1;
 
 
382
        }
 
 
383
    }
 
 
384
 
 
 
385
return 1;
 
 
386
}
 
 
387
 
 
 
388
void PlatStopSound(int activeIndex)
 
 
389
{
 
 
390
    #ifdef OPENAL_DEBUG
 
 
391
    fprintf(stderr, "OPENAL: PlatStopSound(%d)\n", activeIndex);
 
 
392
    #endif    
 
 
393
 
 
 
394
    //if (!SoundHasStopped (activeIndex))
 
 
395
    alSourceStop(ActiveSounds[activeIndex].ds3DBufferP);
 
 
396
}
 
 
397
 
 
 
398
void PlatEndGameSound(SOUNDINDEX index)
 
 
399
{
 
 
400
    if (SoundActivated)
 
 
401
    {
 
 
402
        int i;
 
 
403
 
 
 
404
        GameSounds[index].loaded = 0;
 
 
405
        GameSounds[index].dsFrequency = 0;
 
 
406
 
 
 
407
        if (GameSounds[index].wavName) 
 
 
408
        {
 
 
409
            free(GameSounds[index].wavName);
 
 
410
            GameSounds[index].wavName = NULL;
 
 
411
        }
 
 
412
 
 
 
413
        for (i=0; i < SOUND_MAXACTIVE; i++)
 
 
414
        {
 
 
415
            if (ActiveSounds[i].soundIndex == index) 
 
 
416
            {
 
 
417
                PlatStopSound(i);
 
 
418
                alSourcei(i, AL_BUFFER, 0);
 
 
419
            }
 
 
420
        }
 
 
421
 
 
 
422
        if (GameSounds[index].dsBufferP) 
 
 
423
        {
 
 
424
            alDeleteBuffers(1, &GameSounds[index].dsBufferP);
 
 
425
            GameSounds[index].dsBufferP = 0;
 
 
426
        }
 
 
427
    }
 
 
428
}
 
 
429
 
 
 
430
void cleanup_openal()
 
 
431
{
 
 
432
    if (SoundActivated)
 
 
433
    {
 
 
434
        unsigned int i;
 
 
435
 
 
 
436
        for(i=0; i < SID_MAXIMUM; i++)
 
 
437
        {
 
 
438
            if(GameSounds[i].loaded) 
 
 
439
                PlatEndGameSound(i);
 
 
440
        }    
 
 
441
 
 
 
442
        for (i=0; i < SOUND_MAXACTIVE; i++)
 
 
443
        {
 
 
444
            alDeleteSources(1, &ActiveSounds[i].ds3DBufferP);
 
 
445
            ActiveSounds[i].ds3DBufferP = 0;
 
 
446
        }
 
 
447
 
 
 
448
        alcMakeContextCurrent(NULL);
 
 
449
        alcDestroyContext(AvpSoundContext);
 
 
450
 
 
 
451
        if(ALC_TRUE != alcCloseDevice(AvpSoundDevice))
 
 
452
            printf("failed closing alcCloseDevice\n");
 
 
453
    }
 
 
454
}
 
 
455
 
 
 
456
static int ToneToFrequency(int currentFrequency, int currentPitch, int newPitch)
 
 
457
{
 
 
458
    if (!((currentPitch >= PITCH_MINPLAT) && (currentPitch <= PITCH_MAXPLAT)))
 
 
459
        return 0;
 
 
460
 
 
 
461
    if (!((currentFrequency >= FREQUENCY_MINPLAT) && (currentPitch <= FREQUENCY_MAXPLAT)))
 
 
462
        return 0;
 
 
463
 
 
 
464
    int newFrequency = currentFrequency;
 
 
465
 
 
 
466
    if(newPitch > PITCH_MAXPLAT)
 
 
467
        newPitch = PITCH_MAXPLAT;
 
 
468
    else if(newPitch < PITCH_MINPLAT)
 
 
469
        newPitch = PITCH_MINPLAT;
 
 
470
 
 
 
471
    if(newPitch > currentPitch)
 
 
472
    {
 
 
473
        /* scale up */        
 
 
474
        int numOctaves, numTones;
 
 
475
           numOctaves = (newPitch - currentPitch) / 1536;
 
 
476
        numTones = (newPitch - currentPitch) % 1536;
 
 
477
 
 
 
478
        newFrequency <<= numOctaves;
 
 
479
 
 
 
480
        if(newFrequency > FREQUENCY_MAXPLAT)
 
 
481
            newFrequency = FREQUENCY_MAXPLAT;
 
 
482
 
 
 
483
        if(numTones > 0)
 
 
484
            newFrequency = (int)((float)(newFrequency)*pitch_to_frequency_mult_table[numTones]);
 
 
485
 
 
 
486
        if(newFrequency > FREQUENCY_MAXPLAT)
 
 
487
            newFrequency = FREQUENCY_MAXPLAT;
 
 
488
    }
 
 
489
    else
 
 
490
    {
 
 
491
        /* scale down */
 
 
492
        int numOctaves, numTones;
 
 
493
           numOctaves = (currentPitch - newPitch)/1536;
 
 
494
        numTones = (currentPitch - newPitch)%1536;
 
 
495
 
 
 
496
        newFrequency >>= numOctaves;
 
 
497
 
 
 
498
         if(newFrequency < FREQUENCY_MINPLAT)
 
 
499
            newFrequency = FREQUENCY_MINPLAT;
 
 
500
 
 
 
501
        if(numTones > 0)
 
 
502
            newFrequency = (int)((float)(newFrequency)/pitch_to_frequency_mult_table[numTones]);
 
 
503
 
 
 
504
        if(newFrequency < FREQUENCY_MINPLAT)
 
 
505
            newFrequency = FREQUENCY_MINPLAT;
 
 
506
    }
 
 
507
 
 
 
508
return newFrequency;
 
 
509
} 
 
 
510
 
 
 
511
void PlatChangeSoundVolume(int activeIndex, int volume)
 
 
512
{
 
 
513
    alSourcef(ActiveSounds[activeIndex].ds3DBufferP, AL_GAIN, vol_to_gain_table[volume]);
 
 
514
}
 
 
515
 
 
 
516
int PlatChangeSoundPitch(int activeIndex, int pitch)
 
 
517
{
 
 
518
    SOUNDINDEX gsi = ActiveSounds[activeIndex].soundIndex;
 
 
519
    float frequency;
 
 
520
 
 
 
521
    if ((pitch < PITCH_MIN) || (pitch >= PITCH_MAX))
 
 
522
        return 0;
 
 
523
    else if (pitch == PITCH_DEFAULTPLAT) 
 
 
524
        frequency = GameSounds[gsi].dsFrequency;
 
 
525
    else 
 
 
526
        frequency = ToneToFrequency (GameSounds[gsi].dsFrequency, GameSounds[gsi].pitch, pitch);
 
 
527
 
 
 
528
    frequency = frequency / (float)GameSounds[gsi].dsFrequency;
 
 
529
 
 
 
530
    if (frequency > 2.0)
 
 
531
    {
 
 
532
        #ifdef OPENAL_DEBUG
 
 
533
        fprintf(stderr, "OPENAL: freq clamp = %f\n", frequency);
 
 
534
        #endif    
 
 
535
 
 
 
536
        alSourceStop(ActiveSounds[activeIndex].ds3DBufferP);
 
 
537
        return 0;
 
 
538
    }
 
 
539
 
 
 
540
    alSourcef(ActiveSounds[activeIndex].ds3DBufferP, AL_PITCH, frequency);
 
 
541
 
 
 
542
    #ifdef OPENAL_DEBUG
 
 
543
    fprintf(stderr, "OPENAL: freq change = %f\n", frequency);
 
 
544
    #endif
 
 
545
 
 
 
546
    ActiveSounds[activeIndex].pitch = pitch;
 
 
547
 
 
 
548
    #ifdef OPENAL_DEBUG    
 
 
549
    fprintf(stderr, "OPENAL: PlatChangeSoundPitch(%d, %d) = %f\n", activeIndex, pitch, (double)frequency);
 
 
550
    #endif
 
 
551
 
 
 
552
return 1;
 
 
553
}
 
 
554
 
 
 
555
void PlatDo3dSound(int activeIndex)
 
 
556
{
 
 
557
    VECTORCH relativePosn;
 
 
558
    int newVolume = 0;
 
 
559
 
 
 
560
    relativePosn.vx = ActiveSounds[activeIndex].threedeedata.position.vx - Global_VDB.VDB_World.vx;
 
 
561
    relativePosn.vy = ActiveSounds[activeIndex].threedeedata.position.vy - Global_VDB.VDB_World.vy;
 
 
562
    relativePosn.vz = ActiveSounds[activeIndex].threedeedata.position.vz - Global_VDB.VDB_World.vz;
 
 
563
 
 
 
564
    int distance = Magnitude(&relativePosn);
 
 
565
 
 
 
566
    if (ActiveSounds[activeIndex].paused)
 
 
567
    {
 
 
568
        if (distance < (ActiveSounds[activeIndex].threedeedata.outer_range + SOUND_DEACTIVATERANGE)) 
 
 
569
        {
 
 
570
            PlatStopSound(activeIndex);
 
 
571
            alSourcei(ActiveSounds[activeIndex].ds3DBufferP, AL_LOOPING, ActiveSounds[activeIndex].loop);
 
 
572
            alSourcePlay(ActiveSounds[activeIndex].ds3DBufferP);
 
 
573
            ActiveSounds[activeIndex].paused = 0;
 
 
574
        } 
 
 
575
        else 
 
 
576
            return;
 
 
577
    }
 
 
578
 
 
 
579
    if (distance < ActiveSounds[activeIndex].threedeedata.inner_range) 
 
 
580
    {
 
 
581
        newVolume = ActiveSounds[activeIndex].volume;
 
 
582
    }
 
 
583
    else if (distance < ActiveSounds[activeIndex].threedeedata.outer_range) 
 
 
584
    {
 
 
585
        float in_to_dis_to_out = ActiveSounds[activeIndex].threedeedata.outer_range - distance;
 
 
586
        float in_to_out = ActiveSounds[activeIndex].threedeedata.outer_range - ActiveSounds[activeIndex].threedeedata.inner_range;
 
 
587
 
 
 
588
        if (in_to_out > 0.0) 
 
 
589
            newVolume = (int) ((float)ActiveSounds[activeIndex].volume * (in_to_dis_to_out / in_to_out));
 
 
590
    }
 
 
591
    else if ((distance < (ActiveSounds[activeIndex].threedeedata.outer_range + SOUND_DEACTIVATERANGE)) && ActiveSounds[activeIndex].loop) 
 
 
592
    {
 
 
593
        PlatStopSound(activeIndex);
 
 
594
        ActiveSounds[activeIndex].paused = 1;
 
 
595
    }
 
 
596
 
 
 
597
    if (newVolume > VOLUME_MAX)
 
 
598
        newVolume = VOLUME_MAX;
 
 
599
    else if (newVolume < VOLUME_MIN)
 
 
600
        newVolume = VOLUME_MIN;
 
 
601
 
 
 
602
    #ifdef OPENAL_DEBUG    
 
 
603
        fprintf(stderr, "OPENAL: PlatDo3dSound: idx = %d, volume = %d, distance = %d\n", activeIndex, newVolume, distance);
 
 
604
    #endif
 
 
605
 
 
 
606
    PlatChangeSoundVolume(activeIndex, newVolume);
 
 
607
 
 
 
608
    if (distance < ActiveSounds[activeIndex].threedeedata.outer_range) 
 
 
609
    {
 
 
610
        ActiveSounds[activeIndex].PropSetP_pos[0] = (ALfloat)relativePosn.vx / (ALfloat)distance;
 
 
611
        ActiveSounds[activeIndex].PropSetP_pos[1] = (ALfloat)relativePosn.vy / (ALfloat)distance;
 
 
612
        ActiveSounds[activeIndex].PropSetP_pos[2] = (ALfloat)relativePosn.vz / (ALfloat)distance;
 
 
613
 
 
 
614
        alSourcefv(ActiveSounds[activeIndex].ds3DBufferP, AL_POSITION, ActiveSounds[activeIndex].PropSetP_pos);
 
 
615
 
 
 
616
#ifdef OPENAL_DEBUG
 
 
617
fprintf(stderr, "OPENAL: Sound : (%f, %f, %f) [%d] [%d,%d]\n", ActiveSounds[activeIndex].PropSetP_pos[0], ActiveSounds[activeIndex].PropSetP_pos[1],
ActiveSounds[activeIndex].PropSetP_pos[2], activeIndex, ActiveSounds[activeIndex].threedeedata.inner_range, ActiveSounds[activeIndex].threedeedata.outer_range);
 
 
618
#endif
 
 
619
        ActiveSounds[activeIndex].PropSetP_vel[0] = ActiveSounds[activeIndex].threedeedata.velocity.vx;
 
 
620
        ActiveSounds[activeIndex].PropSetP_vel[1] = ActiveSounds[activeIndex].threedeedata.velocity.vy;
 
 
621
        ActiveSounds[activeIndex].PropSetP_vel[2] = ActiveSounds[activeIndex].threedeedata.velocity.vz;
 
 
622
//        alSourcefv(ActiveSounds[activeIndex].ds3DBufferP, AL_VELOCITY, ActiveSounds[activeIndex].PropSetP_vel);
 
 
623
    }
 
 
624
}
 
 
625
 
 
 
626
int PlatPlaySound(int activeIndex)
 
 
627
{
 
 
628
    int si = ActiveSounds[activeIndex].soundIndex;
 
 
629
 
 
 
630
    alSourcei(ActiveSounds[activeIndex].ds3DBufferP, AL_BUFFER, GameSounds[si].dsBufferP);
 
 
631
 
 
 
632
    if(AL_NO_ERROR == alGetError())
 
 
633
    {
 
 
634
        alSourcei(ActiveSounds[activeIndex].ds3DBufferP, AL_LOOPING, ActiveSounds[activeIndex].loop);
 
 
635
 
 
 
636
        if(AL_NO_ERROR == alGetError())
 
 
637
        {
 
 
638
            //if (1 || ActiveSounds[activeIndex].pitch != GameSounds[si].pitch) 
 
 
639
                PlatChangeSoundPitch(activeIndex, ActiveSounds[activeIndex].pitch);
 
 
640
 
 
 
641
            if (ActiveSounds[activeIndex].threedee)
 
 
642
            {            
 
 
643
                alSourcei(ActiveSounds[activeIndex].ds3DBufferP, AL_SOURCE_RELATIVE, AL_FALSE);
 
 
644
 
 
 
645
                if(AL_NO_ERROR == alGetError())
 
 
646
                    PlatDo3dSound(activeIndex);
 
 
647
            }
 
 
648
            else
 
 
649
            {
 
 
650
                alSourcei(ActiveSounds[activeIndex].ds3DBufferP, AL_SOURCE_RELATIVE, AL_TRUE);
 
 
651
 
 
 
652
                if(AL_NO_ERROR == alGetError())
 
 
653
                {
 
 
654
                    static const ALfloat zero[3] = { 0.0f, 0.0f, 0.0f };
 
 
655
                    alSourcefv(ActiveSounds[activeIndex].ds3DBufferP, AL_POSITION, zero);
 
 
656
 
 
 
657
                    if(AL_NO_ERROR == alGetError())
 
 
658
                    {
 
 
659
                        alSourcefv(ActiveSounds[activeIndex].ds3DBufferP, AL_VELOCITY, zero);
 
 
660
 
 
 
661
                        if(AL_NO_ERROR == alGetError())
 
 
662
                        {
 
 
663
                            int newVolume = ActiveSounds[activeIndex].volume;
 
 
664
                            ActiveSounds[activeIndex].volume = (newVolume * VOLUME_PLAT2DSCALE) >> 7;
 
 
665
                            PlatChangeSoundVolume (activeIndex, ActiveSounds[activeIndex].volume);
 
 
666
                        }
 
 
667
                    }
 
 
668
                }
 
 
669
            }
 
 
670
 
 
 
671
            alSourcePlay(ActiveSounds[activeIndex].ds3DBufferP);
 
 
672
 
 
 
673
        #ifdef OPENAL_DEBUG
 
 
674
            if (ActiveSounds[activeIndex].loop) 
 
 
675
                fprintf(stderr, "OPENAL: Playing sound %i %s looping in slot %i\n", si, GameSounds[si].wavName, activeIndex);
 
 
676
            else
 
 
677
                fprintf(stderr, "OPENAL: Playing sound %i %s once in slot %i\n", si, GameSounds[si].wavName, activeIndex);                
 
 
678
        #endif
 
 
679
        }
 
 
680
    }
 
 
681
 
 
 
682
return (AL_NO_ERROR == alGetError());
 
 
683
}
 
 
684
 
 
 
685
void PlatChangeGlobalVolume(int volume)
 
 
686
{
 
 
687
    if (SoundActivated)
 
 
688
        alListenerf(AL_GAIN, vol_to_gain_table[volume]);
 
 
689
}
 
 
690
 
 
 
691
void PlatUpdatePlayer()
 
 
692
{
 
 
693
    ALfloat vel[3] ={0.0}, or[6], pos[3];
 
 
694
 
 
 
695
    if (AvP.PlayerType != I_Alien) 
 
 
696
    {
 
 
697
        or[0] = (float) ((Global_VDB.VDB_Mat.mat13) / 65536.0F);
 
 
698
        or[1] = 0.0;
 
 
699
        or[2] = (float) ((Global_VDB.VDB_Mat.mat33) / 65536.0F);
 
 
700
        or[3] = 0.0;
 
 
701
        or[4] = -1.0; /* negated for openal */
 
 
702
        or[5] = 0.0;
 
 
703
 
 
 
704
        if (DopplerShiftIsOn && NormalFrameTime)
 
 
705
        {
 
 
706
            DYNAMICSBLOCK *dynPtr = PlayerStatus.sbptr->DynPtr;
 
 
707
            float invFrameTime = 100000.0f/(float)NormalFrameTime;
 
 
708
 
 
 
709
            vel[0] = (float)(dynPtr->Position.vx - dynPtr->PrevPosition.vx) * invFrameTime;
 
 
710
            vel[1] = (float)(dynPtr->Position.vy - dynPtr->PrevPosition.vy) * invFrameTime;
 
 
711
            vel[2] = (float)(dynPtr->Position.vz - dynPtr->PrevPosition.vz) * invFrameTime;
 
 
712
        } 
 
 
713
    } 
 
 
714
    else
 
 
715
    {
 
 
716
        or[0] = (float) ((Global_VDB.VDB_Mat.mat13) / 65536.0F);
 
 
717
        or[1] = (float) ((Global_VDB.VDB_Mat.mat23) / 65536.0F);
 
 
718
        or[2] = (float) ((Global_VDB.VDB_Mat.mat33) / 65536.0F);
 
 
719
        or[3] = -(float) ((Global_VDB.VDB_Mat.mat12) / 65536.0F);
 
 
720
        or[4] = -(float) ((Global_VDB.VDB_Mat.mat22) / 65536.0F); /* negated for openal */
 
 
721
        or[5] = -(float) ((Global_VDB.VDB_Mat.mat32) / 65536.0F);
 
 
722
    }
 
 
723
 
 
 
724
    pos[0] = Global_VDB.VDB_World.vx; // 10000.0;
 
 
725
    pos[1] = Global_VDB.VDB_World.vy; // 10000.0;
 
 
726
    pos[2] = Global_VDB.VDB_World.vz; // 10000.0;
 
 
727
 
 
 
728
#ifdef OPENAL_DEBUG            
 
 
729
fprintf(stderr, "OPENAL: Player: (%f, %f, %f) (%f, %f, %f %f, %f, %f)\n", pos[0], pos[1], pos[2], or[0], or[1], or[2], or[3], or[4], or[5]);
 
 
730
#endif
 
 
731
    // fixme: add reverb check
 
 
732
    alListenerfv (AL_ORIENTATION, or);
 
 
733
//    alListenerfv (AL_VELOCITY, vel);
 
 
734
//    alListenerfv (AL_POSITION, pos);
 
 
735
}
 
 
736
 
 
 
737
void InitialiseBaseFrequency(SOUNDINDEX soundNum)
 
 
738
{
 
 
739
#ifdef OPENAL_DEBUG    
 
 
740
fprintf(stderr, "OPENAL: InitialiseBaseFrequency(%d) [%d] pitch = %d\n", soundNum, GameSounds[soundNum].pitch==PITCH_DEFAULTPLAT,
GameSounds[soundNum].pitch);
 
 
741
#endif
 
 
742
    if(GameSounds[soundNum].pitch == PITCH_DEFAULTPLAT) 
 
 
743
        return;
 
 
744
    else if(GameSounds[soundNum].pitch > PITCH_MAXPLAT)
 
 
745
        GameSounds[soundNum].pitch = PITCH_MAXPLAT;
 
 
746
    else if(GameSounds[soundNum].pitch < PITCH_MINPLAT)
 
 
747
        GameSounds[soundNum].pitch = PITCH_MINPLAT;
 
 
748
 
 
 
749
    int frequency = ToneToFrequency(GameSounds[soundNum].dsFrequency, PITCH_DEFAULTPLAT, GameSounds[soundNum].pitch);
 
 
750
 
 
 
751
    #ifdef OPENAL_DEBUG
 
 
752
        fprintf(stderr, "OPENAL: old=%d,new=%d\n", GameSounds[soundNum].dsFrequency, frequency);
 
 
753
    #endif
 
 
754
    GameSounds[soundNum].dsFrequency = frequency;
 
 
755
}
 
 
756
 
 
 
757
void UpdateSoundFrequencies()
 
 
758
{
 
 
759
    int i = 0;
 
 
760
 
 
 
761
    #ifdef OPENAL_DEBUG
 
 
762
    fprintf(stderr, "OPENAL: UpdateSoundFreqncies()\n");
 
 
763
    #endif
 
 
764
 
 
 
765
    for (; i < SOUND_MAXACTIVE; i++) 
 
 
766
    {
 
 
767
        if(SID_NOSOUND != ActiveSounds[i].soundIndex)
 
 
768
        {
 
 
769
            int gameIndex = ActiveSounds[i].soundIndex;
 
 
770
 
 
 
771
            #ifdef OPENAL_DEBUG
 
 
772
            //if (TimeScale != ONE_FIXED) fprintf(stderr, "OPENAL: UpdateSoundFreqncies %d, f = %d\n", i,
MUL_FIXED(GameSounds[gameIndex].dsFrequency,TimeScale));
 
 
773
            #endif
 
 
774
 
 
 
775
            if (ActiveSounds[i].pitch != GameSounds[gameIndex].pitch)
 
 
776
                PlatChangeSoundPitch(i, ActiveSounds[i].pitch);
 
 
777
        }
 
 
778
    }
 
 
779
}
 
 
780
 
 
 
781
int LoadWavFile(int soundNum, const char *path, const char *wavFileName)
 
 
782
{
 
 
783
    SDL_AudioSpec wav_spec;
 
 
784
    Uint32 wav_length;
 
 
785
    Uint8 *wav_buffer;
 
 
786
    int len = strlen("sound") + strlen(path) + 10;
 
 
787
    int len2 = strlen(wavFileName) + 1; 
 
 
788
    char *file_and_path = malloc(len + len2);
 
 
789
 
 
 
790
    if(NULL == file_and_path)
 
 
791
        return 0;
 
 
792
 
 
 
793
    sprintf(file_and_path, "sound%c%s%c%s", DIR_SEPARATOR, path, DIR_SEPARATOR, wavFileName);
 
 
794
 
 
 
795
    char *full_file_path = FullFilePath(file_and_path);
 
 
796
    free(file_and_path);
 
 
797
 
 
 
798
    if(NULL != SDL_LoadWAV(full_file_path, &wav_spec, &wav_buffer, &wav_length))
 
 
799
    {
 
 
800
        alGenBuffers(1, &GameSounds[soundNum].dsBufferP);
 
 
801
 
 
 
802
        if (alGetError() == AL_NO_ERROR)
 
 
803
        {
 
 
804
            ALenum format;
 
 
805
 
 
 
806
            switch(wav_spec.format)
 
 
807
            {
 
 
808
                case AUDIO_U8:
 
 
809
                case AUDIO_S8:
 
 
810
                {
 
 
811
                    switch(wav_spec.channels)
 
 
812
                    {
 
 
813
                        case 1:
 
 
814
                            format = AL_FORMAT_MONO8;
 
 
815
                        break;
 
 
816
                        case 2:
 
 
817
                            format = AL_FORMAT_STEREO8;
 
 
818
                        break;
 
 
819
                        default:
 
 
820
                            format = AL_INVALID_VALUE;
 
 
821
                            printf("WAV DEBUG: too many channels\n" );
 
 
822
                    }
 
 
823
                }
 
 
824
                break;
 
 
825
                default:
 
 
826
                {
 
 
827
                    switch(wav_spec.channels)
 
 
828
                    {
 
 
829
                        case 1:
 
 
830
                            format = AL_FORMAT_MONO16;
 
 
831
                        break;
 
 
832
                        case 2:
 
 
833
                            format = AL_FORMAT_STEREO16;
 
 
834
                        break;
 
 
835
                        default:
 
 
836
                            format = AL_INVALID_VALUE;
 
 
837
                            printf("WAV DEBUG: too many channels\n" );
 
 
838
                    }
 
 
839
                }
 
 
840
            }
 
 
841
 
 
 
842
            if(AL_INVALID_VALUE != format)
 
 
843
            {
 
 
844
                alBufferData(GameSounds[soundNum].dsBufferP, format, wav_buffer, wav_length, wav_spec.freq);
 
 
845
 
 
 
846
                if (alGetError() == AL_NO_ERROR)
 
 
847
                {
 
 
848
                    GameSounds[soundNum].wavName = malloc(len2);
 
 
849
 
 
 
850
                    if(NULL != GameSounds[soundNum].wavName)
 
 
851
                    {
 
 
852
                        strcpy(GameSounds[soundNum].wavName, wavFileName);
 
 
853
                        GameSounds[soundNum].dsFrequency = wav_spec.freq;
 
 
854
                        GameSounds[soundNum].loaded = 1;
 
 
855
                        //fprintf(stderr, "LoadWavFile(%d, %s) - sound\n", soundNum, wavFileName);
 
 
856
                    }
 
 
857
                }
 
 
858
            }
 
 
859
        }
 
 
860
 
 
 
861
        SDL_FreeWAV(wav_buffer);
 
 
862
    }
 
 
863
    else
 
 
864
    {
 
 
865
        puts(SDL_GetError());
 
 
866
    }
 
 
867
 
 
 
868
    //if(!GameSounds[soundNum].loaded) printf("Failed to load %s\n", full_file_path);
 
 
869
 
 
 
870
    free(full_file_path);
 
 
871
 
 
 
872
    return GameSounds[soundNum].loaded;
 
 
873
}