Merge branch 'master' into minimap
Conflicts: apps/openmw/mwscript/docs/vmformat.txtactorid
commit
e0631dd9be
@ -0,0 +1,122 @@
|
|||||||
|
#ifdef OPENMW_USE_AUDIERE
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "audiere_decoder.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
static void fail(const std::string &msg)
|
||||||
|
{ throw std::runtime_error("Audiere exception: "+msg); }
|
||||||
|
|
||||||
|
namespace MWSound
|
||||||
|
{
|
||||||
|
|
||||||
|
class OgreFile : public audiere::File
|
||||||
|
{
|
||||||
|
Ogre::DataStreamPtr mStream;
|
||||||
|
|
||||||
|
ADR_METHOD(int) read(void* buffer, int size)
|
||||||
|
{
|
||||||
|
return mStream->read(buffer, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
ADR_METHOD(bool) seek(int position, SeekMode mode)
|
||||||
|
{
|
||||||
|
if(mode == CURRENT)
|
||||||
|
mStream->seek(mStream->tell()+position);
|
||||||
|
else if(mode == BEGIN)
|
||||||
|
mStream->seek(position);
|
||||||
|
else if(mode == END)
|
||||||
|
mStream->seek(mStream->size()+position);
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ADR_METHOD(int) tell()
|
||||||
|
{
|
||||||
|
return mStream->tell();
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t refs;
|
||||||
|
virtual void ref() { ++refs; }
|
||||||
|
virtual void unref()
|
||||||
|
{
|
||||||
|
if(--refs == 0)
|
||||||
|
delete this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
OgreFile(const Ogre::DataStreamPtr &stream)
|
||||||
|
: mStream(stream), refs(1)
|
||||||
|
{ }
|
||||||
|
virtual ~OgreFile() { }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void Audiere_Decoder::open(const std::string &fname)
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
|
||||||
|
audiere::FilePtr file(new OgreFile(mResourceMgr.openResource(fname)));
|
||||||
|
mSoundSource = audiere::OpenSampleSource(file);
|
||||||
|
|
||||||
|
int channels, srate;
|
||||||
|
audiere::SampleFormat format;
|
||||||
|
|
||||||
|
mSoundSource->getFormat(channels, srate, format);
|
||||||
|
if(format == audiere::SF_S16)
|
||||||
|
mSampleType = SampleType_Int16;
|
||||||
|
else if(format == audiere::SF_U8)
|
||||||
|
mSampleType = SampleType_UInt8;
|
||||||
|
else
|
||||||
|
fail("Unsupported sample type");
|
||||||
|
|
||||||
|
if(channels == 1)
|
||||||
|
mChannelConfig = ChannelConfig_Mono;
|
||||||
|
else if(channels == 2)
|
||||||
|
mChannelConfig = ChannelConfig_Stereo;
|
||||||
|
else
|
||||||
|
fail("Unsupported channel count");
|
||||||
|
|
||||||
|
mSampleRate = srate;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Audiere_Decoder::close()
|
||||||
|
{
|
||||||
|
mSoundSource = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Audiere_Decoder::getInfo(int *samplerate, ChannelConfig *chans, SampleType *type)
|
||||||
|
{
|
||||||
|
*samplerate = mSampleRate;
|
||||||
|
*chans = mChannelConfig;
|
||||||
|
*type = mSampleType;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t Audiere_Decoder::read(char *buffer, size_t bytes)
|
||||||
|
{
|
||||||
|
int size = bytesToFrames(bytes, mChannelConfig, mSampleType);
|
||||||
|
size = mSoundSource->read(size, buffer);
|
||||||
|
return framesToBytes(size, mChannelConfig, mSampleType);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Audiere_Decoder::rewind()
|
||||||
|
{
|
||||||
|
mSoundSource->reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
Audiere_Decoder::Audiere_Decoder()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Audiere_Decoder::~Audiere_Decoder()
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,42 @@
|
|||||||
|
#ifndef GAME_SOUND_AUDIERE_DECODER_H
|
||||||
|
#define GAME_SOUND_AUDIERE_DECODER_H
|
||||||
|
|
||||||
|
#include <OgreDataStream.h>
|
||||||
|
|
||||||
|
#include "audiere.h"
|
||||||
|
|
||||||
|
#include "sound_decoder.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
namespace MWSound
|
||||||
|
{
|
||||||
|
class Audiere_Decoder : public Sound_Decoder
|
||||||
|
{
|
||||||
|
audiere::SampleSourcePtr mSoundSource;
|
||||||
|
int mSampleRate;
|
||||||
|
SampleType mSampleType;
|
||||||
|
ChannelConfig mChannelConfig;
|
||||||
|
|
||||||
|
virtual void open(const std::string &fname);
|
||||||
|
virtual void close();
|
||||||
|
|
||||||
|
virtual void getInfo(int *samplerate, ChannelConfig *chans, SampleType *type);
|
||||||
|
|
||||||
|
virtual size_t read(char *buffer, size_t bytes);
|
||||||
|
virtual void rewind();
|
||||||
|
|
||||||
|
Audiere_Decoder& operator=(const Audiere_Decoder &rhs);
|
||||||
|
Audiere_Decoder(const Audiere_Decoder &rhs);
|
||||||
|
|
||||||
|
Audiere_Decoder();
|
||||||
|
public:
|
||||||
|
virtual ~Audiere_Decoder();
|
||||||
|
|
||||||
|
friend class SoundManager;
|
||||||
|
};
|
||||||
|
#ifndef DEFAULT_DECODER
|
||||||
|
#define DEFAULT_DECODER (::MWSound::Audiere_Decoder)
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue