Permalink
Browse files

Implement an Audiere-based decoder

  • Loading branch information...
1 parent 2147210 commit 63e0e820499757a6bbbbf453778756f3e430a455 @kcat kcat committed Apr 1, 2012
View
@@ -28,6 +28,7 @@ option(OGRE_STATIC "Link static build of Ogre and Ogre Plugins into the binaries
# Sound source selection
option(USE_FFMPEG "use ffmpeg for sound" OFF)
+option(USE_AUDIERE "use audiere for sound" OFF)
option(USE_MPG123 "use mpg123 + libsndfile for sound" ON)
find_program(DPKG_PROGRAM dpkg DOC "dpkg program of Debian-based systems")
@@ -133,6 +134,13 @@ if (USE_FFMPEG)
set(SOUND_DEFINE ${SOUND_DEFINE} -DOPENMW_USE_FFMPEG)
endif (USE_FFMPEG)
+if (USE_AUDIERE)
+ find_package(Audiere REQUIRED)
+ set(SOUND_INPUT_INCLUDES ${SOUND_INPUT_INCLUDES} ${AUDIERE_INCLUDE_DIR})
+ set(SOUND_INPUT_LIBRARY ${SOUND_INPUT_LIBRARY} ${AUDIERE_LIBRARY})
+ set(SOUND_DEFINE ${SOUND_DEFINE} -DOPENMW_USE_AUDIERE)
+endif (USE_AUDIERE)
+
if (USE_MPG123)
find_package(MPG123 REQUIRED)
find_package(SNDFILE REQUIRED)
@@ -39,7 +39,7 @@ add_openmw_dir (mwscript
)
add_openmw_dir (mwsound
- soundmanager openal_output mpgsnd_decoder ffmpeg_decoder
+ soundmanager openal_output audiere_decoder mpgsnd_decoder ffmpeg_decoder
)
add_openmw_dir (mwworld
@@ -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
@@ -18,8 +18,8 @@
#include "openal_output.hpp"
#define SOUND_OUT "OpenAL"
-/* Set up the sound manager to use FFMPEG or MPG123+libsndfile for input. The
- * OPENMW_USE_x macros are set in CMakeLists.txt.
+/* Set up the sound manager to use FFMPEG, MPG123+libsndfile, or Audiere for
+ * input. The OPENMW_USE_x macros are set in CMakeLists.txt.
*/
#ifdef OPENMW_USE_FFMPEG
#include "ffmpeg_decoder.hpp"
@@ -28,6 +28,13 @@
#endif
#endif
+#ifdef OPENMW_USE_AUDIERE
+#include "audiere_decoder.hpp"
+#ifndef SOUND_IN
+#define SOUND_IN "Audiere"
+#endif
+#endif
+
#ifdef OPENMW_USE_MPG123
#include "mpgsnd_decoder.hpp"
#ifndef SOUND_IN

0 comments on commit 63e0e82

Please sign in to comment.