File: snd_openal_new.h

package info (click to toggle)
openmohaa 0.82.1%2Bdfsg-1
  • links: PTS, VCS
  • area: contrib
  • in suites: forky, sid
  • size: 34,192 kB
  • sloc: cpp: 315,720; ansic: 275,789; sh: 312; xml: 246; asm: 141; makefile: 7
file content (238 lines) | stat: -rw-r--r-- 6,143 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
/*
===========================================================================
Copyright (C) 2024 the OpenMoHAA team

This file is part of OpenMoHAA source code.

OpenMoHAA source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.

OpenMoHAA source code is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with OpenMoHAA source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
===========================================================================
*/

#pragma once

#include "qal.h"

#undef OPENAL

typedef int          S32;
typedef unsigned int U32;

#define MAX_STREAM_BUFFERS              16
#define MAX_BUFFER_SAMPLES              16384

typedef enum {
    FADE_NONE,
    FADE_IN,
    FADE_OUT
} fade_t;

typedef struct {
    vec3_t vOrigin;
    vec3_t vRelativeOrigin;
    vec3_t vVelocity;

    sfx_t   *pSfx;
    qboolean bPlaying;

    int   iChannel;
    float fVolume;
    float fPitch;

    int      iStartTime;
    qboolean bInUse;
    qboolean bCombine;

    float fBaseVolume;
    float fMinDist;
    float fMaxDist;
    int   iFlags;
} openal_loop_sound_t;

struct openal_channel {
    sfx_t *pSfx;
    int    iEntNum;
    int    iEntChannel;
    vec3_t vOrigin;

    float fVolume;
    int   iBaseRate;
    float fNewPitchMult;
    float fMinDist;
    float fMaxDist;

    int iStartTime;
    int iTime;
    int iEndTime;
    int iFlags;
    int iPausedOffset;

    int song_number;

    fade_t fading;
    int    fade_time;
    int    fade_start_time;

    ALuint   source;
    ALuint   buffer;
    ALubyte *bufferdata;

public:
    void         play();
    virtual void stop();
    void         pause();

    void  set_no_3d();
    void  set_3d();
    void  set_no_virtualization();
    void  set_virtualization();

    void set_gain(float gain);
    void set_velocity(float v0, float v1, float v2);
    void set_position(float v0, float v1, float v2);

    bool is_free();
    bool is_paused();
    bool is_playing();

    void         force_free();
    virtual bool set_sfx(sfx_t *pSfx);

    void start_sample();
    void stop_sample();
    void resume_sample();
    void end_sample();

    void set_sample_pan(S32 pan);
    void set_sample_playback_rate(S32 pan);
    S32  sample_playback_rate();

    S32          sample_volume();
    virtual U32  sample_offset();
    U32          sample_ms_offset();
    U32          sample_loop_count();
    virtual void set_sample_offset(U32 offset);
    void         set_sample_ms_offset(U32 offset);
    virtual void set_sample_loop_count(S32 count);
    void         set_sample_loop_block(S32 start_offset, S32 end_offset);

    U32 sample_status();

public:
    virtual void update();

    virtual U32 buffer_frequency() const;
};

struct openal_channel_two_d_stream : public openal_channel {
private:
    char         fileName[64];
    void        *streamHandle;
    unsigned int buffers[MAX_STREAM_BUFFERS];
    unsigned int currentBuf;
    unsigned int sampleLoopCount;
    unsigned int sampleLooped;
    unsigned int streamNextOffset;
    bool         streaming;

public:
    openal_channel_two_d_stream();
    ~openal_channel_two_d_stream();

    void stop() override;
    bool set_sfx(sfx_t *pSfx) override;
    void set_sample_loop_count(S32 count) override;
    void update() override;
    U32  sample_offset() override;
    void set_sample_offset(U32 offset) override;

    bool queue_stream(const char *fileName);

protected:
    U32 buffer_frequency() const override;

private:
    void clear_stream();

    unsigned int getQueueLength() const;
    unsigned int getCurrentStreamPosition() const;
    unsigned int getBitsPerSample() const;
};

struct openal_movie_channel : public openal_channel {

};

struct openal_internal_t {
    openal_channel              chan_3D[MAX_SOUNDSYSTEM_CHANNELS_3D];
    openal_channel              chan_2D[MAX_SOUNDSYSTEM_CHANNELS_2D];
    openal_channel_two_d_stream chan_2D_stream[MAX_SOUNDSYSTEM_CHANNELS_2D_STREAM];
    openal_channel_two_d_stream chan_song[MAX_SOUNDSYSTEM_SONGS];
    openal_channel_two_d_stream chan_mp3;
    openal_channel_two_d_stream chan_trig_music;
    openal_channel_two_d_stream chan_movie;

    // Pointers to channels
    openal_channel *channel[MAX_SOUNDSYSTEM_CHANNELS];

    openal_loop_sound_t loop_sounds[MAX_SOUNDSYSTEM_LOOP_SOUNDS];

    openal_channel movieChannel;
    sfx_t          movieSFX;

    char tm_filename[MAX_RES_NAME];
    int  tm_loopcount;
};

#ifdef __cplusplus
extern "C" {
#endif

    qboolean S_OPENAL_Init();
    void     S_OPENAL_Shutdown();
    void     S_OPENAL_StartSound(
            const vec3_t vOrigin,
            int          iEntNum,
            int          iEntChannel,
            sfxHandle_t  sfxHandle,
            float        fVolume,
            float        fMinDist,
            float        fPitch,
            float        fMaxDist,
            qboolean     bStreamed
        );
    void S_OPENAL_AddLoopingSound(
        const vec3_t vOrigin,
        const vec3_t vVelocity,
        sfxHandle_t  sfxHandle,
        float        fVolume,
        float        fMinDist,
        float        fMaxDist,
        float        fPitch,
        int          iFlags
    );
    void S_OPENAL_ClearLoopingSounds();
    void S_OPENAL_StopSound(int iEntNum, int iEntChannel);
    void S_OPENAL_StopAllSounds(qboolean bStopMusic);
    void S_OPENAL_Respatialize(int iEntNum, const vec3_t vHeadPos, const vec3_t vAxis[3]);
    void S_OPENAL_SetReverb(int iType, float fLevel);
    void S_OPENAL_Update();

    const char  *S_OPENAL_GetMusicFilename();
    int          S_OPENAL_GetMusicLoopCount();
    unsigned int S_OPENAL_GetMusicOffset();

#ifdef __cplusplus
}
#endif