mirror of https://github.com/OpenRCT2/OpenRCT2.git
278 lines
6.9 KiB
C++
278 lines
6.9 KiB
C++
/*****************************************************************************
|
|
* Copyright (c) 2014-2024 OpenRCT2 developers
|
|
*
|
|
* For a complete list of all authors, please refer to contributors.md
|
|
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
|
|
*
|
|
* OpenRCT2 is licensed under the GNU General Public License version 3.
|
|
*****************************************************************************/
|
|
|
|
#pragma once
|
|
|
|
#include "../Identifiers.h"
|
|
#include "../common.h"
|
|
#include "../ride/RideTypes.h"
|
|
#include "AudioMixer.h"
|
|
|
|
#include <memory>
|
|
#include <string_view>
|
|
#include <vector>
|
|
|
|
class AudioObject;
|
|
struct CoordsXYZ;
|
|
|
|
namespace OpenRCT2::Audio
|
|
{
|
|
constexpr size_t kMaxDeviceNameSize = 256;
|
|
constexpr size_t kMaxVehicleSounds = 14;
|
|
constexpr size_t kMaxDefaultMusic = 46;
|
|
constexpr uint16_t kSoundIdNull = 0xFFFF;
|
|
|
|
#define AUDIO_PLAY_AT_CENTRE 0x8000
|
|
|
|
struct IAudioChannel;
|
|
struct IAudioSource;
|
|
enum class MixerGroup : int32_t;
|
|
enum class SoundId : uint8_t;
|
|
|
|
struct Sound
|
|
{
|
|
SoundId Id;
|
|
int16_t Volume;
|
|
int16_t Pan;
|
|
uint16_t Frequency;
|
|
std::shared_ptr<IAudioChannel> Channel;
|
|
};
|
|
|
|
struct VehicleSound
|
|
{
|
|
uint16_t id;
|
|
int16_t volume;
|
|
Sound TrackSound;
|
|
Sound OtherSound;
|
|
};
|
|
|
|
struct VehicleSoundParams
|
|
{
|
|
uint16_t id;
|
|
int16_t pan_x;
|
|
int16_t pan_y;
|
|
uint16_t frequency;
|
|
int16_t volume;
|
|
uint16_t priority;
|
|
};
|
|
|
|
enum class SoundId : uint8_t
|
|
{
|
|
LiftClassic,
|
|
TrackFrictionClassicWood,
|
|
FrictionClassic,
|
|
Scream1,
|
|
Click1,
|
|
Click2,
|
|
PlaceItem,
|
|
Scream2,
|
|
Scream3,
|
|
Scream4,
|
|
Scream5,
|
|
Scream6,
|
|
LiftFrictionWheels,
|
|
Purchase,
|
|
Crash,
|
|
LayingOutWater,
|
|
Water1,
|
|
Water2,
|
|
TrainWhistle,
|
|
TrainDeparting,
|
|
WaterSplash,
|
|
GoKartEngine,
|
|
RideLaunch1,
|
|
RideLaunch2,
|
|
Cough1,
|
|
Cough2,
|
|
Cough3,
|
|
Cough4,
|
|
Rain,
|
|
Thunder1,
|
|
Thunder2,
|
|
TrackFrictionTrain,
|
|
TrackFrictionWater,
|
|
BalloonPop,
|
|
MechanicFix,
|
|
Scream7,
|
|
ToiletFlush,
|
|
Click3,
|
|
Quack,
|
|
NewsItem,
|
|
WindowOpen,
|
|
Laugh1,
|
|
Laugh2,
|
|
Laugh3,
|
|
Applause,
|
|
HauntedHouseScare,
|
|
HauntedHouseScream1,
|
|
HauntedHouseScream2,
|
|
BlockBrakeClose,
|
|
BlockBrakeRelease,
|
|
Error,
|
|
BrakeRelease,
|
|
LiftArrow,
|
|
LiftWood,
|
|
TrackFrictionWood,
|
|
LiftWildMouse,
|
|
LiftBM,
|
|
TrackFrictionBM,
|
|
Scream8,
|
|
Tram,
|
|
DoorOpen,
|
|
DoorClose,
|
|
Portcullis,
|
|
CrowdAmbience,
|
|
LiftRMC,
|
|
TrackFrictionRMC,
|
|
LiftFlume,
|
|
NoScream = 254,
|
|
Null = 255
|
|
};
|
|
|
|
constexpr uint8_t kRCT2SoundCount = static_cast<uint32_t>(SoundId::Portcullis) + 1;
|
|
|
|
namespace AudioObjectIdentifiers
|
|
{
|
|
constexpr std::string_view kRCT1Title = "rct1.audio.title";
|
|
// virtual name, used by either RCT2Base or RCTCBase, depending on which one is loaded.
|
|
constexpr std::string_view kRCT2 = "rct2.audio.base";
|
|
constexpr std::string_view kRCT2Base = "rct2.audio.base.rct2";
|
|
constexpr std::string_view kRCTCBase = "rct2.audio.base.rctc";
|
|
constexpr std::string_view kRCT2Title = "rct2.audio.title";
|
|
constexpr std::string_view kOpenRCT2Title = "openrct2.audio.title";
|
|
constexpr std::string_view kRCT2Circus = "rct2.audio.circus";
|
|
constexpr std::string_view kOpenRCT2Additional = "openrct2.audio.additional";
|
|
} // namespace AudioObjectIdentifiers
|
|
|
|
extern bool gGameSoundsOff;
|
|
extern int32_t gVolumeAdjustZoom;
|
|
|
|
extern VehicleSound gVehicleSoundList[kMaxVehicleSounds];
|
|
|
|
/**
|
|
* Returns false when no audio device is available or when audio is turned off, otherwise true.
|
|
*/
|
|
bool IsAvailable();
|
|
|
|
/*
|
|
* Returns the amount of available audio devices.
|
|
*/
|
|
int32_t GetDeviceCount();
|
|
|
|
/**
|
|
* Returns the device name by index.
|
|
*/
|
|
const std::string& GetDeviceName(int32_t index);
|
|
|
|
/**
|
|
* Returns the currently used device index, -1 if not available.
|
|
*/
|
|
int32_t GetCurrentDeviceIndex();
|
|
|
|
/**
|
|
* Deregisters the audio device.
|
|
* rct2: 0x006BAB21
|
|
*/
|
|
void Close();
|
|
|
|
/**
|
|
* Initialises the audio subsystem.
|
|
*/
|
|
void Init();
|
|
|
|
void LoadAudioObjects();
|
|
|
|
/**
|
|
* Loads the ride sounds and info.
|
|
* rct2: 0x006BA8E0
|
|
*/
|
|
void InitRideSoundsAndInfo();
|
|
|
|
/**
|
|
* Loads the ride sounds.
|
|
* rct2: 0x006BA9B5
|
|
*/
|
|
void InitRideSounds(int32_t device);
|
|
|
|
/**
|
|
* Temporarily stops playing sounds until audio_unpause_sounds() is called.
|
|
* rct2: 0x006BABB4
|
|
*/
|
|
void Pause();
|
|
|
|
/**
|
|
* Plays the specified sound.
|
|
* @param soundId The sound effect to play.
|
|
* @param volume The volume at which the sound effect should be played.
|
|
* @param pan The pan at which the sound effect should be played. If set to anything other than AUDIO_PLAY_AT_CENTRE, plays
|
|
* the sound at a position relative to the centre of the viewport.
|
|
*/
|
|
void Play(SoundId soundId, int32_t volume, int32_t pan);
|
|
|
|
/**
|
|
* Plays the specified sound at a virtual location.
|
|
* @param soundId The sound effect to play.
|
|
* @param x The x coordinate of the location.
|
|
* @param y The y coordinate of the location.
|
|
* @param z The z coordinate of the location.
|
|
*/
|
|
void Play3D(SoundId soundId, const CoordsXYZ& loc);
|
|
|
|
/**
|
|
* Populates the gAudioDevices array with the available audio devices.
|
|
*/
|
|
void PopulateDevices();
|
|
|
|
/**
|
|
* Starts playing the title music.
|
|
* rct2: 0x006BD0F8
|
|
*/
|
|
void PlayTitleMusic();
|
|
|
|
/**
|
|
* Stops the title music from playing.
|
|
* rct2: 0x006BD0BD
|
|
*/
|
|
void StopTitleMusic();
|
|
|
|
/**
|
|
* Stops vehicle sounds from playing.
|
|
* rct2: 0x006BABDF
|
|
*/
|
|
void StopVehicleSounds();
|
|
|
|
/**
|
|
* Toggles whether all sounds should be played.
|
|
* rct2: 0x006BAB8A
|
|
*/
|
|
void ToggleAllSounds();
|
|
|
|
/**
|
|
* Resumes playing sounds that had been paused by a call to audio_pause_sounds().
|
|
* rct2: 0x006BABD8
|
|
*/
|
|
void Resume();
|
|
|
|
void StopAll();
|
|
|
|
AudioObject* GetBaseAudioObject();
|
|
|
|
std::shared_ptr<IAudioChannel> CreateAudioChannel(
|
|
SoundId soundId, bool loop = false, int32_t volume = kMixerVolumeMax, float pan = 0.5f, double rate = 1,
|
|
bool forget = false);
|
|
std::shared_ptr<IAudioChannel> CreateAudioChannel(
|
|
IAudioSource* source, MixerGroup group, bool loop = false, int32_t volume = kMixerVolumeMax, float pan = 0.5f,
|
|
double rate = 1, bool forget = false);
|
|
|
|
int32_t DStoMixerVolume(int32_t volume);
|
|
float DStoMixerPan(int32_t pan);
|
|
double DStoMixerRate(int32_t frequency);
|
|
|
|
} // namespace OpenRCT2::Audio
|