Audaspace:
authorJoerg Mueller <nexyon@gmail.com>
Fri, 18 Feb 2011 23:50:27 +0000 (23:50 +0000)
committerJoerg Mueller <nexyon@gmail.com>
Fri, 18 Feb 2011 23:50:27 +0000 (23:50 +0000)
* Adding play method to the device classes to play back a reader (not used yet, preparation for a later feature).
* Using a linear resampler in case SRC is disabled.

intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
intern/audaspace/OpenAL/AUD_OpenALDevice.h
intern/audaspace/intern/AUD_DefaultMixer.cpp
intern/audaspace/intern/AUD_IDevice.h
intern/audaspace/intern/AUD_NULLDevice.cpp
intern/audaspace/intern/AUD_NULLDevice.h
intern/audaspace/intern/AUD_SoftwareDevice.cpp
intern/audaspace/intern/AUD_SoftwareDevice.h

index 2873b68ce4739992b3dbc0c155fab2a6bb142c28..94cac65d1fbb4ce2f9d54f1946d03afc4b189f22 100644 (file)
@@ -534,81 +534,10 @@ static const char* queue_error = "AUD_OpenALDevice: Buffer couldn't be "
 static const char* bufferdata_error = "AUD_OpenALDevice: Buffer couldn't be "
                                                                          "filled with data.";
 
-AUD_Handle* AUD_OpenALDevice::play(AUD_IFactory* factory, bool keep)
+AUD_Handle* AUD_OpenALDevice::play(AUD_IReader* reader, bool keep)
 {
-       lock();
-
        AUD_OpenALHandle* sound = NULL;
 
-       try
-       {
-               // check if it is a buffered factory
-               for(AUD_BFIterator i = m_bufferedFactories->begin();
-                       i != m_bufferedFactories->end(); i++)
-               {
-                       if((*i)->factory == factory)
-                       {
-                               // create the handle
-                               sound = new AUD_OpenALHandle;
-                               sound->keep = keep;
-                               sound->current = -1;
-                               sound->isBuffered = true;
-                               sound->data_end = true;
-                               sound->loopcount = 0;
-                               sound->stop = NULL;
-                               sound->stop_data = NULL;
-
-                               alcSuspendContext(m_context);
-
-                               // OpenAL playback code
-                               try
-                               {
-                                       alGenSources(1, &sound->source);
-                                       if(alGetError() != AL_NO_ERROR)
-                                               AUD_THROW(AUD_ERROR_OPENAL, gensource_error);
-
-                                       try
-                                       {
-                                               alSourcei(sound->source, AL_BUFFER, (*i)->buffer);
-                                               if(alGetError() != AL_NO_ERROR)
-                                                       AUD_THROW(AUD_ERROR_OPENAL, queue_error);
-                                       }
-                                       catch(AUD_Exception&)
-                                       {
-                                               alDeleteSources(1, &sound->source);
-                                               throw;
-                                       }
-                               }
-                               catch(AUD_Exception&)
-                               {
-                                       delete sound;
-                                       alcProcessContext(m_context);
-                                       throw;
-                               }
-
-                               // play sound
-                               m_playingSounds->push_back(sound);
-
-                               alSourcei(sound->source, AL_SOURCE_RELATIVE, 1);
-                               start();
-
-                               alcProcessContext(m_context);
-                       }
-               }
-       }
-       catch(AUD_Exception&)
-       {
-               unlock();
-               throw;
-       }
-
-       unlock();
-
-       if(sound)
-               return sound;
-
-       AUD_IReader* reader = factory->createReader();
-
        AUD_DeviceSpecs specs = m_specs;
        specs.specs = reader->getSpecs();
 
@@ -708,6 +637,82 @@ AUD_Handle* AUD_OpenALDevice::play(AUD_IFactory* factory, bool keep)
        return sound;
 }
 
