openmohaa/code/client/snd_openal_new.h

239 lines
6 KiB
C
Raw Permalink Normal View History

/*
===========================================================================
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 {
2024-01-09 23:30:29 +01:00
vec3_t vOrigin;
vec3_t vRelativeOrigin;
vec3_t vVelocity;
sfx_t *pSfx;
qboolean bPlaying;
2024-01-09 23:30:29 +01:00
int iChannel;
float fVolume;
float fPitch;
int iStartTime;
qboolean bInUse;
qboolean bCombine;
2024-01-09 23:30:29 +01:00
float fBaseVolume;
float fMinDist;
float fMaxDist;
int iFlags;
} openal_loop_sound_t;
struct openal_channel {
2024-01-09 23:30:29 +01:00
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;
2024-01-09 23:30:29 +01:00
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;
};
2024-09-14 21:55:15 +02:00
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;
2024-01-09 23:30:29 +01:00
// Pointers to channels
openal_channel *channel[MAX_SOUNDSYSTEM_CHANNELS];
2024-01-09 23:30:29 +01:00
openal_loop_sound_t loop_sounds[MAX_SOUNDSYSTEM_LOOP_SOUNDS];
2024-01-09 23:30:29 +01:00
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