Files
2026-02-02 04:50:13 +01:00

166 lines
5.0 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program 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 3 of the License, or
* (at your option) any later version.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef QDENGINE_SYSTEM_SOUND_SND_DISPATCHER_H
#define QDENGINE_SYSTEM_SOUND_SND_DISPATCHER_H
#include "qdengine/system/sound/snd_sound.h"
namespace QDEngine {
//! Диспетчер звуков на DirectSound.
class sndDispatcher {
public:
sndDispatcher();
~sndDispatcher();
//! Логический квант.
void quant();
//! Запускает проигрывание звука.
bool play_sound(const sndSound *snd, bool loop, int vol = 255);
//! Останавливает проигрывание звука.
bool stop_sound(const sndSound *snd);
//! Останавливает проигрывание звука.
bool stop_sound(const sndHandle *handle);
//! Возвращает состояние звука (играется/остановлен и т.д.).
sndSound::status_t sound_status(const sndHandle *handle) const;
//! Возвращает состояние звука (играется/остановлен и т.д.).
sndSound::status_t sound_status(const sndSound *snd) const;
//! Изменение частоты звука.
bool set_sound_frequency(const sndHandle *snd, float coeff);
//! Изменение громкости, диапазон значений - [0, 255].
void set_volume(uint32 vol);
uint32 volume() const {
return _volume;
}
//! Возвращает установленную громкость в децибелах.
int volume_dB() const {
return _volume_dB;
}
void set_frequency_coeff(float coeff) {
_frequency_coeff = coeff;
update_frequency();
}
float frequency_coeff() const {
return _frequency_coeff;
}
//! Пересчет громкости в децибелы.
static int convert_volume_to_dB(int vol);
//! Останавливает все звуки.
void stop_sounds();
//! Ставит все играющие в данный момент звуки на паузу.
void pause_sounds();
//! Возобновляет проигрывание всех звуков, которые были поставлены на паузу.
void resume_sounds();
//! Ставит все звуки на паузу до вызова resume().
void pause() {
_is_paused = true;
pause_sounds();
}
//! Возобновляет проигрывание всех звуков.
void resume() {
_is_paused = false;
resume_sounds();
}
//! Возвращает true, если звуки поставлены на паузу.
bool is_paused() const {
return _is_paused;
}
//! Возвращает true, если звук выключен.
bool is_enabled() const {
return _is_enabled;
}
//! Включает звук.
void enable() {
_is_enabled = true;
}
//! Выключает звук.
void disable() {
_is_enabled = false;
stop_sounds();
}
void syncSoundSettings();
//! Возвращает указатель на текущий диспетчер.
static inline sndDispatcher *get_dispatcher() {
return _dispatcher_ptr;
}
//! Устанавливает указатель на текущий диспетчер.
static inline sndDispatcher *set_dispatcher(sndDispatcher *p) {
sndDispatcher *old_p = _dispatcher_ptr;
_dispatcher_ptr = p;
return old_p;
}
protected:
//! Обновление установки громкости.
bool update_volume();
bool update_frequency();
private:
//! Звук выключен, если false.
bool _is_enabled;
//! Громкость, диапазон значений - [0, 255].
/**
0 - звук полностью давится
255 - звук играется в полную громкость
*/
uint32 _volume;
//! Громкость в децибелах, диапазон значений - [-10000, 0].
/**
-10000 - звук полностью давится
0 - звук играется в полную громкость
*/
int _volume_dB;
float _frequency_coeff;
//! Пауза.
bool _is_paused;
typedef Std::list<sndSound> sound_list_t;
//! Список активных звуков.
sound_list_t _sounds;
//! Текущий диспетчер.
static sndDispatcher *_dispatcher_ptr;
// Audio::SeekableAudioStream *_audioStream;
};
} // namespace QDEngine
#endif // QDENGINE_SYSTEM_SOUND_SND_DISPATCHER_H