+AUD_Handle* AUD_OpenALDevice::play(AUD_IFactory* factory, bool keep)
+{
+       AUD_OpenALHandle* sound = NULL;
+
+       lock();
+
+       try
+       {
+               // check if it is a buffered factory
+               for(AUD_BFIterator i = m_bufferedFactories->begin();
+                       i != m_bufferedFactories->end(); i++)
+               {
+                       if((*i)->factory == factory)
+                       {
+                               // create the handle
+                               sound = new AUD_OpenALHandle;
+                               sound->keep = keep;
+                               sound->current = -1;
+                               sound->isBuffered = true;
+                               sound->data_end = true;
+                               sound->loopcount = 0;
+                               sound->stop = NULL;
+                               sound->stop_data = NULL;
+
+                               alcSuspendContext(m_context);
+
+                               // OpenAL playback code
+                               try
+                               {
+                                       alGenSources(1, &sound->source);
+                                       if(alGetError() != AL_NO_ERROR)
+                                               AUD_THROW(AUD_ERROR_OPENAL, gensource_error);
+
+                                       try
+                                       {
+                                               alSourcei(sound->source, AL_BUFFER, (*i)->buffer);
+                                               if(alGetError() != AL_NO_ERROR)
+                                                       AUD_THROW(AUD_ERROR_OPENAL, queue_error);
+                                       }
+                                       catch(AUD_Exception&)
+                                       {
+                                               alDeleteSources(1, &sound->source);
+                                               throw;
+                                       }
+                               }
+                               catch(AUD_Exception&)
+                               {
+                                       delete sound;
+                                       alcProcessContext(m_context);
+                                       throw;
+                               }
+
+                               // play sound
+                               m_playingSounds->push_back(sound);
+
+                               alSourcei(sound->source, AL_SOURCE_RELATIVE, 1);
+                               start();
+
+                               alcProcessContext(m_context);
+                       }
+               }
+       }
+       catch(AUD_Exception&)
+       {
+               unlock();
+               throw;
+       }
+
+       unlock();
+
+       if(sound)
+               return sound;
+
+       return play(factory->createReader(), keep);
+}
+
 bool AUD_OpenALDevice::pause(AUD_Handle* handle)
 {
        bool result = false;
index e997c9df5adb5e4daf1f8d7aa65e005a52b67cc5..3965ff035337bdfc4c6e039c664d5790c0db6e36 100644 (file)
@@ -142,6 +142,7 @@ public:
        virtual ~AUD_OpenALDevice();
 
        virtual AUD_DeviceSpecs getSpecs() const;
+       virtual AUD_Handle* play(AUD_IReader* reader, bool keep = false);
        virtual AUD_Handle* play(AUD_IFactory* factory, bool keep = false);
        virtual bool pause(AUD_Handle* handle);
        virtual bool resume(AUD_Handle* handle);
index 495bdd7694e43e0c2137b5d34c393fdcc235a94b..d1b22df6f62d947013f9406bd19a3f5136d5c1ee 100644 (file)
@@ -27,6 +27,8 @@
 #include "AUD_DefaultMixer.h"
 #ifdef WITH_SAMPLERATE
 #include "AUD_SRCResampleReader.h"
+#else
+#include "AUD_LinearResampleReader.h"
 #endif
 #include "AUD_ChannelMapperReader.h"
 #include "AUD_ChannelMapperFactory.h"
@@ -53,10 +55,12 @@ AUD_IReader* AUD_DefaultMixer::prepare(AUD_IReader* reader)
                specs.channels = m_specs.channels;
        }
 
-#ifdef WITH_SAMPLERATE
        // resample
        if(specs.rate != m_specs.rate)
+#ifdef WITH_SAMPLERATE
                reader = new AUD_SRCResampleReader(reader, m_specs.specs);
+#else
+               reader = new AUD_LinearResampleReader(reader, m_specs.specs);
 #endif
        
        // rechannel
