ultimatepp/bazaar/UltimatePlayer/FMod.cpp
unodgs 0463a45fdf Added UltimatePlayer
git-svn-id: svn://ultimatepp.org/upp/trunk@1167 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2009-05-12 20:02:10 +00:00

333 lines
5.7 KiB
C++

#include <CtrlLib/CtrlLib.h>
#include <fmod.hpp>
#include <fmod_errors.h>
#include "fmod.h"
bool CheckError(FMOD_RESULT result, bool show_message = true)
{
if(result != FMOD_OK)
{
if(show_message)
PromptOK(Format("FMOD error! (%d) %s\n", result, FMOD_ErrorString(result)));
return true;
}
return false;
}
SoundSystem::SoundSystem()
{
system = NULL;
}
SoundSystem::~SoundSystem()
{
Close();
}
void SoundSystem::Close()
{
if(!system)
return;
system->close();
system->release();
system = NULL;
}
int SoundSystem::Open()
{
result = FMOD::System_Create(&system);
if(CheckError(result))
return -1;
unsigned int version;
result = system->getVersion(&version);
if(CheckError(result))
return -1;
if(version < FMOD_VERSION)
{
PromptOK(Format("You are using an old version of FMOD %08x&This program requires %08x\n", (int) version, FMOD_VERSION));
return -1;
}
//result = system->setSpeakerMode(FMOD_SPEAKERMODE_5POINT1);
//if(CheckError())
// return -2;
result = system->init(32, FMOD_INIT_NORMAL, 0);
if(CheckError(result))
return -3;
result = system->getMasterChannelGroup(&master);
if(CheckError(result))
return -4;
return 0;
}
void SoundSystem::SetVolume(float vol)
{
master->setVolume(vol / 100.0f);
}
float SoundSystem::GetVolume()
{
float volume;
master->getVolume(&volume);
return volume * 100.0f;
}
/*-----------------------------------------------------------------------------*/
void SoundStream::SetSystem(SoundSystem &sys)
{
system = sys.GetSystem();
}
void SoundStream::Init()
{
system = NULL;
channel = NULL;
sound = NULL;
track = NULL;
// length = 0;
format = FMOD_SOUND_FORMAT_NONE;
type = FMOD_SOUND_TYPE_UNKNOWN;
channels = 0;
bits = 0;
track_number = -1;
}
SoundStream::SoundStream()
{
Init();
}
SoundStream::SoundStream(SoundSystem &sys)
{
Init();
system = sys.GetSystem();
}
SoundStream::~SoundStream()
{
}
/*
bool SoundStream::Play(int track_number)
{
if(sound)
{
SetTrack(track_number);
result = system->playSound(FMOD_CHANNEL_FREE, track, false, &channel);
if(!CheckError(result, 0))
return true;
}
return false;
}*/
bool SoundStream::Play(const char * stream, int track_number)
{
if(track_number >= 0)
{
if(drive != stream)
{
Stop();
drive = stream;
}
this->track_number = track_number;
}
else
Stop();
sound = Open(stream);
if(sound)
{
if(track_number < 0)
result = system->playSound(FMOD_CHANNEL_FREE, sound, false, &channel);
else
{
SetTrack(track_number);
result = system->playSound(FMOD_CHANNEL_FREE, track, false, &channel);
}
if(!CheckError(result, 0))
return true;
}
return false;
}
bool SoundStream::Stop()
{
track_number = -1;
drive.Clear();
if(sound)
{
sound->release();
sound = NULL;
return true;
}
return false;
}
bool SoundStream::Pause()
{
bool paused;
channel->getPaused(&paused);
channel->setPaused(!paused);
return paused;
}
void SoundStream::SetPos(float pos)
{
SetMsPos((int((pos * length) / 100.0f)));
}
float SoundStream::GetPos()
{
return (GetMsPos() * 100) / (float) length;
}
int SoundStream::GetMsPos()
{
return GetPos(channel, FMOD_TIMEUNIT_MS);
}
int SoundStream::GetBytePos()
{
return GetPos(channel, FMOD_TIMEUNIT_RAWBYTES);
}
void SoundStream::SetBytePos(int pos)
{
SetPos(channel, pos, FMOD_TIMEUNIT_RAWBYTES);
}
void SoundStream::SetMsPos(int ms)
{
SetPos(channel, ms, FMOD_TIMEUNIT_MS);
}
bool SoundStream::IsPlaying()
{
bool playing;
channel->isPlaying(&playing);
return playing;
}
bool SoundStream::IsPaused()
{
bool paused;
channel->getPaused(&paused);
return paused;
}
WString SoundStream::GetTag(const char * tagname)
{
return GetTag(sound, tagname);
}
WString SoundStream::GetTag(FMOD::Sound * sound, const char * tagname)
{
FMOD_TAG tag;
result = sound->getTag(tagname, 0, &tag);
if(CheckError(result, 0))
return Null;
switch(tag.datatype)
{
case FMOD_TAGDATATYPE_INT:
return WString(AsString(*((int *) tag.data)));
case FMOD_TAGDATATYPE_FLOAT:
return WString(AsString(*((float *) tag.data)));
case FMOD_TAGDATATYPE_STRING:
return ToUnicode((const char *) tag.data, CHARSET_WIN1250);// + atoi(GetUserLocale(LOCALE_IDEFAULTANSICODEPAGE)) - 1250);
case FMOD_TAGDATATYPE_STRING_UTF16:
case FMOD_TAGDATATYPE_STRING_UTF16BE:
case FMOD_TAGDATATYPE_STRING_UTF8:
//return FromUnicode(WString((const wchar *) tag.data));
return WString((const wchar *) tag.data);
}
return Null;
}
FMOD::Sound * SoundStream::Open(const char * stream, int mode)
{
if(sound)
return sound;
result = system->createStream(stream, mode, 0, &sound);
if(CheckError(result, 0))
return NULL;
return sound;
}
FMOD::Sound * SoundStream::Open(const String &stream, int mode)
{
return Open(~stream, mode);
}
void SoundStream::Close(FMOD::Sound *& sound)
{
if(sound)
{
result = sound->release();
sound = NULL;
CheckError(result, 0);
}
}
void SoundStream::Close()
{
Close(sound);
}
int SoundStream::GetMsLen()
{
return GetLen(track_number < 0 ? sound : track, FMOD_TIMEUNIT_MS);
}
int SoundStream::GetByteLen()
{
return GetLen(track_number < 0 ? sound : track, FMOD_TIMEUNIT_RAWBYTES);
}
int SoundStream::GetLen(FMOD::Sound * sound, int unit)
{
unsigned int len;
sound->getLength(&len, unit);
length = len;
return len;
}
int SoundStream::GetPos(FMOD::Channel * channel, int unit /* = FMOD_TIMEUNIT_MS*/)
{
unsigned int pos;
channel->getPosition(&pos, unit);
return pos;
}
void SoundStream::SetPos(FMOD::Channel * channel, int pos, int unit /* = FMOD_TIMEUNIT_MS*/)
{
channel->setPosition(pos, unit);
}
void SoundStream::GetFormat()
{
sound->getFormat(&type, &format, &channels, &bits);
}
void SoundStream::SetTrack(int n)
{
sound->getSubSound(n, &track);
}
int SoundStream::GetTracksCount()
{
int tracks;
sound->getNumSubSounds(&tracks);
return tracks;
}