sound pt1
parent
5d519799e6
commit
81cf0e0719
|
@ -46,7 +46,7 @@ if(SOUND_PROBLEM)
|
||||||
"To continue, either fill in the required paths or disable sound. (-DENABLE_AUDIO=0)")
|
"To continue, either fill in the required paths or disable sound. (-DENABLE_AUDIO=0)")
|
||||||
endif()
|
endif()
|
||||||
if(USE_AUDIO)
|
if(USE_AUDIO)
|
||||||
set(audio_SRCS sound.cpp sound_openal.cpp)
|
set(audio_SRCS sound.c sound_ogg.c sound_wav.c)
|
||||||
set(AUDIO_INCLUDE_DIRS
|
set(AUDIO_INCLUDE_DIRS
|
||||||
${OPENAL_INCLUDE_DIR}
|
${OPENAL_INCLUDE_DIR}
|
||||||
${VORBIS_INCLUDE_DIR}
|
${VORBIS_INCLUDE_DIR}
|
||||||
|
@ -56,8 +56,6 @@ if(USE_AUDIO)
|
||||||
${OPENAL_LIBRARY}
|
${OPENAL_LIBRARY}
|
||||||
${VORBIS_LIBRARIES}
|
${VORBIS_LIBRARIES}
|
||||||
)
|
)
|
||||||
else()
|
|
||||||
set(audio_SRCS sound.cpp)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
option(ENABLE_FREETYPE "Enable freetype2 (truetype fonts and basic unicode support)" ON)
|
option(ENABLE_FREETYPE "Enable freetype2 (truetype fonts and basic unicode support)" ON)
|
||||||
|
@ -279,7 +277,6 @@ set(voxelands_SRCS
|
||||||
# Server sources
|
# Server sources
|
||||||
set(voxelandsserver_SRCS
|
set(voxelandsserver_SRCS
|
||||||
${common_SRCS}
|
${common_SRCS}
|
||||||
${audio_SRCS}
|
|
||||||
servermain.cpp
|
servermain.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -415,7 +412,7 @@ else()
|
||||||
|
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "${OPT_FLAGS} ${SAFETY_FLAGS} -Wall -DNDEBUG -pipe -fpermissive -Wno-write-strings")
|
set(CMAKE_CXX_FLAGS_RELEASE "${OPT_FLAGS} ${SAFETY_FLAGS} -Wall -DNDEBUG -pipe -fpermissive -Wno-write-strings")
|
||||||
set(CMAKE_C_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
|
set(CMAKE_C_FLAGS_RELEASE "${OPT_FLAGS} ${SAFETY_FLAGS} -Wall -DNDEBUG -pipe -ansi -pedantic")
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "${SAFETY_FLAGS} -Wall -O0 -g3 -ggdb -fpermissive -Wno-write-strings")
|
set(CMAKE_CXX_FLAGS_DEBUG "${SAFETY_FLAGS} -Wall -O0 -g3 -ggdb -fpermissive -Wno-write-strings")
|
||||||
set(CMAKE_C_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
|
set(CMAKE_C_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
#include "array.h"
|
#include "array.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
#include "ban.h"
|
#include "ban.h"
|
||||||
|
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
|
|
|
@ -202,8 +202,7 @@ void * MeshUpdateThread::Thread()
|
||||||
Client::Client(
|
Client::Client(
|
||||||
IrrlichtDevice *device,
|
IrrlichtDevice *device,
|
||||||
std::string password,
|
std::string password,
|
||||||
MapDrawControl &control,
|
MapDrawControl &control):
|
||||||
ISoundManager *sound):
|
|
||||||
m_mesh_update_thread(),
|
m_mesh_update_thread(),
|
||||||
m_env(
|
m_env(
|
||||||
this,
|
this,
|
||||||
|
@ -216,7 +215,6 @@ Client::Client(
|
||||||
m_server_suffocation(false),
|
m_server_suffocation(false),
|
||||||
m_server_hunger(false),
|
m_server_hunger(false),
|
||||||
m_con(PROTOCOL_ID, 512, CONNECTION_TIMEOUT, this),
|
m_con(PROTOCOL_ID, 512, CONNECTION_TIMEOUT, this),
|
||||||
m_sound(sound),
|
|
||||||
m_device(device),
|
m_device(device),
|
||||||
m_server_ser_ver(SER_FMT_VER_INVALID),
|
m_server_ser_ver(SER_FMT_VER_INVALID),
|
||||||
m_inventory_updated(false),
|
m_inventory_updated(false),
|
||||||
|
@ -1624,7 +1622,8 @@ void Client::useItem()
|
||||||
// Send as reliable
|
// Send as reliable
|
||||||
Send(0, data, true);
|
Send(0, data, true);
|
||||||
|
|
||||||
if (g_sound) {
|
#if USE_AUDIO == 1
|
||||||
|
{
|
||||||
InventoryItem *item = (InventoryItem*)m_env.getLocalPlayer()->getWieldItem();
|
InventoryItem *item = (InventoryItem*)m_env.getLocalPlayer()->getWieldItem();
|
||||||
if (!item)
|
if (!item)
|
||||||
return;
|
return;
|
||||||
|
@ -1633,8 +1632,9 @@ void Client::useItem()
|
||||||
if ((w&CONTENT_CRAFTITEM_MASK) == CONTENT_CRAFTITEM_MASK)
|
if ((w&CONTENT_CRAFTITEM_MASK) == CONTENT_CRAFTITEM_MASK)
|
||||||
snd = content_craftitem_features(w)->sound_use;
|
snd = content_craftitem_features(w)->sound_use;
|
||||||
if (snd != "")
|
if (snd != "")
|
||||||
g_sound->playSound(snd,false);
|
sound_play_effect(snd.c_str(),1.0,NULL);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::clickActiveObject(u8 button, u16 id, u16 item_i)
|
void Client::clickActiveObject(u8 button, u16 id, u16 item_i)
|
||||||
|
@ -2284,27 +2284,14 @@ float Client::getRTT(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ISoundManager* Client::getSoundManager()
|
|
||||||
{
|
|
||||||
if (m_sound == NULL)
|
|
||||||
return &dummySoundManager;
|
|
||||||
return m_sound;
|
|
||||||
}
|
|
||||||
|
|
||||||
// foot: 0 = left, 1 = right
|
// foot: 0 = left, 1 = right
|
||||||
void Client::playStepSound(int foot)
|
void Client::playStepSound(int foot)
|
||||||
{
|
{
|
||||||
if (!g_sound)
|
//sound_playStep(&m_env.getMap(),m_env.getLocalPlayer()->getPosition(),foot);
|
||||||
return;
|
|
||||||
|
|
||||||
sound_playStep(&m_env.getMap(),m_env.getLocalPlayer()->getPosition(),foot);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::playDigSound(content_t c)
|
void Client::playDigSound(content_t c)
|
||||||
{
|
{
|
||||||
if (!g_sound)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (c == CONTENT_IGNORE) {
|
if (c == CONTENT_IGNORE) {
|
||||||
c = getPointedContent();
|
c = getPointedContent();
|
||||||
if ((c&CONTENT_MOB_MASK) != 0)
|
if ((c&CONTENT_MOB_MASK) != 0)
|
||||||
|
@ -2313,41 +2300,37 @@ void Client::playDigSound(content_t c)
|
||||||
if (c == CONTENT_IGNORE)
|
if (c == CONTENT_IGNORE)
|
||||||
c = CONTENT_AIR;
|
c = CONTENT_AIR;
|
||||||
|
|
||||||
sound_playDig(c,m_env.getLocalPlayer()->getPosition());
|
//sound_playDig(c,m_env.getLocalPlayer()->getPosition());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::playPlaceSound(content_t c)
|
void Client::playPlaceSound(content_t c)
|
||||||
{
|
{
|
||||||
if (!m_sound)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (c == CONTENT_IGNORE)
|
if (c == CONTENT_IGNORE)
|
||||||
c = getPointedContent();
|
c = getPointedContent();
|
||||||
|
|
||||||
ContentFeatures *f = &content_features(c);
|
ContentFeatures *f = &content_features(c);
|
||||||
if (f->sound_place != "") {
|
if (f->sound_place != "") {
|
||||||
m_sound->playSound(f->sound_place,false);
|
sound_play_effect((char*)f->sound_place.c_str(),1.0,NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
switch (f->type) {
|
switch (f->type) {
|
||||||
case CMT_LIQUID:
|
case CMT_LIQUID:
|
||||||
m_sound->playSound("liquid-place",false);
|
sound_play_effect("liquid-place",1.0,NULL);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
m_sound->playSound("place",false);
|
sound_play_effect("place",1.0,NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::playSound(std::string &name, bool loop)
|
void Client::playSound(std::string &name, bool loop)
|
||||||
{
|
{
|
||||||
if (!m_sound)
|
/* TODO: looping */
|
||||||
return;
|
sound_play_effect((char*)name.c_str(),1.0,NULL);
|
||||||
m_sound->playSound(name,loop);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::playSoundAt(std::string &name, v3f pos, bool loop)
|
void Client::playSoundAt(std::string &name, v3f pos, bool loop)
|
||||||
{
|
{
|
||||||
if (!m_sound)
|
v3_t p = {pos.X,pos.Y,pos.Z};
|
||||||
return;
|
/* TODO: looping */
|
||||||
m_sound->playSoundAt(name,loop,pos);
|
sound_play_effect((char*)name.c_str(),1.0,&p);
|
||||||
}
|
}
|
||||||
|
|
|
@ -170,8 +170,7 @@ public:
|
||||||
Client(
|
Client(
|
||||||
IrrlichtDevice *device,
|
IrrlichtDevice *device,
|
||||||
std::string password,
|
std::string password,
|
||||||
MapDrawControl &control,
|
MapDrawControl &control
|
||||||
ISoundManager *sound
|
|
||||||
);
|
);
|
||||||
|
|
||||||
~Client();
|
~Client();
|
||||||
|
@ -323,7 +322,6 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
float getRTT(void);
|
float getRTT(void);
|
||||||
virtual ISoundManager* getSoundManager();
|
|
||||||
|
|
||||||
void playStepSound(int foot);
|
void playStepSound(int foot);
|
||||||
void playDigSound(content_t c);
|
void playDigSound(content_t c);
|
||||||
|
@ -385,7 +383,6 @@ private:
|
||||||
bool m_server_hunger;
|
bool m_server_hunger;
|
||||||
|
|
||||||
con::Connection m_con;
|
con::Connection m_con;
|
||||||
ISoundManager *m_sound;
|
|
||||||
|
|
||||||
IrrlichtDevice *m_device;
|
IrrlichtDevice *m_device;
|
||||||
|
|
||||||
|
|
|
@ -95,7 +95,7 @@ void config_set_float(char* name, float value);
|
||||||
void config_set_default(char* name, char* value, int (*setter)(char* v));
|
void config_set_default(char* name, char* value, int (*setter)(char* v));
|
||||||
void config_set_default_int(char* name, int value, int (*setter)(char* v));
|
void config_set_default_int(char* name, int value, int (*setter)(char* v));
|
||||||
void config_set_default_float(char* name, float value, int (*setter)(char* v));
|
void config_set_default_float(char* name, float value, int (*setter)(char* v));
|
||||||
void config_load(char* file);
|
void config_load(char* type, char* file);
|
||||||
int config_load_command(command_context_t *ctx, array_t *args);
|
int config_load_command(command_context_t *ctx, array_t *args);
|
||||||
int config_ignore_command(command_context_t *ctx, array_t *args);
|
int config_ignore_command(command_context_t *ctx, array_t *args);
|
||||||
void config_init(int argc, char** argv);
|
void config_init(int argc, char** argv);
|
||||||
|
|
12
src/config.c
12
src/config.c
|
@ -241,14 +241,18 @@ void config_set_default_float(char* name, float value, int (*setter)(char* v))
|
||||||
}
|
}
|
||||||
|
|
||||||
/* load a config file */
|
/* load a config file */
|
||||||
void config_load(char* file)
|
void config_load(char* type, char* file)
|
||||||
{
|
{
|
||||||
char buff[2048];
|
char buff[2048];
|
||||||
int s;
|
int s;
|
||||||
char* l;
|
char* l;
|
||||||
|
file_t *f;
|
||||||
command_context_t ctx;
|
command_context_t ctx;
|
||||||
|
|
||||||
file_t *f = file_load("config",file);
|
if (!type)
|
||||||
|
type = "config";
|
||||||
|
|
||||||
|
f = file_load(type,file);
|
||||||
if (!f)
|
if (!f)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -284,7 +288,7 @@ int config_load_command(command_context_t *ctx, array_t *args)
|
||||||
|
|
||||||
f = array_get_string(args,0);
|
f = array_get_string(args,0);
|
||||||
nvp_set(&config.files,f,"true",NULL);
|
nvp_set(&config.files,f,"true",NULL);
|
||||||
config_load(f);
|
config_load("config",f);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -332,7 +336,7 @@ void config_init(int argc, char** argv)
|
||||||
n = config.files;
|
n = config.files;
|
||||||
while (n) {
|
while (n) {
|
||||||
if (n->value && !strcmp(n->value,"true"))
|
if (n->value && !strcmp(n->value,"true"))
|
||||||
config_load(n->name);
|
config_load("config",n->name);
|
||||||
n = n->next;
|
n = n->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,9 @@
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
|
#ifndef SERVER
|
||||||
|
#include "sound.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
@ -53,7 +56,9 @@ void config_default_init()
|
||||||
config_set_default("client.video.driver","opengl",NULL);
|
config_set_default("client.video.driver","opengl",NULL);
|
||||||
config_set_default("client.video.hpfpu","true",NULL);
|
config_set_default("client.video.hpfpu","true",NULL);
|
||||||
|
|
||||||
config_set_default("client.sound.volume","50",NULL);
|
config_set_default("client.sound.volume","50",sound_master_setter);
|
||||||
|
config_set_default("client.sound.volume.effects","50",sound_effects_setter);
|
||||||
|
config_set_default("client.sound.volume.music","50",sound_music_setter);
|
||||||
|
|
||||||
config_set_default("client.graphics.mesh.lod","3",NULL);
|
config_set_default("client.graphics.mesh.lod","3",NULL);
|
||||||
config_set_default("client.graphics.texture.animations","true",NULL);
|
config_set_default("client.graphics.texture.animations","true",NULL);
|
||||||
|
|
|
@ -272,7 +272,7 @@ void MobCAO::step(float dtime, ClientEnvironment *env)
|
||||||
/* roughly sort of when a step sound should probably be heard, maybe */
|
/* roughly sort of when a step sound should probably be heard, maybe */
|
||||||
if (m_last_step > 0.5) {
|
if (m_last_step > 0.5) {
|
||||||
m_last_step -= 0.5;
|
m_last_step -= 0.5;
|
||||||
sound_playStep(&env->getMap(),m_position,m_next_foot, 0.3);
|
//sound_playStep(&env->getMap(),m_position,m_next_foot, 0.3);
|
||||||
m_next_foot = !m_next_foot;
|
m_next_foot = !m_next_foot;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
|
|
||||||
|
|
29
src/game.cpp
29
src/game.cpp
|
@ -642,8 +642,7 @@ void the_game(
|
||||||
IrrlichtDevice *device,
|
IrrlichtDevice *device,
|
||||||
gui::IGUIFont* font,
|
gui::IGUIFont* font,
|
||||||
std::string password,
|
std::string password,
|
||||||
std::wstring &error_message,
|
std::wstring &error_message
|
||||||
ISoundManager *sound
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
video::IVideoDriver* driver = device->getVideoDriver();
|
video::IVideoDriver* driver = device->getVideoDriver();
|
||||||
|
@ -689,7 +688,7 @@ void the_game(
|
||||||
drawLoadingScreen(device,narrow_to_wide(gettext("Creating client...")));
|
drawLoadingScreen(device,narrow_to_wide(gettext("Creating client...")));
|
||||||
infostream<<"Creating client"<<std::endl;
|
infostream<<"Creating client"<<std::endl;
|
||||||
MapDrawControl draw_control;
|
MapDrawControl draw_control;
|
||||||
Client client(device, password, draw_control, sound);
|
Client client(device, password, draw_control);
|
||||||
|
|
||||||
bridge_register_client(&client);
|
bridge_register_client(&client);
|
||||||
|
|
||||||
|
@ -1482,12 +1481,6 @@ void the_game(
|
||||||
client.step(dtime);
|
client.step(dtime);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if USE_AUDIO == 1
|
|
||||||
{
|
|
||||||
sound->maintain(dtime);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
{
|
{
|
||||||
// Read client events
|
// Read client events
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -1499,7 +1492,8 @@ void the_game(
|
||||||
if (event.player_damage.amount >= 2) {
|
if (event.player_damage.amount >= 2) {
|
||||||
damage_flash_timer += 0.05 * event.player_damage.amount;
|
damage_flash_timer += 0.05 * event.player_damage.amount;
|
||||||
}
|
}
|
||||||
if (g_sound) {
|
#if USE_AUDIO == 1
|
||||||
|
{
|
||||||
char* v;
|
char* v;
|
||||||
std::string ch = std::string(PLAYER_DEFAULT_CHARDEF);
|
std::string ch = std::string(PLAYER_DEFAULT_CHARDEF);
|
||||||
v = config_get("client.character");
|
v = config_get("client.character");
|
||||||
|
@ -1509,8 +1503,9 @@ void the_game(
|
||||||
std::string gender = f.next(":");
|
std::string gender = f.next(":");
|
||||||
std::string snd("player-hurt-");
|
std::string snd("player-hurt-");
|
||||||
snd += gender;
|
snd += gender;
|
||||||
g_sound->playSound(snd,false);
|
sound_play_effect((char*)snd.c_str(),1.0,NULL);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}else if (event.type == CE_PLAYER_FORCE_MOVE) {
|
}else if (event.type == CE_PLAYER_FORCE_MOVE) {
|
||||||
camera_yaw = event.player_force_move.yaw;
|
camera_yaw = event.player_force_move.yaw;
|
||||||
camera_pitch = event.player_force_move.pitch;
|
camera_pitch = event.player_force_move.pitch;
|
||||||
|
@ -1541,16 +1536,18 @@ void the_game(
|
||||||
v3f player_position = player->getPosition();
|
v3f player_position = player->getPosition();
|
||||||
v3f camera_position = camera.getPosition();
|
v3f camera_position = camera.getPosition();
|
||||||
v3f camera_direction = camera.getDirection();
|
v3f camera_direction = camera.getDirection();
|
||||||
|
v3f camera_up = camera.getCameraNode()->getUpVector();
|
||||||
f32 camera_fov = camera.getFovMax();
|
f32 camera_fov = camera.getFovMax();
|
||||||
v3s16 camera_offset = camera.getOffset();
|
v3s16 camera_offset = camera.getOffset();
|
||||||
|
|
||||||
|
#if USE_AUDIO == 1
|
||||||
{
|
{
|
||||||
ISoundManager *snd = client.getSoundManager();
|
v3_t pos = {camera_position.X,camera_position.Y,camera_position.Z};
|
||||||
if (snd)
|
v3_t at = {camera_direction.X,camera_direction.Y,camera_direction.Z};
|
||||||
snd->updateListener(camera_position,v3f(0,0,0),camera_direction,camera.getCameraNode()->getUpVector());
|
v3_t up = {camera_up.X,camera_up.Y,camera_up.Z};
|
||||||
|
sound_step(dtime,&pos,&at,&up);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
//bool camera_offset_changed = (camera_offset != old_camera_offset);
|
|
||||||
|
|
||||||
if (!disable_camera_update) {
|
if (!disable_camera_update) {
|
||||||
client.updateCamera(camera_position, camera_direction, camera_fov, camera_offset);
|
client.updateCamera(camera_position, camera_direction, camera_fov, camera_offset);
|
||||||
|
|
|
@ -139,8 +139,7 @@ void the_game(
|
||||||
IrrlichtDevice *device,
|
IrrlichtDevice *device,
|
||||||
gui::IGUIFont* font,
|
gui::IGUIFont* font,
|
||||||
std::string password,
|
std::string password,
|
||||||
std::wstring &error_message,
|
std::wstring &error_message
|
||||||
ISoundManager *sound
|
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -52,15 +52,11 @@ GUIMainMenu::GUIMainMenu(gui::IGUIEnvironment* env,
|
||||||
gui::IGUIElement* parent, s32 id,
|
gui::IGUIElement* parent, s32 id,
|
||||||
IMenuManager *menumgr,
|
IMenuManager *menumgr,
|
||||||
MainMenuData *data,
|
MainMenuData *data,
|
||||||
IGameCallback *gamecallback,
|
IGameCallback *gamecallback
|
||||||
ISoundManager *sound
|
|
||||||
):
|
):
|
||||||
GUIModalMenu(env, parent, id, menumgr),
|
GUIModalMenu(env, parent, id, menumgr),
|
||||||
m_data(data),
|
m_data(data),
|
||||||
m_accepted(false),
|
m_accepted(false),
|
||||||
#if USE_SOUND == 1
|
|
||||||
m_sound(sound),
|
|
||||||
#endif
|
|
||||||
m_gamecallback(gamecallback)
|
m_gamecallback(gamecallback)
|
||||||
{
|
{
|
||||||
assert(m_data);
|
assert(m_data);
|
||||||
|
@ -223,7 +219,7 @@ void GUIMainMenu::regenerateGui(v2u32 screensize)
|
||||||
txt += "\ndarkrose, sdzen, Menche, tiemay, JHeaton, MavJS, mcnalu.\n\n";
|
txt += "\ndarkrose, sdzen, Menche, tiemay, JHeaton, MavJS, mcnalu.\n\n";
|
||||||
|
|
||||||
txt += gettext("Music and Sound Effects Composers");
|
txt += gettext("Music and Sound Effects Composers");
|
||||||
txt += "\ndarkrose, Jordach, AudioRichter, OwlStorm, DjDust, Taira Komori.\n\n";
|
txt += "\ndarkrose, Jordach, AudioRichter, Tom Peter, OwlStorm, DjDust, Taira Komori.\n\n";
|
||||||
|
|
||||||
txt += gettext("Other Contributers, and Special Thanks");
|
txt += gettext("Other Contributers, and Special Thanks");
|
||||||
txt += "\nnadnadnad, Honeypaw, tiemay, stormchaser3000, MichaelEh?, NCC74656.\n\n";
|
txt += "\nnadnadnad, Honeypaw, tiemay, stormchaser3000, MichaelEh?, NCC74656.\n\n";
|
||||||
|
@ -362,6 +358,7 @@ bool GUIMainMenu::OnEvent(const SEvent& event)
|
||||||
acceptInput();
|
acceptInput();
|
||||||
m_accepted = false;
|
m_accepted = false;
|
||||||
m_data->selected_tab = TAB_CREDITS;
|
m_data->selected_tab = TAB_CREDITS;
|
||||||
|
config_set("client.ui.mainmenu.tab","credits");
|
||||||
regenerateGui(m_screensize);
|
regenerateGui(m_screensize);
|
||||||
return true;
|
return true;
|
||||||
case GUI_ID_TAB_QUIT:
|
case GUI_ID_TAB_QUIT:
|
||||||
|
|
|
@ -118,8 +118,7 @@ public:
|
||||||
gui::IGUIElement* parent, s32 id,
|
gui::IGUIElement* parent, s32 id,
|
||||||
IMenuManager *menumgr,
|
IMenuManager *menumgr,
|
||||||
MainMenuData *data,
|
MainMenuData *data,
|
||||||
IGameCallback *gamecallback,
|
IGameCallback *gamecallback);
|
||||||
ISoundManager *sound);
|
|
||||||
~GUIMainMenu();
|
~GUIMainMenu();
|
||||||
|
|
||||||
void removeChildren();
|
void removeChildren();
|
||||||
|
@ -148,9 +147,6 @@ private:
|
||||||
MainMenuData *m_data;
|
MainMenuData *m_data;
|
||||||
bool m_accepted;
|
bool m_accepted;
|
||||||
IGameCallback *m_gamecallback;
|
IGameCallback *m_gamecallback;
|
||||||
#if USE_SOUND == 1
|
|
||||||
ISoundManager *m_sound;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
gui::IGUIEnvironment* env;
|
gui::IGUIEnvironment* env;
|
||||||
gui::IGUIElement* parent;
|
gui::IGUIElement* parent;
|
||||||
|
|
|
@ -66,7 +66,9 @@ GUISettingsMenu::GUISettingsMenu(
|
||||||
m_data.trilinear_filter = config_get_bool("client.video.trilinear");
|
m_data.trilinear_filter = config_get_bool("client.video.trilinear");
|
||||||
m_data.hotbar = config_get_bool("client.ui.hud.old");
|
m_data.hotbar = config_get_bool("client.ui.hud.old");
|
||||||
m_data.wield_index = config_get_bool("client.ui.hud.wieldindex");
|
m_data.wield_index = config_get_bool("client.ui.hud.wieldindex");
|
||||||
m_data.volume = config_get_float("client.sound.volume");
|
m_data.volume_master = config_get_float("client.sound.volume");
|
||||||
|
m_data.volume_effects = config_get_float("client.sound.volume.effects");
|
||||||
|
m_data.volume_music = config_get_float("client.sound.volume.music");
|
||||||
m_data.texture_animation = config_get_bool("client.graphics.texture.animations");
|
m_data.texture_animation = config_get_bool("client.graphics.texture.animations");
|
||||||
|
|
||||||
keynames[VLKC_FORWARD] = narrow_to_wide(gettext("Forward"));
|
keynames[VLKC_FORWARD] = narrow_to_wide(gettext("Forward"));
|
||||||
|
@ -135,7 +137,6 @@ void GUISettingsMenu::save()
|
||||||
config_set_int("client.video.trilinear",m_data.trilinear_filter);
|
config_set_int("client.video.trilinear",m_data.trilinear_filter);
|
||||||
config_set_int("client.ui.hud.old",m_data.hotbar);
|
config_set_int("client.ui.hud.old",m_data.hotbar);
|
||||||
config_set_int("client.ui.hud.wieldindex",m_data.wield_index);
|
config_set_int("client.ui.hud.wieldindex",m_data.wield_index);
|
||||||
config_set_float("client.sound.volume",m_data.volume);
|
|
||||||
config_set_int("client.graphics.texture.animations",m_data.texture_animation);
|
config_set_int("client.graphics.texture.animations",m_data.texture_animation);
|
||||||
Environment->getVideoDriver()->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, m_data.mip_map);
|
Environment->getVideoDriver()->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, m_data.mip_map);
|
||||||
}
|
}
|
||||||
|
@ -154,7 +155,9 @@ void GUISettingsMenu::regenerateGui(v2u32 screensize)
|
||||||
bool hotbar;
|
bool hotbar;
|
||||||
bool wield_index;
|
bool wield_index;
|
||||||
bool texture_animation;
|
bool texture_animation;
|
||||||
f32 volume;
|
f32 volume_master;
|
||||||
|
f32 volume_effects;
|
||||||
|
f32 volume_music;
|
||||||
|
|
||||||
m_screensize = screensize;
|
m_screensize = screensize;
|
||||||
|
|
||||||
|
@ -285,11 +288,25 @@ void GUISettingsMenu::regenerateGui(v2u32 screensize)
|
||||||
wield_index = m_data.wield_index;
|
wield_index = m_data.wield_index;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
gui::IGUIElement *e = getElementFromId(GUI_ID_VOLUME_SB);
|
gui::IGUIElement *e = getElementFromId(GUI_ID_VOLUME_MASTER_SB);
|
||||||
if(e != NULL && e->getType() == gui::EGUIET_SCROLL_BAR)
|
if(e != NULL && e->getType() == gui::EGUIET_SCROLL_BAR)
|
||||||
volume = (float)((gui::IGUIScrollBar*)e)->getPos();
|
volume_master = (float)((gui::IGUIScrollBar*)e)->getPos();
|
||||||
else
|
else
|
||||||
volume = m_data.volume;
|
volume_master = m_data.volume_master;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
gui::IGUIElement *e = getElementFromId(GUI_ID_VOLUME_EFFECTS_SB);
|
||||||
|
if(e != NULL && e->getType() == gui::EGUIET_SCROLL_BAR)
|
||||||
|
volume_effects = (float)((gui::IGUIScrollBar*)e)->getPos();
|
||||||
|
else
|
||||||
|
volume_effects = m_data.volume_effects;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
gui::IGUIElement *e = getElementFromId(GUI_ID_VOLUME_MUSIC_SB);
|
||||||
|
if(e != NULL && e->getType() == gui::EGUIET_SCROLL_BAR)
|
||||||
|
volume_music = (float)((gui::IGUIScrollBar*)e)->getPos();
|
||||||
|
else
|
||||||
|
volume_music = m_data.volume_music;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
Remove stuff
|
Remove stuff
|
||||||
|
@ -534,15 +551,41 @@ void GUISettingsMenu::regenerateGui(v2u32 screensize)
|
||||||
{
|
{
|
||||||
core::rect<s32> rect(0, 0, 200, 15);
|
core::rect<s32> rect(0, 0, 200, 15);
|
||||||
rect += topleft_content + v2s32(80, 60);
|
rect += topleft_content + v2s32(80, 60);
|
||||||
Environment->addStaticText(narrow_to_wide(gettext("Volume:")).c_str(), rect, false, false, this, -1);
|
Environment->addStaticText(narrow_to_wide(gettext("Master Volume:")).c_str(), rect, false, false, this, -1);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
core::rect<s32> rect(0, 0, 200, 15);
|
core::rect<s32> rect(0, 0, 200, 15);
|
||||||
rect += topleft_content + v2s32(290, 60);
|
rect += topleft_content + v2s32(290, 60);
|
||||||
gui::IGUIScrollBar *sb = Environment->addScrollBar(true, rect, this, GUI_ID_VOLUME_SB);
|
gui::IGUIScrollBar *sb = Environment->addScrollBar(true, rect, this, GUI_ID_VOLUME_MASTER_SB);
|
||||||
sb->setMin(0);
|
sb->setMin(0);
|
||||||
sb->setMax(100);
|
sb->setMax(100);
|
||||||
sb->setPos(volume);
|
sb->setPos(volume_master);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
core::rect<s32> rect(0, 0, 200, 15);
|
||||||
|
rect += topleft_content + v2s32(80, 90);
|
||||||
|
Environment->addStaticText(narrow_to_wide(gettext("Effects Volume:")).c_str(), rect, false, false, this, -1);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
core::rect<s32> rect(0, 0, 200, 15);
|
||||||
|
rect += topleft_content + v2s32(290, 90);
|
||||||
|
gui::IGUIScrollBar *sb = Environment->addScrollBar(true, rect, this, GUI_ID_VOLUME_EFFECTS_SB);
|
||||||
|
sb->setMin(0);
|
||||||
|
sb->setMax(100);
|
||||||
|
sb->setPos(volume_effects);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
core::rect<s32> rect(0, 0, 200, 15);
|
||||||
|
rect += topleft_content + v2s32(80, 120);
|
||||||
|
Environment->addStaticText(narrow_to_wide(gettext("Music Volume:")).c_str(), rect, false, false, this, -1);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
core::rect<s32> rect(0, 0, 200, 15);
|
||||||
|
rect += topleft_content + v2s32(290, 120);
|
||||||
|
gui::IGUIScrollBar *sb = Environment->addScrollBar(true, rect, this, GUI_ID_VOLUME_MUSIC_SB);
|
||||||
|
sb->setMin(0);
|
||||||
|
sb->setMax(100);
|
||||||
|
sb->setPos(volume_music);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -693,9 +736,19 @@ bool GUISettingsMenu::acceptInput()
|
||||||
m_data.wield_index = ((gui::IGUICheckBox*)e)->isChecked();
|
m_data.wield_index = ((gui::IGUICheckBox*)e)->isChecked();
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
gui::IGUIElement *e = getElementFromId(GUI_ID_VOLUME_SB);
|
gui::IGUIElement *e = getElementFromId(GUI_ID_VOLUME_MASTER_SB);
|
||||||
if(e != NULL && e->getType() == gui::EGUIET_SCROLL_BAR)
|
if(e != NULL && e->getType() == gui::EGUIET_SCROLL_BAR)
|
||||||
m_data.volume = (float)((gui::IGUIScrollBar*)e)->getPos();
|
m_data.volume_master = (float)((gui::IGUIScrollBar*)e)->getPos();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
gui::IGUIElement *e = getElementFromId(GUI_ID_VOLUME_EFFECTS_SB);
|
||||||
|
if(e != NULL && e->getType() == gui::EGUIET_SCROLL_BAR)
|
||||||
|
m_data.volume_effects = (float)((gui::IGUIScrollBar*)e)->getPos();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
gui::IGUIElement *e = getElementFromId(GUI_ID_VOLUME_MUSIC_SB);
|
||||||
|
if(e != NULL && e->getType() == gui::EGUIET_SCROLL_BAR)
|
||||||
|
m_data.volume_music = (float)((gui::IGUIScrollBar*)e)->getPos();
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -794,15 +847,34 @@ bool GUISettingsMenu::OnEvent(const SEvent& event)
|
||||||
}
|
}
|
||||||
if (event.GUIEvent.EventType == gui::EGET_SCROLL_BAR_CHANGED) {
|
if (event.GUIEvent.EventType == gui::EGET_SCROLL_BAR_CHANGED) {
|
||||||
switch (event.GUIEvent.Caller->getID()) {
|
switch (event.GUIEvent.Caller->getID()) {
|
||||||
case GUI_ID_VOLUME_SB:
|
case GUI_ID_VOLUME_MASTER_SB:
|
||||||
gui::IGUIElement *vsb = getElementFromId(GUI_ID_VOLUME_SB);
|
{
|
||||||
|
gui::IGUIElement *vsb = getElementFromId(GUI_ID_VOLUME_MASTER_SB);
|
||||||
if(vsb != NULL && vsb->getType() == gui::EGUIET_SCROLL_BAR) {
|
if(vsb != NULL && vsb->getType() == gui::EGUIET_SCROLL_BAR) {
|
||||||
m_data.volume = (float)((gui::IGUIScrollBar*)vsb)->getPos();
|
m_data.volume_master = (float)((gui::IGUIScrollBar*)vsb)->getPos();
|
||||||
if (g_sound)
|
config_set_int("client.sound.volume",m_data.volume_master);
|
||||||
g_sound->setListenerGain(m_data.volume/100.0);
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
case GUI_ID_VOLUME_EFFECTS_SB:
|
||||||
|
{
|
||||||
|
gui::IGUIElement *vsb = getElementFromId(GUI_ID_VOLUME_EFFECTS_SB);
|
||||||
|
if(vsb != NULL && vsb->getType() == gui::EGUIET_SCROLL_BAR) {
|
||||||
|
m_data.volume_effects = (float)((gui::IGUIScrollBar*)vsb)->getPos();
|
||||||
|
config_set_int("client.sound.volume.effects",m_data.volume_effects);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
case GUI_ID_VOLUME_MUSIC_SB:
|
||||||
|
{
|
||||||
|
gui::IGUIElement *vsb = getElementFromId(GUI_ID_VOLUME_MUSIC_SB);
|
||||||
|
if(vsb != NULL && vsb->getType() == gui::EGUIET_SCROLL_BAR) {
|
||||||
|
m_data.volume_music = (float)((gui::IGUIScrollBar*)vsb)->getPos();
|
||||||
|
config_set_int("client.sound.volume.music",m_data.volume_music);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (event.GUIEvent.EventType == gui::EGET_COMBO_BOX_CHANGED) {
|
if (event.GUIEvent.EventType == gui::EGET_COMBO_BOX_CHANGED) {
|
||||||
switch (event.GUIEvent.Caller->getID()) {
|
switch (event.GUIEvent.Caller->getID()) {
|
||||||
|
|
|
@ -64,7 +64,9 @@ enum
|
||||||
GUI_ID_PARTICLES_CB,
|
GUI_ID_PARTICLES_CB,
|
||||||
GUI_ID_FULLSCREEN_CB,
|
GUI_ID_FULLSCREEN_CB,
|
||||||
// sound
|
// sound
|
||||||
GUI_ID_VOLUME_SB,
|
GUI_ID_VOLUME_MASTER_SB,
|
||||||
|
GUI_ID_VOLUME_EFFECTS_SB,
|
||||||
|
GUI_ID_VOLUME_MUSIC_SB,
|
||||||
// tabs
|
// tabs
|
||||||
GUI_ID_TAB_MAINMENU,
|
GUI_ID_TAB_MAINMENU,
|
||||||
GUI_ID_TAB_SETTINGS_CONTROLS,
|
GUI_ID_TAB_SETTINGS_CONTROLS,
|
||||||
|
@ -93,7 +95,9 @@ struct SettingsMenuData
|
||||||
light_detail(3),
|
light_detail(3),
|
||||||
hotbar(false),
|
hotbar(false),
|
||||||
wield_index(false),
|
wield_index(false),
|
||||||
volume(0.0f),
|
volume_master(0.0f),
|
||||||
|
volume_effects(0.0f),
|
||||||
|
volume_music(0.0f),
|
||||||
particles(true),
|
particles(true),
|
||||||
fullscreen(false),
|
fullscreen(false),
|
||||||
texture_animation(true)
|
texture_animation(true)
|
||||||
|
@ -113,7 +117,9 @@ struct SettingsMenuData
|
||||||
bool trilinear_filter;
|
bool trilinear_filter;
|
||||||
bool hotbar;
|
bool hotbar;
|
||||||
bool wield_index;
|
bool wield_index;
|
||||||
f32 volume;
|
f32 volume_master;
|
||||||
|
f32 volume_effects;
|
||||||
|
f32 volume_music;
|
||||||
//int enable_shaders;
|
//int enable_shaders;
|
||||||
bool particles;
|
bool particles;
|
||||||
bool fullscreen;
|
bool fullscreen;
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
#include "crypto.h"
|
#include "crypto.h"
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ char* ngettext(const char* s1, const char* s2, int n);
|
||||||
void intl_init();
|
void intl_init();
|
||||||
|
|
||||||
#ifndef SERVER
|
#ifndef SERVER
|
||||||
// Initialise KeyNamesLang array
|
/* Initialise KeyNamesLang array */
|
||||||
void init_KeyNamesLang();
|
void init_KeyNamesLang();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
32
src/main.cpp
32
src/main.cpp
|
@ -79,6 +79,7 @@
|
||||||
#if USE_FREETYPE
|
#if USE_FREETYPE
|
||||||
#include "xCGUITTFont.h"
|
#include "xCGUITTFont.h"
|
||||||
#endif
|
#endif
|
||||||
|
#include "sound.h"
|
||||||
|
|
||||||
// This makes textures
|
// This makes textures
|
||||||
ITextureSource *g_texturesource = NULL;
|
ITextureSource *g_texturesource = NULL;
|
||||||
|
@ -826,8 +827,6 @@ int main(int argc, char *argv[])
|
||||||
// (for texture atlas making)
|
// (for texture atlas making)
|
||||||
init_mineral();
|
init_mineral();
|
||||||
|
|
||||||
ISoundManager *sound = NULL;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Game parameters
|
Game parameters
|
||||||
*/
|
*/
|
||||||
|
@ -849,6 +848,8 @@ int main(int argc, char *argv[])
|
||||||
// Run server
|
// Run server
|
||||||
dedicated_server_loop(server, kill);
|
dedicated_server_loop(server, kill);
|
||||||
|
|
||||||
|
config_save(NULL,NULL,NULL);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -862,8 +863,6 @@ int main(int argc, char *argv[])
|
||||||
u16 screenW = config_get_int("client.video.size.width");
|
u16 screenW = config_get_int("client.video.size.width");
|
||||||
u16 screenH = config_get_int("client.video.size.height");
|
u16 screenH = config_get_int("client.video.size.height");
|
||||||
|
|
||||||
vlprintf(CN_INFO,"size %dx%d",screenW,screenH);
|
|
||||||
|
|
||||||
// bpp, fsaa, vsync
|
// bpp, fsaa, vsync
|
||||||
|
|
||||||
bool vsync = config_get_bool("client.video.vsync");
|
bool vsync = config_get_bool("client.video.vsync");
|
||||||
|
@ -989,7 +988,7 @@ int main(int argc, char *argv[])
|
||||||
drawLoadingScreen(device,narrow_to_wide(gettext("Setting Up Sound")));
|
drawLoadingScreen(device,narrow_to_wide(gettext("Setting Up Sound")));
|
||||||
|
|
||||||
#if USE_AUDIO == 1
|
#if USE_AUDIO == 1
|
||||||
sound = createSoundManager();
|
sound_init();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1084,8 +1083,7 @@ int main(int argc, char *argv[])
|
||||||
-1,
|
-1,
|
||||||
&g_menumgr,
|
&g_menumgr,
|
||||||
&menudata,
|
&menudata,
|
||||||
g_gamecallback,
|
g_gamecallback
|
||||||
sound
|
|
||||||
);
|
);
|
||||||
menu->allowFocusRemoval(true);
|
menu->allowFocusRemoval(true);
|
||||||
|
|
||||||
|
@ -1105,7 +1103,7 @@ int main(int argc, char *argv[])
|
||||||
infostream<<"Created main menu"<<std::endl;
|
infostream<<"Created main menu"<<std::endl;
|
||||||
|
|
||||||
#if USE_AUDIO == 1
|
#if USE_AUDIO == 1
|
||||||
sound->playMusic("bg-mainmenu",true);
|
sound_play_music("bg-mainmenu",1.0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while (device->run() && kill == false) {
|
while (device->run() && kill == false) {
|
||||||
|
@ -1126,7 +1124,7 @@ int main(int argc, char *argv[])
|
||||||
driver->endScene();
|
driver->endScene();
|
||||||
|
|
||||||
#if USE_AUDIO == 1
|
#if USE_AUDIO == 1
|
||||||
sound->maintain(0.02);
|
sound_step(0.02,NULL,NULL,NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// On some computers framerate doesn't seem to be
|
// On some computers framerate doesn't seem to be
|
||||||
|
@ -1135,7 +1133,7 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
#if USE_AUDIO == 1
|
#if USE_AUDIO == 1
|
||||||
sound->stopMusic();
|
sound_stop_music(1.0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Break out of menu-game loop to shut down cleanly
|
// Break out of menu-game loop to shut down cleanly
|
||||||
|
@ -1210,7 +1208,7 @@ int main(int argc, char *argv[])
|
||||||
menu->allowFocusRemoval(true);
|
menu->allowFocusRemoval(true);
|
||||||
|
|
||||||
#if USE_AUDIO == 1
|
#if USE_AUDIO == 1
|
||||||
sound->playMusic("bg-charcreator",true);
|
sound_play_music("bg-charcreator",1.0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while (device->run() && kill == false) {
|
while (device->run() && kill == false) {
|
||||||
|
@ -1225,7 +1223,7 @@ int main(int argc, char *argv[])
|
||||||
driver->endScene();
|
driver->endScene();
|
||||||
|
|
||||||
#if USE_AUDIO == 1
|
#if USE_AUDIO == 1
|
||||||
sound->maintain(0.02);
|
sound_step(0.02,NULL,NULL,NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// On some computers framerate doesn't seem to be
|
// On some computers framerate doesn't seem to be
|
||||||
|
@ -1234,7 +1232,7 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
#if USE_AUDIO == 1
|
#if USE_AUDIO == 1
|
||||||
sound->stopMusic();
|
sound_stop_music(1.0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
menu->drop();
|
menu->drop();
|
||||||
|
@ -1253,8 +1251,7 @@ int main(int argc, char *argv[])
|
||||||
device,
|
device,
|
||||||
font,
|
font,
|
||||||
password,
|
password,
|
||||||
error_message,
|
error_message
|
||||||
sound
|
|
||||||
);
|
);
|
||||||
|
|
||||||
} //try
|
} //try
|
||||||
|
@ -1285,8 +1282,9 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
delete input;
|
delete input;
|
||||||
|
|
||||||
if (sound != NULL)
|
#if USE_AUDIO == 1
|
||||||
delete sound;
|
sound_exit();
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
In the end, delete the Irrlicht device.
|
In the end, delete the Irrlicht device.
|
||||||
|
|
|
@ -1693,6 +1693,8 @@ ServerMap::ServerMap():
|
||||||
char b[1024];
|
char b[1024];
|
||||||
infostream<<__FUNCTION_NAME<<std::endl;
|
infostream<<__FUNCTION_NAME<<std::endl;
|
||||||
|
|
||||||
|
config_load("world","world.cfg");
|
||||||
|
|
||||||
loadMapMeta();
|
loadMapMeta();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -74,11 +74,11 @@ MapBlock::~MapBlock()
|
||||||
delete mesh;
|
delete mesh;
|
||||||
mesh = NULL;
|
mesh = NULL;
|
||||||
}
|
}
|
||||||
if (g_sound) {
|
#if USE_AUDIO == 1
|
||||||
for (std::map<v3s16,MapBlockSound>::iterator i = m_sounds.begin(); i != m_sounds.end(); i++) {
|
for (std::map<v3s16,MapBlockSound>::iterator i = m_sounds.begin(); i != m_sounds.end(); i++) {
|
||||||
g_sound->stopSound(i->second.id);
|
sound_stop_single(i->second.id);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -528,7 +528,9 @@ void MapBlockMesh::generate(MeshMakeData *data, v3s16 camera_offset, JMutex *mut
|
||||||
|
|
||||||
MapNode n = data->m_vmanip.getNodeNoEx(data->m_blockpos_nodes+p);
|
MapNode n = data->m_vmanip.getNodeNoEx(data->m_blockpos_nodes+p);
|
||||||
|
|
||||||
if (g_sound) {
|
|
||||||
|
#if USE_AUDIO == 1
|
||||||
|
{
|
||||||
std::string snd = content_features(n).sound_ambient;
|
std::string snd = content_features(n).sound_ambient;
|
||||||
std::map<v3s16,MapBlockSound>::iterator i = data->m_sounds->find(p);
|
std::map<v3s16,MapBlockSound>::iterator i = data->m_sounds->find(p);
|
||||||
if (snd != "") {
|
if (snd != "") {
|
||||||
|
@ -576,6 +578,7 @@ void MapBlockMesh::generate(MeshMakeData *data, v3s16 camera_offset, JMutex *mut
|
||||||
data->m_sounds->erase(i);
|
data->m_sounds->erase(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (data->light_detail > 1 && !selected.is_coloured)
|
if (data->light_detail > 1 && !selected.is_coloured)
|
||||||
meshgen_preset_smooth_lights(data,p);
|
meshgen_preset_smooth_lights(data,p);
|
||||||
switch (content_features(n).draw_type) {
|
switch (content_features(n).draw_type) {
|
||||||
|
|
|
@ -760,12 +760,12 @@ void RemotePlayer::move(f32 dtime, Map &map, f32 pos_max_d)
|
||||||
int frame = m_node->getFrameNr();
|
int frame = m_node->getFrameNr();
|
||||||
/* roughly sort of when a step sound should probably be heard, maybe */
|
/* roughly sort of when a step sound should probably be heard, maybe */
|
||||||
if (frame == 218 || frame == 186 || frame == 209 || frame == 177) {
|
if (frame == 218 || frame == 186 || frame == 209 || frame == 177) {
|
||||||
sound_playStep(&map,m_showpos,m_next_foot);
|
//sound_playStep(&map,m_showpos,m_next_foot);
|
||||||
m_next_foot = !m_next_foot;
|
m_next_foot = !m_next_foot;
|
||||||
}
|
}
|
||||||
/* roughly sort of when a dig sound should probably be heard, maybe */
|
/* roughly sort of when a dig sound should probably be heard, maybe */
|
||||||
if (frame == 214 || frame == 205 || frame == 193) {
|
if (frame == 214 || frame == 205 || frame == 193) {
|
||||||
sound_playDig(m_pointed,m_showpos);
|
//sound_playDig(m_pointed,m_showpos);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_anim_id == PLAYERANIM_DIE) {
|
if (m_anim_id == PLAYERANIM_DIE) {
|
||||||
|
@ -1224,7 +1224,8 @@ void LocalPlayer::applyControl(float dtime)
|
||||||
}else if (m_energy < -0.1) {
|
}else if (m_energy < -0.1) {
|
||||||
m_can_use_energy = false;
|
m_can_use_energy = false;
|
||||||
m_energy = -0.1;
|
m_energy = -0.1;
|
||||||
if (g_sound && m_low_energy_effect == 0) {
|
#if USE_AUDIO == 1
|
||||||
|
if (m_low_energy_effect == 0) {
|
||||||
if (m_character == "")
|
if (m_character == "")
|
||||||
m_character = std::string(PLAYER_DEFAULT_CHARDEF);
|
m_character = std::string(PLAYER_DEFAULT_CHARDEF);
|
||||||
Strfnd f(m_character);
|
Strfnd f(m_character);
|
||||||
|
@ -1232,14 +1233,18 @@ void LocalPlayer::applyControl(float dtime)
|
||||||
std::string snd("low-energy-");
|
std::string snd("low-energy-");
|
||||||
snd += gender;
|
snd += gender;
|
||||||
|
|
||||||
m_low_energy_effect = g_sound->playSound(snd,true);
|
/* TODO: looping */
|
||||||
|
m_low_energy_effect = sound_play_effect(snd.c_str(),1.0,NULL);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}else if (m_energy > 9.8) {
|
}else if (m_energy > 9.8) {
|
||||||
m_can_use_energy = true;
|
m_can_use_energy = true;
|
||||||
if (g_sound && m_low_energy_effect) {
|
#if USE_AUDIO == 1
|
||||||
g_sound->stopSound(m_low_energy_effect);
|
if (m_low_energy_effect) {
|
||||||
|
sound_stop_single(m_low_energy_effect);
|
||||||
m_low_energy_effect = 0;
|
m_low_energy_effect = 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (energy_effectf > 0.0)
|
if (energy_effectf > 0.0)
|
||||||
|
|
|
@ -48,7 +48,6 @@
|
||||||
#include "profiler.h"
|
#include "profiler.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "base64.h"
|
#include "base64.h"
|
||||||
#include "sound.h"
|
|
||||||
#include "http.h"
|
#include "http.h"
|
||||||
#include "enchantment.h"
|
#include "enchantment.h"
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
|
@ -6038,11 +6037,6 @@ uint64_t Server::getPlayerPrivs(Player *player)
|
||||||
return getPlayerAuthPrivs(playername);
|
return getPlayerAuthPrivs(playername);
|
||||||
}
|
}
|
||||||
|
|
||||||
ISoundManager* Server::getSoundManager()
|
|
||||||
{
|
|
||||||
return &dummySoundManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
void dedicated_server_loop(Server &server, bool &kill)
|
void dedicated_server_loop(Server &server, bool &kill)
|
||||||
{
|
{
|
||||||
DSTACK(__FUNCTION_NAME);
|
DSTACK(__FUNCTION_NAME);
|
||||||
|
|
|
@ -36,7 +36,6 @@
|
||||||
#include "inventory.h"
|
#include "inventory.h"
|
||||||
#include "auth.h"
|
#include "auth.h"
|
||||||
#include "ban.h"
|
#include "ban.h"
|
||||||
#include "sound.h"
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Some random functions
|
Some random functions
|
||||||
|
@ -465,7 +464,6 @@ public:
|
||||||
// Envlock and conlock should be locked when calling this
|
// Envlock and conlock should be locked when calling this
|
||||||
void notifyPlayer(const char *name, const std::wstring msg);
|
void notifyPlayer(const char *name, const std::wstring msg);
|
||||||
void notifyPlayers(const std::wstring msg);
|
void notifyPlayers(const std::wstring msg);
|
||||||
virtual ISoundManager* getSoundManager();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,647 @@
|
||||||
|
/************************************************************************
|
||||||
|
* sound.c
|
||||||
|
* voxelands - 3d voxel world sandbox game
|
||||||
|
* Copyright (C) Lisa 'darkrose' Milne 2017 <lisa@ltmnet.com>
|
||||||
|
*
|
||||||
|
* 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/>
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "list.h"
|
||||||
|
#include "file.h"
|
||||||
|
#define _VL_SOUND_EXPOSE_INTERNAL
|
||||||
|
#include "sound.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
int init;
|
||||||
|
float volume;
|
||||||
|
struct {
|
||||||
|
float volume;
|
||||||
|
float fade;
|
||||||
|
float fadev;
|
||||||
|
sound_t *sounds;
|
||||||
|
sound_instance_t *playing;
|
||||||
|
} effects;
|
||||||
|
struct {
|
||||||
|
float volume;
|
||||||
|
sound_t *sounds;
|
||||||
|
sound_instance_t *playing;
|
||||||
|
} music;
|
||||||
|
ALCdevice *device;
|
||||||
|
ALCcontext *context;
|
||||||
|
} sound_data = {
|
||||||
|
0,
|
||||||
|
0.5,
|
||||||
|
{
|
||||||
|
0.5,
|
||||||
|
-1.0,
|
||||||
|
1.0,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
},
|
||||||
|
{
|
||||||
|
0.5,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
},
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
/* initialise sound */
|
||||||
|
int sound_init()
|
||||||
|
{
|
||||||
|
/* initialise audio */
|
||||||
|
sound_data.device = alcOpenDevice(NULL);
|
||||||
|
if (!sound_data.device)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
sound_data.context = alcCreateContext(sound_data.device, NULL);
|
||||||
|
|
||||||
|
if (!sound_data.context) {
|
||||||
|
alcCloseDevice(sound_data.device);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!alcMakeContextCurrent(sound_data.context) || (alcGetError(sound_data.device) != ALC_NO_ERROR)) {
|
||||||
|
alcDestroyContext(sound_data.context);
|
||||||
|
alcCloseDevice(sound_data.device);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
alDistanceModel(AL_EXPONENT_DISTANCE);
|
||||||
|
alListenerf(AL_GAIN, 1.0);
|
||||||
|
|
||||||
|
sound_data.init = 1;
|
||||||
|
|
||||||
|
/* sounds must be mono sounds, stereo will not work right!
|
||||||
|
* exceptions: background music */
|
||||||
|
|
||||||
|
/* walking */
|
||||||
|
/* CMT_DIRT */
|
||||||
|
sound_load_effect("step_dirt.1.ogg","dirt-step-left");
|
||||||
|
sound_load_effect("step_dirt.2.ogg","dirt-step-right");
|
||||||
|
/* CMT_STONE */
|
||||||
|
sound_load_effect("step_stone.1.ogg","stone-step-left");
|
||||||
|
sound_load_effect("step_stone.2.ogg","stone-step-right");
|
||||||
|
sound_load_effect("step_stone.3.ogg","stone-step-left");
|
||||||
|
sound_load_effect("step_stone.4.ogg","stone-step-right");
|
||||||
|
/* CMT_PLANT */
|
||||||
|
sound_load_effect("step_plant.1.ogg","plant-step-left");
|
||||||
|
sound_load_effect("step_plant.2.ogg","plant-step-right");
|
||||||
|
/* CMT_LIQUID */
|
||||||
|
sound_load_effect("step_liquid.1.ogg","liquid-step-left");
|
||||||
|
sound_load_effect("step_liquid.2.ogg","liquid-step-right");
|
||||||
|
/* CMT_WOOD */
|
||||||
|
sound_load_effect("step_wood.1.ogg","wood-step-left");
|
||||||
|
sound_load_effect("step_wood.2.ogg","wood-step-right");
|
||||||
|
sound_load_effect("step_wood.3.ogg","wood-step-left");
|
||||||
|
sound_load_effect("step_wood.4.ogg","wood-step-right");
|
||||||
|
/* CMT_GLASS */
|
||||||
|
sound_load_effect("step_glass.1.ogg","glass-step-left");
|
||||||
|
sound_load_effect("step_glass.1.ogg","glass-step-right");
|
||||||
|
/* special for grass */
|
||||||
|
sound_load_effect("step_grass.1.ogg","grass-step-left");
|
||||||
|
sound_load_effect("step_grass.2.ogg","grass-step-right");
|
||||||
|
|
||||||
|
/* digging */
|
||||||
|
/* CMT_DIRT */
|
||||||
|
sound_load_effect("dig_dirt.1.ogg","dirt-dig");
|
||||||
|
/* CMT_STONE */
|
||||||
|
sound_load_effect("dig_stone.1.ogg","stone-dig");
|
||||||
|
/* CMT_PLANT */
|
||||||
|
sound_load_effect("dig_plant.1.ogg","plant-dig");
|
||||||
|
/* CMT_LIQUID */
|
||||||
|
sound_load_effect("dig_liquid.1.ogg","liquid-dig");
|
||||||
|
/* CMT_WOOD */
|
||||||
|
sound_load_effect("dig_wood.1.ogg","wood-dig");
|
||||||
|
/* CMT_GLASS */
|
||||||
|
sound_load_effect("dig_glass.1.ogg","glass-dig");
|
||||||
|
/* mobs */
|
||||||
|
sound_load_effect("dig_mob.ogg","mob-dig");
|
||||||
|
/* miss */
|
||||||
|
sound_load_effect("dig_miss.ogg","miss-dig");
|
||||||
|
|
||||||
|
/* placing */
|
||||||
|
sound_load_effect("place_node.1.ogg","place");
|
||||||
|
sound_load_effect("place_node.2.ogg","place");
|
||||||
|
sound_load_effect("place_node.3.ogg","place");
|
||||||
|
/* CMT_DIRT */
|
||||||
|
/* CMT_STONE */
|
||||||
|
/* CMT_PLANT */
|
||||||
|
/* CMT_LIQUID */
|
||||||
|
sound_load_effect("place_liquid.1.ogg","liquid-place");
|
||||||
|
/* CMT_WOOD */
|
||||||
|
/* CMT_GLASS */
|
||||||
|
|
||||||
|
/* open formspec */
|
||||||
|
sound_load_effect("open_menu.ogg","open-menu");
|
||||||
|
sound_load_effect("open_book.ogg","open-book");
|
||||||
|
sound_load_effect("open_chest.ogg","open-chest");
|
||||||
|
|
||||||
|
/* environment and node sounds */
|
||||||
|
sound_load_effect("env_piston.ogg","env-piston");
|
||||||
|
sound_load_effect("env_dooropen.ogg","env-dooropen");
|
||||||
|
sound_load_effect("env_doorclose.ogg","env-doorclose");
|
||||||
|
sound_load_effect("env_fire.ogg","env-fire");
|
||||||
|
sound_load_effect("env_lava.ogg","env-lava");
|
||||||
|
sound_load_effect("env_water.ogg","env-water");
|
||||||
|
sound_load_effect("env_steam.ogg","env-steam");
|
||||||
|
sound_load_effect("env_tnt.ogg","env-tnt");
|
||||||
|
sound_load_effect("env_teleport.ogg","env-teleport");
|
||||||
|
|
||||||
|
/* mobs */
|
||||||
|
sound_load_effect("mob_oerkki_spawn.ogg","mob-oerkki-spawn");
|
||||||
|
sound_load_effect("mob_wolf_hit.ogg","mob-wolf-hit");
|
||||||
|
sound_load_effect("mob_wolf_spawn.ogg","mob-wolf-spawn");
|
||||||
|
sound_load_effect("mob_sheep_env.ogg","mob-sheep-env");
|
||||||
|
sound_load_effect("mob_ducksheep_env.ogg","mob-ducksheep-env");
|
||||||
|
sound_load_effect("mob_deer_env.ogg","mob-deer-env");
|
||||||
|
|
||||||
|
/* special */
|
||||||
|
sound_load_effect("wield_item.ogg","wield");
|
||||||
|
sound_load_effect("low_energy_F.ogg","low-energy-F");
|
||||||
|
sound_load_effect("low_energy_M.ogg","low-energy-M");
|
||||||
|
sound_load_effect("player_hurt_F.ogg","player-hurt-F");
|
||||||
|
sound_load_effect("player_hurt_M.ogg","player-hurt-M");
|
||||||
|
|
||||||
|
/* use */
|
||||||
|
sound_load_effect("use_eat.ogg","use-eat");
|
||||||
|
sound_load_effect("use_drink.ogg","use-drink");
|
||||||
|
|
||||||
|
/* menu backgrounds */
|
||||||
|
sound_load_music("bg_mainmenu.ogg","bg-mainmenu");
|
||||||
|
sound_load_music("bg_charcreator.ogg","bg-charcreator");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* exit sound */
|
||||||
|
void sound_exit()
|
||||||
|
{
|
||||||
|
if (!sound_data.init)
|
||||||
|
return;
|
||||||
|
|
||||||
|
sound_stop(0);
|
||||||
|
alcMakeContextCurrent(NULL);
|
||||||
|
alcDestroyContext(sound_data.context);
|
||||||
|
alcCloseDevice(sound_data.device);
|
||||||
|
|
||||||
|
sound_data.init = 0;
|
||||||
|
|
||||||
|
/* TODO: unload sounds */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* do stuff */
|
||||||
|
void sound_process(float dtime)
|
||||||
|
{
|
||||||
|
ALint state;
|
||||||
|
float v;
|
||||||
|
sound_instance_t *d;
|
||||||
|
sound_instance_t *i;
|
||||||
|
|
||||||
|
/* factor = dtime / fade */
|
||||||
|
|
||||||
|
if (sound_data.effects.fade > -0.5) {
|
||||||
|
v = dtime/sound_data.effects.fade;
|
||||||
|
sound_data.effects.fadev -= v*sound_data.effects.volume*sound_data.volume;
|
||||||
|
if (sound_data.effects.fadev < 0.01)
|
||||||
|
sound_stop_effects(0);
|
||||||
|
}
|
||||||
|
i = sound_data.effects.playing;
|
||||||
|
while (i) {
|
||||||
|
alGetSourcei(i->id, AL_SOURCE_STATE, &state);
|
||||||
|
if (state != AL_PLAYING) {
|
||||||
|
d = i;
|
||||||
|
i = i->next;
|
||||||
|
sound_data.effects.playing = list_remove(&sound_data.effects.playing,d);
|
||||||
|
alDeleteSources(1, &d->id);
|
||||||
|
free(d);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (i->fade > -0.5) {
|
||||||
|
if (i->fade > 0.01 && i->volume > 0.01) {
|
||||||
|
v = dtime/i->fade;
|
||||||
|
i->volume -= v*sound_data.music.volume*sound_data.volume;
|
||||||
|
if (i->volume > 0.01)
|
||||||
|
alSourcef(i->id, AL_GAIN, i->volume);
|
||||||
|
}else{
|
||||||
|
d = i;
|
||||||
|
i = i->next;
|
||||||
|
sound_data.effects.playing = list_remove(&sound_data.effects.playing,d);
|
||||||
|
alDeleteSources(1, &d->id);
|
||||||
|
free(d);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (sound_data.effects.fade > -0.5)
|
||||||
|
alSourcef(i->id, AL_GAIN, sound_data.effects.fadev);
|
||||||
|
i = i->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* */
|
||||||
|
void sound_step(float dtime, v3_t *pos, v3_t *at, v3_t *up)
|
||||||
|
{
|
||||||
|
float orientation[6] = {0.0,0.0,0.0,0.0,0.0,0.0};
|
||||||
|
|
||||||
|
sound_process(dtime);
|
||||||
|
|
||||||
|
if (pos) {
|
||||||
|
alListenerfv(AL_POSITION, (float*)pos);
|
||||||
|
}else{
|
||||||
|
alListener3f(AL_POSITION, 0.0,0.0,0.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
alListener3f(AL_VELOCITY, 0.0,0.0,0.0);
|
||||||
|
|
||||||
|
if (at) {
|
||||||
|
orientation[0] = at->x;
|
||||||
|
orientation[1] = at->y;
|
||||||
|
orientation[2] = at->z;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (up) {
|
||||||
|
orientation[3] = up->x;
|
||||||
|
orientation[4] = up->y;
|
||||||
|
orientation[5] = up->z;
|
||||||
|
}
|
||||||
|
|
||||||
|
alListenerfv(AL_ORIENTATION, orientation);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get/set sound effect volume */
|
||||||
|
float sound_volume_effects(float v)
|
||||||
|
{
|
||||||
|
if (v > -0.5) {
|
||||||
|
if (v > 1.0)
|
||||||
|
v = 1.0;
|
||||||
|
sound_data.effects.volume = v;
|
||||||
|
|
||||||
|
if (sound_data.init) {
|
||||||
|
float ev;
|
||||||
|
sound_instance_t *i = sound_data.effects.playing;
|
||||||
|
|
||||||
|
ev = v*sound_data.volume;
|
||||||
|
|
||||||
|
while (i) {
|
||||||
|
alSourcef(i->id, AL_GAIN, ev);
|
||||||
|
i = i->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sound_data.effects.volume;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get/set sound music volume */
|
||||||
|
float sound_volume_music(float v)
|
||||||
|
{
|
||||||
|
if (v > -0.5) {
|
||||||
|
if (v > 1.0)
|
||||||
|
v = 1.0;
|
||||||
|
sound_data.music.volume = v;
|
||||||
|
|
||||||
|
if (sound_data.init && sound_data.music.playing) {
|
||||||
|
float ev;
|
||||||
|
|
||||||
|
ev = v*sound_data.volume;
|
||||||
|
|
||||||
|
alSourcef(sound_data.music.playing->id, AL_GAIN, ev);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sound_data.music.volume;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get/set sound master volume */
|
||||||
|
float sound_volume_master(float v)
|
||||||
|
{
|
||||||
|
if (v > -0.5) {
|
||||||
|
if (v > 1.0)
|
||||||
|
v = 1.0;
|
||||||
|
sound_data.volume = v;
|
||||||
|
sound_volume_effects(sound_data.effects.volume);
|
||||||
|
sound_volume_music(sound_data.music.volume);
|
||||||
|
}
|
||||||
|
return sound_data.volume;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* load a sound identified by token from a file */
|
||||||
|
static sound_t *sound_load(char* file, char* token)
|
||||||
|
{
|
||||||
|
file_t *f;
|
||||||
|
sound_t *e = malloc(sizeof(sound_t));
|
||||||
|
e->file = strdup(file);
|
||||||
|
e->token = strdup(token);
|
||||||
|
e->data = NULL;
|
||||||
|
e->d_len = 0;
|
||||||
|
|
||||||
|
f = file_load("sound",file);
|
||||||
|
|
||||||
|
if (sound_is_ogg(f)) {
|
||||||
|
if (sound_load_ogg(f,e))
|
||||||
|
goto sound_load_fail;
|
||||||
|
}else if (sound_is_wav(f)) {
|
||||||
|
if (sound_load_wav(f,e))
|
||||||
|
goto sound_load_fail;
|
||||||
|
}else{
|
||||||
|
goto sound_load_fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
file_free(f);
|
||||||
|
|
||||||
|
return e;
|
||||||
|
|
||||||
|
sound_load_fail:
|
||||||
|
file_free(f);
|
||||||
|
free(e->file);
|
||||||
|
free(e->token);
|
||||||
|
if (e->data)
|
||||||
|
free(e->data);
|
||||||
|
free(e);
|
||||||
|
|
||||||
|
vlprintf(CN_ERROR, "failed to load sound data for file '%s'",file);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* load a sound effect identifed by token */
|
||||||
|
int sound_load_effect(char* file, char* token)
|
||||||
|
{
|
||||||
|
sound_t *e = sound_load(file,token);
|
||||||
|
if (!e)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
sound_data.effects.sounds = list_push(&sound_data.effects.sounds,e);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* load music identifed by token */
|
||||||
|
int sound_load_music(char* file, char* token)
|
||||||
|
{
|
||||||
|
sound_t *e = sound_load(file,token);
|
||||||
|
if (!e)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
sound_data.music.sounds = list_push(&sound_data.music.sounds,e);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* unload a sound effect */
|
||||||
|
void sound_free_effect(char* token)
|
||||||
|
{
|
||||||
|
sound_t *e = sound_data.effects.sounds;
|
||||||
|
|
||||||
|
if (!e)
|
||||||
|
return;
|
||||||
|
|
||||||
|
while (e) {
|
||||||
|
if (!strcmp(e->token,token))
|
||||||
|
break;
|
||||||
|
e = e->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!e)
|
||||||
|
return;
|
||||||
|
|
||||||
|
sound_data.effects.sounds = list_remove(&sound_data.effects.sounds,e);
|
||||||
|
|
||||||
|
alDeleteBuffers(1,&e->id);
|
||||||
|
|
||||||
|
free(e->data);
|
||||||
|
free(e->file);
|
||||||
|
free(e->token);
|
||||||
|
free(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* unload a music */
|
||||||
|
void sound_free_music(char* token)
|
||||||
|
{
|
||||||
|
sound_t *e = sound_data.music.sounds;
|
||||||
|
if (!e)
|
||||||
|
return;
|
||||||
|
|
||||||
|
while (e) {
|
||||||
|
if (!strcmp(e->token,token))
|
||||||
|
break;
|
||||||
|
e = e->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!e)
|
||||||
|
return;
|
||||||
|
|
||||||
|
sound_data.music.sounds = list_remove(&sound_data.music.sounds,e);
|
||||||
|
|
||||||
|
alDeleteBuffers(1,&e->id);
|
||||||
|
|
||||||
|
free(e->data);
|
||||||
|
free(e->file);
|
||||||
|
free(e->token);
|
||||||
|
free(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* play sound effect */
|
||||||
|
uint32_t sound_play_effect(char* token, float volume, v3_t *pos)
|
||||||
|
{
|
||||||
|
sound_instance_t *i;
|
||||||
|
sound_t *e = sound_data.effects.sounds;
|
||||||
|
if (!sound_data.init || !e)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
while (e) {
|
||||||
|
if (!strcmp(e->token,token))
|
||||||
|
break;
|
||||||
|
e = e->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!e)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
i = malloc(sizeof(sound_instance_t));
|
||||||
|
if (!i)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
alGenSources(1, &i->id);
|
||||||
|
alSourcei(i->id, AL_BUFFER, e->id);
|
||||||
|
|
||||||
|
i->volume = volume;
|
||||||
|
i->fade = -1.0;
|
||||||
|
|
||||||
|
if (pos) {
|
||||||
|
alSourcei(i->id, AL_SOURCE_RELATIVE, AL_FALSE);
|
||||||
|
alSource3f(i->id, AL_POSITION, pos->x, pos->y, pos->z);
|
||||||
|
alSourcef(i->id, AL_REFERENCE_DISTANCE, 30.0);
|
||||||
|
}else{
|
||||||
|
alSourcei(i->id, AL_SOURCE_RELATIVE, AL_TRUE);
|
||||||
|
alSource3f(i->id, AL_POSITION, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
alSource3f(i->id, AL_VELOCITY, 0, 0, 0);
|
||||||
|
alSourcei(i->id, AL_LOOPING, AL_FALSE);
|
||||||
|
alSourcef(i->id, AL_GAIN, sound_data.effects.volume*sound_data.volume*volume);
|
||||||
|
alSourcePlay(i->id);
|
||||||
|
|
||||||
|
if (alGetError() != AL_NO_ERROR) {
|
||||||
|
alDeleteSources(1, &i->id);
|
||||||
|
free(i);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
sound_data.effects.playing = list_push(&sound_data.effects.playing,i);
|
||||||
|
|
||||||
|
return i->id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* play music */
|
||||||
|
uint32_t sound_play_music(char* token, float volume)
|
||||||
|
{
|
||||||
|
sound_t *e = sound_data.music.sounds;
|
||||||
|
if (!sound_data.init || !e)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
while (e) {
|
||||||
|
if (!strcmp(e->token,token))
|
||||||
|
break;
|
||||||
|
e = e->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!e)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (sound_data.music.playing) {
|
||||||
|
sound_data.effects.playing->fade = 1.0;
|
||||||
|
sound_data.effects.playing = list_push(&sound_data.effects.playing,sound_data.music.playing);
|
||||||
|
}
|
||||||
|
|
||||||
|
sound_data.music.playing = malloc(sizeof(sound_instance_t));
|
||||||
|
if (!sound_data.music.playing)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
alGenSources(1, &sound_data.music.playing->id);
|
||||||
|
alSourcei(sound_data.music.playing->id, AL_BUFFER, e->id);
|
||||||
|
|
||||||
|
sound_data.music.playing->volume = volume;
|
||||||
|
sound_data.music.playing->fade = -1.0;
|
||||||
|
|
||||||
|
alSourcei(sound_data.music.playing->id, AL_SOURCE_RELATIVE, AL_TRUE);
|
||||||
|
alSource3f(sound_data.music.playing->id, AL_POSITION, 0, 0, 0);
|
||||||
|
alSource3f(sound_data.music.playing->id, AL_VELOCITY, 0, 0, 0);
|
||||||
|
alSourcei(sound_data.music.playing->id, AL_LOOPING, AL_TRUE);
|
||||||
|
alSourcef(sound_data.music.playing->id, AL_GAIN, sound_data.music.volume*sound_data.volume*volume);
|
||||||
|
alSourcePlay(sound_data.music.playing->id);
|
||||||
|
|
||||||
|
if (alGetError() != AL_NO_ERROR) {
|
||||||
|
alDeleteSources(1, &sound_data.music.playing->id);
|
||||||
|
free(sound_data.music.playing);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sound_data.music.playing->id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* stop sound effects, optionally fading out in fade seconds */
|
||||||
|
void sound_stop_effects(int fade)
|
||||||
|
{
|
||||||
|
if (fade) {
|
||||||
|
sound_data.effects.fade = fade;
|
||||||
|
sound_data.effects.fadev = sound_data.effects.volume;
|
||||||
|
}else{
|
||||||
|
sound_instance_t *i = sound_data.effects.playing;
|
||||||
|
while (i) {
|
||||||
|
alSourceStop(i->id);
|
||||||
|
i = i->next;
|
||||||
|
}
|
||||||
|
sound_data.effects.fade = -1.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* stop music, optionally fading out in fade seconds */
|
||||||
|
void sound_stop_music(int fade)
|
||||||
|
{
|
||||||
|
if (!sound_data.music.playing)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!fade)
|
||||||
|
alSourceStop(sound_data.music.playing->id);
|
||||||
|
|
||||||
|
sound_data.music.playing->fade = fade;
|
||||||
|
sound_data.music.playing->volume = sound_data.music.volume;
|
||||||
|
sound_data.effects.playing = list_push(&sound_data.effects.playing,sound_data.music.playing);
|
||||||
|
sound_data.music.playing = NULL;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void sound_stop_single(uint32_t id)
|
||||||
|
{
|
||||||
|
sound_instance_t *i = sound_data.effects.playing;
|
||||||
|
while (i) {
|
||||||
|
if (i->id == id) {
|
||||||
|
alSourceStop(i->id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i = i->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* stop all sounds, optionally fading out in fade seconds */
|
||||||
|
void sound_stop(int fade)
|
||||||
|
{
|
||||||
|
sound_stop_music(fade);
|
||||||
|
sound_stop_effects(fade);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* command setter for sound effects volume */
|
||||||
|
int sound_effects_setter(char* value)
|
||||||
|
{
|
||||||
|
float vf;
|
||||||
|
int v = strtol(value,NULL,10);
|
||||||
|
vf = (float)v/100.0;
|
||||||
|
sound_volume_effects(vf);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* command setter for music volume */
|
||||||
|
int sound_music_setter(char* value)
|
||||||
|
{
|
||||||
|
float vf;
|
||||||
|
int v = strtol(value,NULL,10);
|
||||||
|
vf = (float)v/100.0;
|
||||||
|
sound_volume_music(vf);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* command setter for master volume */
|
||||||
|
int sound_master_setter(char* value)
|
||||||
|
{
|
||||||
|
int v = strtol(value,NULL,10);
|
||||||
|
if (v < 0)
|
||||||
|
v = 0;
|
||||||
|
if (v > 100)
|
||||||
|
v = 100;
|
||||||
|
|
||||||
|
sound_data.volume = (float)v/100.0;
|
||||||
|
|
||||||
|
sound_volume_effects(sound_data.effects.volume);
|
||||||
|
sound_volume_music(sound_data.music.volume);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
145
src/sound.h
145
src/sound.h
|
@ -1,96 +1,73 @@
|
||||||
/************************************************************************
|
#ifndef _SOUND_H_
|
||||||
* Minetest-c55
|
#define _SOUND_H_
|
||||||
* Copyright (C) 2012 celeron55, Perttu Ahola <celeron55@gmail.com>
|
|
||||||
*
|
|
||||||
* sound.h
|
|
||||||
* voxelands - 3d voxel world sandbox game
|
|
||||||
* Copyright (C) Lisa 'darkrose' Milne 2014 <lisa@ltmnet.com>
|
|
||||||
*
|
|
||||||
* 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/>
|
|
||||||
*
|
|
||||||
* License updated from GPLv2 or later to GPLv3 or later by Lisa Milne
|
|
||||||
* for Voxelands.
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#ifndef SOUND_HEADER
|
#include "common.h"
|
||||||
#define SOUND_HEADER
|
#include "nvp.h"
|
||||||
|
|
||||||
#include "common_irrlicht.h"
|
#include <AL/al.h>
|
||||||
#include <string>
|
#include <AL/alc.h>
|
||||||
#include <vector>
|
#include <AL/alext.h>
|
||||||
#include <set>
|
|
||||||
#include "mapnode.h"
|
|
||||||
|
|
||||||
class ISoundManager
|
#ifdef __cplusplus
|
||||||
{
|
extern "C" {
|
||||||
public:
|
#endif
|
||||||
virtual ~ISoundManager(){}
|
|
||||||
|
|
||||||
// Multiple sounds can be loaded per name; when played, the sound
|
typedef struct sound_s {
|
||||||
// should be chosen randomly from alternatives
|
struct sound_s *prev;
|
||||||
// Return value determines success/failure
|
struct sound_s *next;
|
||||||
virtual bool loadSound(const std::string &name, const std::string &filepath, float gain=1.0) = 0;
|
char* file;
|
||||||
|
char* token;
|
||||||
|
ALenum format;
|
||||||
|
ALsizei freq;
|
||||||
|
ALuint id;
|
||||||
|
char* data;
|
||||||
|
int d_len;
|
||||||
|
} sound_t;
|
||||||
|
|
||||||
virtual void updateListener(v3f pos, v3f vel, v3f at, v3f up) = 0;
|
typedef struct sound_instance_s {
|
||||||
virtual void setListenerGain(float gain) = 0;
|
struct sound_instance_s *prev;
|
||||||
|
struct sound_instance_s *next;
|
||||||
|
ALuint id;
|
||||||
|
float volume;
|
||||||
|
float fade;
|
||||||
|
} sound_instance_t;
|
||||||
|
|
||||||
// playSound functions return -1 on failure, otherwise a handle to the
|
/* defined in sound.c */
|
||||||
// sound. If name=="", call should be ignored without error.
|
int sound_init(void);
|
||||||
virtual int playSound(const std::string &name, bool loop) = 0;
|
void sound_exit(void);
|
||||||
virtual int playSoundAt(const std::string &name, bool loop, v3f pos, float gain=1.0, bool queue=false) = 0;
|
void sound_step(float dtime, v3_t *pos, v3_t *at, v3_t *up);
|
||||||
virtual void stopSound(int sound) = 0;
|
int sound_load_effect(char* file, char* token);
|
||||||
virtual bool soundExists(int sound) = 0;
|
int sound_load_music(char* file, char* token);
|
||||||
|
void sound_free_effect(char* token);
|
||||||
|
void sound_free_music(char* token);
|
||||||
|
uint32_t sound_play_effect(char* token, float volume, v3_t *pos);
|
||||||
|
uint32_t sound_play_music(char* token, float volume);
|
||||||
|
void sound_stop_effects(int fade);
|
||||||
|
void sound_stop_music(int fade);
|
||||||
|
void sound_stop_single(uint32_t id);
|
||||||
|
void sound_stop(int fade);
|
||||||
|
int sound_master_setter(char* value);
|
||||||
|
int sound_effects_setter(char* value);
|
||||||
|
int sound_music_setter(char* value);
|
||||||
|
|
||||||
virtual bool playMusic(const std::string &name, bool loop) = 0;
|
#ifdef _VL_SOUND_EXPOSE_INTERNAL
|
||||||
virtual void stopMusic() = 0;
|
/* defined in sound.c */
|
||||||
|
void sound_process(float dtime);
|
||||||
|
float sound_volume_master(float v);
|
||||||
|
float sound_volume_effects(float v);
|
||||||
|
float sound_volume_music(float v);
|
||||||
|
|
||||||
virtual void updateSoundPosition(int sound, v3f pos) = 0;
|
/* defined in sound_ogg.c */
|
||||||
|
int sound_is_ogg(file_t *f);
|
||||||
|
int sound_load_ogg(file_t *f, sound_t *e);
|
||||||
|
|
||||||
virtual void maintain(float dtime) = 0;
|
/* defined in sound_wav.c */
|
||||||
};
|
int sound_is_wav(file_t *f);
|
||||||
|
int sound_load_wav(file_t *f, sound_t *e);
|
||||||
|
#endif
|
||||||
|
|
||||||
class DummySoundManager: public ISoundManager
|
#ifdef __cplusplus
|
||||||
{
|
}
|
||||||
public:
|
#endif
|
||||||
virtual bool loadSound(const std::string &name, const std::string &filepath, float gain) {return true;}
|
|
||||||
|
|
||||||
void updateListener(v3f pos, v3f vel, v3f at, v3f up) {}
|
|
||||||
void setListenerGain(float gain) {}
|
|
||||||
|
|
||||||
int playSound(const std::string &name, bool loop) {return 0;}
|
|
||||||
int playSoundAt(const std::string &name, bool loop, v3f pos, float gain, bool queue) {return 0;}
|
|
||||||
void stopSound(int sound) {}
|
|
||||||
bool soundExists(int sound) {return false;}
|
|
||||||
|
|
||||||
bool playMusic(const std::string &name, bool loop) {return false;}
|
|
||||||
void stopMusic() {}
|
|
||||||
|
|
||||||
void updateSoundPosition(int sound, v3f pos) {}
|
|
||||||
|
|
||||||
void maintain(float dtime) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
ISoundManager *createSoundManager();
|
|
||||||
void init_sounds(ISoundManager *sound);
|
|
||||||
|
|
||||||
class Map;
|
|
||||||
|
|
||||||
// Global DummySoundManager singleton
|
|
||||||
extern DummySoundManager dummySoundManager;
|
|
||||||
extern ISoundManager *g_sound;
|
|
||||||
|
|
||||||
void sound_playStep(Map *map, v3f pos, int foot, float gain=1.0);
|
|
||||||
void sound_playDig(content_t c, v3f pos);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,123 @@
|
||||||
|
/************************************************************************
|
||||||
|
* sound_ogg.c
|
||||||
|
* voxelands - 3d voxel world sandbox game
|
||||||
|
* Copyright (C) Lisa 'darkrose' Milne 2017 <lisa@ltmnet.com>
|
||||||
|
*
|
||||||
|
* 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/>
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "sound.h"
|
||||||
|
#include "file.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <vorbis/vorbisfile.h>
|
||||||
|
|
||||||
|
static size_t sound_ogg_read(void* dst, size_t byte_size, size_t l, void* src)
|
||||||
|
{
|
||||||
|
return file_read(src,dst,(l*byte_size));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sound_ogg_seek(void* src, ogg_int64_t offset, int origin)
|
||||||
|
{
|
||||||
|
return file_seek(src,offset,origin);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sound_ogg_close(void* src)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static long sound_ogg_tell(void* src)
|
||||||
|
{
|
||||||
|
return file_tell(src);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* is it an ogg? */
|
||||||
|
int sound_is_ogg(file_t *f)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
OggVorbis_File oggfile;
|
||||||
|
ov_callbacks cb;
|
||||||
|
|
||||||
|
cb.read_func = sound_ogg_read;
|
||||||
|
cb.close_func = sound_ogg_close;
|
||||||
|
cb.seek_func = sound_ogg_seek;
|
||||||
|
cb.tell_func = sound_ogg_tell;
|
||||||
|
|
||||||
|
r = !ov_test_callbacks(f, &oggfile, NULL, 0, cb);
|
||||||
|
|
||||||
|
if (r)
|
||||||
|
ov_clear(&oggfile);
|
||||||
|
|
||||||
|
file_seek(f,0,SEEK_SET);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* load an ogg file */
|
||||||
|
int sound_load_ogg(file_t *f, sound_t *e)
|
||||||
|
{
|
||||||
|
int endian = 0;
|
||||||
|
int bitStream;
|
||||||
|
int s;
|
||||||
|
char buff[30000];
|
||||||
|
vorbis_info *ogginfo;
|
||||||
|
OggVorbis_File oggfile;
|
||||||
|
ov_callbacks cb;
|
||||||
|
|
||||||
|
cb.read_func = sound_ogg_read;
|
||||||
|
cb.close_func = sound_ogg_close;
|
||||||
|
cb.seek_func = sound_ogg_seek;
|
||||||
|
cb.tell_func = sound_ogg_tell;
|
||||||
|
|
||||||
|
if (ov_open_callbacks(f, &oggfile, NULL, 0, cb))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
ogginfo = ov_info(&oggfile, -1);
|
||||||
|
|
||||||
|
/* always use 16-bit samples */
|
||||||
|
if (ogginfo->channels == 1) {
|
||||||
|
e->format = AL_FORMAT_MONO16;
|
||||||
|
}else{
|
||||||
|
e->format = AL_FORMAT_STEREO16;
|
||||||
|
}
|
||||||
|
|
||||||
|
e->freq = ogginfo->rate;
|
||||||
|
|
||||||
|
do{
|
||||||
|
s = ov_read(&oggfile, buff, 30000, endian, 2, 1, &bitStream);
|
||||||
|
if (s < 0) {
|
||||||
|
ov_clear(&oggfile);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
e->data = realloc(e->data,e->d_len+s);
|
||||||
|
memcpy(e->data+e->d_len,buff,s);
|
||||||
|
e->d_len += s;
|
||||||
|
} while (s > 0);
|
||||||
|
|
||||||
|
alGenBuffers(1, &e->id);
|
||||||
|
alBufferData(e->id, e->format, e->data, e->d_len, e->freq);
|
||||||
|
|
||||||
|
|
||||||
|
if (alGetError() != AL_NO_ERROR)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
ov_clear(&oggfile);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,105 @@
|
||||||
|
/************************************************************************
|
||||||
|
* sound_wav.c
|
||||||
|
* voxelands - 3d voxel world sandbox game
|
||||||
|
* Copyright (C) Lisa 'darkrose' Milne 2017 <lisa@ltmnet.com>
|
||||||
|
*
|
||||||
|
* 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/>
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "sound.h"
|
||||||
|
#include "file.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
typedef struct wav_file_header_s {
|
||||||
|
char riff[4]; /* 'RIFF' */
|
||||||
|
int size;
|
||||||
|
char wave[4]; /* 'WAVE' */
|
||||||
|
char fmt[4]; /* 'fmt ' */
|
||||||
|
int f_len;
|
||||||
|
short int f_tag;
|
||||||
|
} __attribute__((packed)) wav_file_header_t;
|
||||||
|
|
||||||
|
typedef struct wav_format_header_s {
|
||||||
|
short int channels;
|
||||||
|
int freq;
|
||||||
|
int bytes_per_second;
|
||||||
|
short int block_align;
|
||||||
|
short int bps;
|
||||||
|
char data[4]; /* 'data' */
|
||||||
|
int d_len;
|
||||||
|
} __attribute__((packed)) wav_format_header_t;
|
||||||
|
|
||||||
|
/* is it a wav file? */
|
||||||
|
int sound_is_wav(file_t *f)
|
||||||
|
{
|
||||||
|
int r = 0;
|
||||||
|
wav_file_header_t h;
|
||||||
|
|
||||||
|
file_read(f,&h,sizeof(wav_file_header_t));
|
||||||
|
|
||||||
|
if (!strncmp("RIFF",h.riff,4) && !strncmp("WAVE",h.wave,4))
|
||||||
|
r = 1;
|
||||||
|
|
||||||
|
file_seek(f,0,SEEK_SET);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* load a wav file */
|
||||||
|
int sound_load_wav(file_t *f, sound_t *e)
|
||||||
|
{
|
||||||
|
wav_file_header_t h;
|
||||||
|
wav_format_header_t fmt;
|
||||||
|
unsigned char* data;
|
||||||
|
|
||||||
|
file_read(f,&h,sizeof(wav_file_header_t));
|
||||||
|
file_read(f,&fmt,sizeof(wav_format_header_t));
|
||||||
|
data = file_get(f);
|
||||||
|
|
||||||
|
if (h.f_tag != 1) {
|
||||||
|
return 1;
|
||||||
|
}else if (fmt.bps == 8) {
|
||||||
|
if (fmt.channels == 1) {
|
||||||
|
e->format = AL_FORMAT_MONO8;
|
||||||
|
}else{
|
||||||
|
e->format = AL_FORMAT_STEREO8;
|
||||||
|
}
|
||||||
|
}else if (fmt.bps == 16) {
|
||||||
|
if (fmt.channels == 1) {
|
||||||
|
e->format = AL_FORMAT_MONO16;
|
||||||
|
}else{
|
||||||
|
e->format = AL_FORMAT_STEREO16;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
e->freq = fmt.freq;
|
||||||
|
|
||||||
|
e->d_len = fmt.d_len;
|
||||||
|
e->data = malloc(e->d_len);
|
||||||
|
|
||||||
|
memcpy(e->data,data,e->d_len);
|
||||||
|
|
||||||
|
alGenBuffers(1, &e->id);
|
||||||
|
alBufferData(e->id, e->format, e->data, e->d_len, e->freq);
|
||||||
|
|
||||||
|
|
||||||
|
if (alGetError() != AL_NO_ERROR)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -17,6 +17,7 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
#include "array.h"
|
#include "array.h"
|
||||||
|
|
Loading…
Reference in New Issue