index 56e874019b242e87a513648fa8c0c9793a7fa2e2..81a4653c7e9898bf4fc897686fbe60021f29adc1 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "AUD_Space.h"
 class AUD_IFactory;
+class AUD_IReader;
 
 /// Handle structure, for inherition.
 struct AUD_Handle
@@ -58,6 +59,18 @@ public:
         */
        virtual AUD_DeviceSpecs getSpecs() const=0;
 
+       /**
+        * Plays a sound source.
+        * \param reader The reader to play.
+        * \param keep When keep is true the sound source will not be deleted but
+        *             set to paused when its end has been reached.
+        * \return Returns a handle with which the playback can be controlled.
+        *         This is NULL if the sound couldn't be played back.
+        * \exception AUD_Exception Thrown if there's an unexpected (from the
+        *            device side) error during creation of the reader.
+        */
+       virtual AUD_Handle* play(AUD_IReader* reader, bool keep = false)=0;
+
        /**
         * Plays a sound source.
         * \param factory The factory to create the reader for the sound source.
index ecd40e126fb7a6416f4835a932ab5444f4af1982..2a8565054c626bf6eb6d07ae7a138fc2b259b18a 100644 (file)
@@ -43,6 +43,11 @@ AUD_DeviceSpecs AUD_NULLDevice::getSpecs() const
        return specs;
 }
 
+AUD_Handle* AUD_NULLDevice::play(AUD_IReader* reader, bool keep)
+{
+       return 0;
+}
+
 AUD_Handle* AUD_NULLDevice::play(AUD_IFactory* factory, bool keep)
 {
        return 0;
index 41a95f8feaa636e7437984833269f7c99ce62361..c093a7a681e6ab2106bec6d6e9d8743420db5b65 100644 (file)
@@ -41,6 +41,7 @@ public:
        AUD_NULLDevice();
 
        virtual AUD_DeviceSpecs getSpecs() const;
+       virtual AUD_Handle* play(AUD_IReader* reader, bool keep = false);
        virtual AUD_Handle* play(AUD_IFactory* factory, bool keep = false);
        virtual bool pause(AUD_Handle* handle);
        virtual bool resume(AUD_Handle* handle);
index 9feaf169d8b33b7f48e324099b3292d5b0509b75..02579719ffb0ad2cef96ad2be3ca340b56e41380 100644 (file)
@@ -208,10 +208,8 @@ AUD_DeviceSpecs AUD_SoftwareDevice::getSpecs() const
        return m_specs;
 }
 
-AUD_Handle* AUD_SoftwareDevice::play(AUD_IFactory* factory, bool keep)
+AUD_Handle* AUD_SoftwareDevice::play(AUD_IReader* reader, bool keep)
 {
-       AUD_IReader* reader = factory->createReader();
-
        // prepare the reader
        reader = m_mixer->prepare(reader);
        if(reader == NULL)
@@ -236,6 +234,11 @@ AUD_Handle* AUD_SoftwareDevice::play(AUD_IFactory* factory, bool keep)
        return sound;
 }
 
+AUD_Handle* AUD_SoftwareDevice::play(AUD_IFactory* factory, bool keep)
+{
+       return play(factory->createReader(), keep);
+}
+
 bool AUD_SoftwareDevice::pause(AUD_Handle* handle)
 {
        bool result = false;
index 90da9aca0b42052e8bae8a6060d54f2ea592db74..af0861b353ad3dc8c1435b580b5bab066a5b2f6b 100644 (file)
@@ -114,6 +114,7 @@ private:
 
 public:
        virtual AUD_DeviceSpecs getSpecs() const;
+       virtual AUD_Handle* play(AUD_IReader* reader, bool keep = false);
        virtual AUD_Handle* play(AUD_IFactory* factory, bool keep = false);
        virtual bool pause(AUD_Handle* handle);
        virtual bool resume(AUD_Handle* handle);