blitz3d/bbruntime/bbaudio.cpp

143 lines
3.2 KiB
C++

#include "std.h"
#include "bbaudio.h"
gxAudio *gx_audio;
static inline void debugSound( gxSound *s ){
if( debug ){
if( !gx_audio->verifySound( s ) ) RTEX( "Sound does not exist" );
}
}
static gxSound *loadSound( BBStr *f,bool use_3d ){
string t=*f;delete f;
return gx_audio ? gx_audio->loadSound( t,use_3d ) : 0;
}
static gxChannel *playMusic( BBStr *f,bool use_3d ){
string t=*f;delete f;
return gx_audio ? gx_audio->playFile( t,use_3d ) : 0;
}
gxSound *bbLoadSound( BBStr *f ){
return loadSound( f,false );
}
void bbFreeSound( gxSound *sound ){
if( !sound ) return;
debugSound( sound );
gx_audio->freeSound( sound );
}
void bbLoopSound( gxSound *sound ){
if( !sound ) return;
debugSound( sound );
sound->setLoop( true );
}
void bbSoundPitch( gxSound *sound,int pitch ){
if( !sound ) return;
debugSound( sound );
sound->setPitch( pitch );
}
void bbSoundVolume( gxSound *sound,float volume ){
if( !sound ) return;
debugSound( sound );
sound->setVolume( volume );
}
void bbSoundPan( gxSound *sound,float pan ){
if( !sound ) return;
debugSound( sound );
sound->setPan( pan );
}
gxChannel *bbPlaySound( gxSound *sound ){
if( !sound ) return 0;
debugSound( sound );
return sound->play();
}
gxChannel *bbPlayMusic( BBStr *f ){
return playMusic( f,false );
}
gxChannel *bbPlayCDTrack( int track,int mode ){
return gx_audio ? gx_audio->playCDTrack( track,mode ) : 0;
}
void bbStopChannel( gxChannel *channel ){
if( !channel ) return;
channel->stop();
}
void bbPauseChannel( gxChannel *channel ){
if( !channel ) return;
channel->setPaused( true );
}
void bbResumeChannel( gxChannel *channel ){
if( !channel ) return;
channel->setPaused( false );
}
void bbChannelPitch( gxChannel *channel,int pitch ){
if( !channel ) return;
channel->setPitch( pitch );
}
void bbChannelVolume( gxChannel *channel,float volume ){
if( !channel ) return;
channel->setVolume( volume );
}
void bbChannelPan( gxChannel *channel,float pan ){
if( !channel ) return;
channel->setPan( pan );
}
int bbChannelPlaying( gxChannel *channel ){
return channel ? channel->isPlaying() : 0;
}
#ifdef PRO
gxSound *bbLoad3DSound( BBStr *f ){
return loadSound( f,true );
}
#endif
bool audio_create(){
gx_audio=gx_runtime->openAudio( 0 );
return true;
}
bool audio_destroy(){
if( gx_audio ) gx_runtime->closeAudio( gx_audio );
gx_audio=0;
return true;
}
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 );
#ifdef PRO
rtSym( "%Load3DSound$filename",bbLoad3DSound );
#endif
}