2019-01-18 15:55:06 +01:00
|
|
|
#include "bbaudio.hpp"
|
2019-01-18 21:26:57 +01:00
|
|
|
|
|
|
|
|
#include <gxchannel.hpp>
|
|
|
|
|
#include <gxsound.hpp>
|
2014-01-31 08:23:00 +13:00
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
gxAudio* gx_audio;
|
2014-01-31 08:23:00 +13:00
|
|
|
|
2019-01-18 21:26:57 +01:00
|
|
|
#ifdef _DEBUG
|
2019-01-18 17:04:17 +01:00
|
|
|
static inline void debugSound(gxSound* s)
|
|
|
|
|
{
|
|
|
|
|
if (debug) {
|
|
|
|
|
if (!gx_audio->verifySound(s))
|
|
|
|
|
ThrowRuntimeException("Sound does not exist");
|
2014-01-31 08:23:00 +13:00
|
|
|
}
|
|
|
|
|
}
|
2019-01-18 21:26:57 +01:00
|
|
|
#else
|
|
|
|
|
#define debugSound
|
|
|
|
|
#endif
|
2014-01-31 08:23:00 +13:00
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
static gxSound* loadSound(BBStr* f, bool use_3d)
|
|
|
|
|
{
|
2019-01-18 21:26:57 +01:00
|
|
|
std::string t = *f;
|
2019-01-18 17:04:17 +01:00
|
|
|
delete f;
|
|
|
|
|
return gx_audio ? gx_audio->loadSound(t, use_3d) : 0;
|
2014-01-31 08:23:00 +13:00
|
|
|
}
|
|
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
static gxChannel* playMusic(BBStr* f, bool use_3d)
|
|
|
|
|
{
|
2019-01-18 21:26:57 +01:00
|
|
|
std::string t = *f;
|
2019-01-18 17:04:17 +01:00
|
|
|
delete f;
|
|
|
|
|
return gx_audio ? gx_audio->playFile(t, use_3d) : 0;
|
2014-01-31 08:23:00 +13:00
|
|
|
}
|
|
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
gxSound* bbLoadSound(BBStr* f)
|
|
|
|
|
{
|
|
|
|
|
return loadSound(f, false);
|
2014-01-31 08:23:00 +13:00
|
|
|
}
|
|
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
void bbFreeSound(gxSound* sound)
|
|
|
|
|
{
|
|
|
|
|
if (!sound)
|
|
|
|
|
return;
|
|
|
|
|
debugSound(sound);
|
|
|
|
|
gx_audio->freeSound(sound);
|
2014-01-31 08:23:00 +13:00
|
|
|
}
|
|
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
void bbLoopSound(gxSound* sound)
|
|
|
|
|
{
|
|
|
|
|
if (!sound)
|
|
|
|
|
return;
|
|
|
|
|
debugSound(sound);
|
|
|
|
|
sound->setLoop(true);
|
2014-01-31 08:23:00 +13:00
|
|
|
}
|
|
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
void bbSoundPitch(gxSound* sound, int pitch)
|
|
|
|
|
{
|
|
|
|
|
if (!sound)
|
|
|
|
|
return;
|
|
|
|
|
debugSound(sound);
|
|
|
|
|
sound->setPitch(pitch);
|
2014-01-31 08:23:00 +13:00
|
|
|
}
|
|
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
void bbSoundVolume(gxSound* sound, float volume)
|
|
|
|
|
{
|
|
|
|
|
if (!sound)
|
|
|
|
|
return;
|
|
|
|
|
debugSound(sound);
|
|
|
|
|
sound->setVolume(volume);
|
2014-01-31 08:23:00 +13:00
|
|
|
}
|
|
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
void bbSoundPan(gxSound* sound, float pan)
|
|
|
|
|
{
|
|
|
|
|
if (!sound)
|
|
|
|
|
return;
|
|
|
|
|
debugSound(sound);
|
|
|
|
|
sound->setPan(pan);
|
2014-01-31 08:23:00 +13:00
|
|
|
}
|
|
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
gxChannel* bbPlaySound(gxSound* sound)
|
|
|
|
|
{
|
|
|
|
|
if (!sound)
|
|
|
|
|
return 0;
|
|
|
|
|
debugSound(sound);
|
2014-01-31 08:23:00 +13:00
|
|
|
return sound->play();
|
|
|
|
|
}
|
|
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
gxChannel* bbPlayMusic(BBStr* f)
|
|
|
|
|
{
|
|
|
|
|
return playMusic(f, false);
|
2014-01-31 08:23:00 +13:00
|
|
|
}
|
|
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
gxChannel* bbPlayCDTrack(int track, int mode)
|
|
|
|
|
{
|
|
|
|
|
return gx_audio ? gx_audio->playCDTrack(track, mode) : 0;
|
2014-01-31 08:23:00 +13:00
|
|
|
}
|
|
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
void bbStopChannel(gxChannel* channel)
|
|
|
|
|
{
|
|
|
|
|
if (!channel)
|
|
|
|
|
return;
|
2014-01-31 08:23:00 +13:00
|
|
|
channel->stop();
|
|
|
|
|
}
|
|
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
void bbPauseChannel(gxChannel* channel)
|
|
|
|
|
{
|
|
|
|
|
if (!channel)
|
|
|
|
|
return;
|
|
|
|
|
channel->setPaused(true);
|
2014-01-31 08:23:00 +13:00
|
|
|
}
|
|
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
void bbResumeChannel(gxChannel* channel)
|
|
|
|
|
{
|
|
|
|
|
if (!channel)
|
|
|
|
|
return;
|
|
|
|
|
channel->setPaused(false);
|
2014-01-31 08:23:00 +13:00
|
|
|
}
|
|
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
void bbChannelPitch(gxChannel* channel, int pitch)
|
|
|
|
|
{
|
|
|
|
|
if (!channel)
|
|
|
|
|
return;
|
|
|
|
|
channel->setPitch(pitch);
|
2014-01-31 08:23:00 +13:00
|
|
|
}
|
|
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
void bbChannelVolume(gxChannel* channel, float volume)
|
|
|
|
|
{
|
|
|
|
|
if (!channel)
|
|
|
|
|
return;
|
|
|
|
|
channel->setVolume(volume);
|
2014-01-31 08:23:00 +13:00
|
|
|
}
|
|
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
void bbChannelPan(gxChannel* channel, float pan)
|
|
|
|
|
{
|
|
|
|
|
if (!channel)
|
|
|
|
|
return;
|
|
|
|
|
channel->setPan(pan);
|
2014-01-31 08:23:00 +13:00
|
|
|
}
|
|
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
int bbChannelPlaying(gxChannel* channel)
|
|
|
|
|
{
|
2014-01-31 08:23:00 +13:00
|
|
|
return channel ? channel->isPlaying() : 0;
|
|
|
|
|
}
|
|
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
gxSound* bbLoad3DSound(BBStr* f)
|
|
|
|
|
{
|
|
|
|
|
return loadSound(f, true);
|
2014-01-31 08:23:00 +13:00
|
|
|
}
|
|
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
bool audio_create()
|
|
|
|
|
{
|
|
|
|
|
gx_audio = gx_runtime->openAudio(0);
|
2014-01-31 08:23:00 +13:00
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
bool audio_destroy()
|
|
|
|
|
{
|
|
|
|
|
if (gx_audio)
|
|
|
|
|
gx_runtime->closeAudio(gx_audio);
|
|
|
|
|
gx_audio = 0;
|
2014-01-31 08:23:00 +13:00
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2019-01-18 17:04:17 +01:00
|
|
|
void audio_link(void (*rtSym)(const char*, void*))
|
|
|
|
|
{
|
|
|
|
|
rtSym("%LoadSound$filename", bbLoadSound);
|
|
|
|
|
rtSym("FreeSound%sound", bbFreeSound);
|
|
|
|
|
rtSym("LoopSound%sound", bbLoopSound);
|
|
|
|
|
rtSym("SoundPitch%sound%pitch", bbSoundPitch);
|
|
|
|
|
rtSym("SoundVolume%sound#volume", bbSoundVolume);
|
|
|
|
|
rtSym("SoundPan%sound#pan", bbSoundPan);
|
|
|
|
|
rtSym("%PlaySound%sound", bbPlaySound);
|
|
|
|
|
rtSym("%PlayMusic$midifile", bbPlayMusic);
|
|
|
|
|
rtSym("%PlayCDTrack%track%mode=1", bbPlayCDTrack);
|
|
|
|
|
rtSym("StopChannel%channel", bbStopChannel);
|
|
|
|
|
rtSym("PauseChannel%channel", bbPauseChannel);
|
|
|
|
|
rtSym("ResumeChannel%channel", bbResumeChannel);
|
|
|
|
|
rtSym("ChannelPitch%channel%pitch", bbChannelPitch);
|
|
|
|
|
rtSym("ChannelVolume%channel#volume", bbChannelVolume);
|
|
|
|
|
rtSym("ChannelPan%channel#pan", bbChannelPan);
|
|
|
|
|
rtSym("%ChannelPlaying%channel", bbChannelPlaying);
|
|
|
|
|
rtSym("%Load3DSound$filename", bbLoad3DSound);
|
2014-01-31 08:23:00 +13:00
|
|
|
}
|