[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21529] branches/soundsystem: BGE now uses the audaspace library for sound output.
Jörg Müller
nexyon at gmail.com
Sat Jul 11 17:07:36 CEST 2009
Revision: 21529
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21529
Author: nexyon
Date: 2009-07-11 17:07:36 +0200 (Sat, 11 Jul 2009)
Log Message:
-----------
BGE now uses the audaspace library for sound output. 3D sound and several settings have been lost for the moment.
Modified Paths:
--------------
branches/soundsystem/intern/audaspace/AUD_C-API.h
branches/soundsystem/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp
branches/soundsystem/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.h
branches/soundsystem/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp
branches/soundsystem/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h
branches/soundsystem/intern/audaspace/intern/AUD_C-API.cpp
branches/soundsystem/source/blender/windowmanager/CMakeLists.txt
branches/soundsystem/source/blender/windowmanager/SConscript
branches/soundsystem/source/blender/windowmanager/intern/wm_init_exit.c
branches/soundsystem/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
branches/soundsystem/source/gameengine/Converter/BL_BlenderDataConversion.cpp
branches/soundsystem/source/gameengine/Converter/CMakeLists.txt
branches/soundsystem/source/gameengine/Converter/KX_ConvertActuators.cpp
branches/soundsystem/source/gameengine/Converter/SConscript
branches/soundsystem/source/gameengine/Ketsji/CMakeLists.txt
branches/soundsystem/source/gameengine/Ketsji/KX_CDActuator.cpp
branches/soundsystem/source/gameengine/Ketsji/KX_CDActuator.h
branches/soundsystem/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
branches/soundsystem/source/gameengine/Ketsji/KX_KetsjiEngine.h
branches/soundsystem/source/gameengine/Ketsji/KX_PythonInit.cpp
branches/soundsystem/source/gameengine/Ketsji/KX_Scene.cpp
branches/soundsystem/source/gameengine/Ketsji/KX_Scene.h
branches/soundsystem/source/gameengine/Ketsji/KX_SoundActuator.cpp
branches/soundsystem/source/gameengine/Ketsji/KX_SoundActuator.h
branches/soundsystem/source/gameengine/Ketsji/SConscript
Modified: branches/soundsystem/intern/audaspace/AUD_C-API.h
===================================================================
--- branches/soundsystem/intern/audaspace/AUD_C-API.h 2009-07-11 14:51:13 UTC (rev 21528)
+++ branches/soundsystem/intern/audaspace/AUD_C-API.h 2009-07-11 15:07:36 UTC (rev 21529)
@@ -30,17 +30,17 @@
extern "C" {
#endif
-#include "AUD_Space.h"
+#include "intern/AUD_Space.h"
-//#ifndef AUD_CAPI_IMPLEMENTATION
-typedef struct AUD_Sound;
-//#endif
+#ifndef AUD_CAPI_IMPLEMENTATION
+ typedef struct {} AUD_Sound;
+#endif
/**
* Initializes an audio device.
* \return Whether the device has been initialized.
*/
-extern bool AUD_init();
+extern int AUD_init();
/**
* Unitinitializes an audio device.
@@ -55,6 +55,14 @@
extern AUD_Sound* AUD_load(const char* filename);
/**
+ * Loads a sound file.
+ * \param buffer The buffer which contains the sound file.
+ * \param size The size of the buffer.
+ * \return A handle of the sound file.
+ */
+extern AUD_Sound* AUD_loadBuffer(unsigned char* buffer, int size);
+
+/**
* Unloads a sound file.
* \param sound The handle of the sound file.
*/
@@ -71,29 +79,29 @@
* \return A handle to the played back sound.
*/
extern AUD_Handle* AUD_play(AUD_Sound* sound,
- AUD_EndBehaviour endBehaviour = AUD_BEHAVIOUR_STOP,
- double seekTo = 0);
+ AUD_EndBehaviour endBehaviour,
+ double seekTo);
/**
* Pauses a played back sound.
* \param handle The handle to the sound.
* \return Whether the handle has been playing or not.
*/
-extern bool AUD_pause(AUD_Handle* handle);
+extern int AUD_pause(AUD_Handle* handle);
/**
* Resumes a paused sound.
* \param handle The handle to the sound.
* \return Whether the handle has been paused or not.
*/
-extern bool AUD_resume(AUD_Handle* handle);
+extern int AUD_resume(AUD_Handle* handle);
/**
* Stops a playing or paused sound.
* \param handle The handle to the sound.
* \return Whether the handle has been valid or not.
*/
-extern bool AUD_stop(AUD_Handle* handle);
+extern int AUD_stop(AUD_Handle* handle);
/**
* Sets the end behaviour of a playing or paused sound.
@@ -101,7 +109,7 @@
* \param endBehaviour The behaviour after the end of the file has been reached.
* \return Whether the handle has been valid or not.
*/
-extern bool AUD_setEndBehaviour(AUD_Handle* handle,
+extern int AUD_setEndBehaviour(AUD_Handle* handle,
AUD_EndBehaviour endBehaviour);
/**
@@ -112,7 +120,7 @@
* before playback starts.
* \return Whether the handle has been valid or not.
*/
-extern bool AUD_seek(AUD_Handle* handle, int seekTo);
+extern int AUD_seek(AUD_Handle* handle, int seekTo);
/**
* Returns the status of a playing, paused or stopped sound.
Modified: branches/soundsystem/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp
===================================================================
--- branches/soundsystem/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp 2009-07-11 14:51:13 UTC (rev 21528)
+++ branches/soundsystem/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp 2009-07-11 15:07:36 UTC (rev 21529)
@@ -27,16 +27,43 @@
#include "AUD_FFMPEGReader.h"
#include "AUD_Space.h"
+extern "C" {
+#include <libavformat/avformat.h>
+}
+
AUD_FFMPEGFactory::AUD_FFMPEGFactory(const char* filename)
{
- m_filename = filename;
+ m_filename = new char[strlen(filename)+1];
+ strcpy(m_filename, filename);
+ m_buffer = 0;
+ m_size = 0;
}
+AUD_FFMPEGFactory::AUD_FFMPEGFactory(unsigned char* buffer, int size)
+{
+ m_filename = 0;
+ m_buffer = (unsigned char*)av_malloc(size);
+ m_size = size;
+ memcpy(m_buffer, buffer, size);
+}
+
+AUD_FFMPEGFactory::~AUD_FFMPEGFactory()
+{
+ if(m_filename)
+ delete[] m_filename;
+ if(m_buffer)
+ av_free(m_buffer);
+}
+
AUD_IReader* AUD_FFMPEGFactory::createReader()
{
try
{
- AUD_IReader* reader = new AUD_FFMPEGReader(m_filename);
+ AUD_IReader* reader;
+ if(m_filename)
+ reader = new AUD_FFMPEGReader(m_filename);
+ else
+ reader = new AUD_FFMPEGReader(m_buffer, m_size);
AUD_NEW("reader")
return reader;
}
Modified: branches/soundsystem/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.h
===================================================================
--- branches/soundsystem/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.h 2009-07-11 14:51:13 UTC (rev 21528)
+++ branches/soundsystem/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.h 2009-07-11 15:07:36 UTC (rev 21529)
@@ -39,8 +39,18 @@
/**
* The filename of the sound source file.
*/
- const char* m_filename;
+ char* m_filename;
+ /**
+ * The buffer to read from.
+ */
+ unsigned char* m_buffer;
+
+ /**
+ * The size of the buffer.
+ */
+ int m_size;
+
public:
/**
* Creates a new factory.
@@ -48,6 +58,18 @@
*/
AUD_FFMPEGFactory(const char* filename);
+ /**
+ * Creates a new factory.
+ * \param buffer The buffer to read from.
+ * \param size The size of the buffer.
+ */
+ AUD_FFMPEGFactory(unsigned char* buffer, int size);
+
+ /**
+ * Destroys the factory.
+ */
+ ~AUD_FFMPEGFactory();
+
virtual AUD_IReader* createReader();
};
Modified: branches/soundsystem/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp
===================================================================
--- branches/soundsystem/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp 2009-07-11 14:51:13 UTC (rev 21528)
+++ branches/soundsystem/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp 2009-07-11 15:07:36 UTC (rev 21529)
@@ -55,6 +55,7 @@
{
m_position = 0;
m_pkgbuf_left = 0;
+ m_byteiocontext = NULL;
// open file
if(av_open_input_file(&m_formatCtx, filename, NULL, 0, NULL)!=0)
@@ -106,11 +107,85 @@
m_pkgbuf = new AUD_Buffer(AVCODEC_MAX_AUDIO_FRAME_SIZE<<1);
}
+AUD_FFMPEGReader::AUD_FFMPEGReader(unsigned char* buffer, int size)
+{
+ m_position = 0;
+ m_pkgbuf_left = 0;
+ m_byteiocontext = (ByteIOContext*)av_mallocz(sizeof(ByteIOContext));
+
+ if(init_put_byte(m_byteiocontext, buffer, size, 0,
+ NULL, NULL, NULL, NULL) != 0)
+ AUD_THROW(AUD_ERROR_FILE);
+
+ AVProbeData probe_data;
+ probe_data.filename = "";
+ probe_data.buf = buffer;
+ probe_data.buf_size = size;
+ AVInputFormat* fmt = av_probe_input_format(&probe_data, 1);
+
+ // open stream
+ if(av_open_input_stream(&m_formatCtx, m_byteiocontext, "", fmt, NULL)!=0)
+ AUD_THROW(AUD_ERROR_FILE);
+
+ try
+ {
+ if(av_find_stream_info(m_formatCtx)<0)
+ AUD_THROW(AUD_ERROR_FFMPEG);
+
+ // XXX this prints stream information to stdout:
+ //dump_format(m_formatCtx, 0, NULL, 0);
+
+ // find audio stream and codec
+ m_stream = -1;
+
+ for(int i = 0; i < m_formatCtx->nb_streams; i++)
+ if((m_formatCtx->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO)
+ && (m_stream < 0))
+ {
+ m_stream=i;
+ break;
+ }
+ if(m_stream == -1)
+ AUD_THROW(AUD_ERROR_FFMPEG);
+
+ m_codecCtx = m_formatCtx->streams[m_stream]->codec;
+
+ m_specs.channels = (AUD_Channels) m_codecCtx->channels;
+ m_specs.format = FFMPEG_TO_AUD(m_codecCtx->sample_fmt);
+ m_specs.rate = (AUD_SampleRate) m_codecCtx->sample_rate;
+
+ // get a decoder and open it
+ AVCodec *aCodec = avcodec_find_decoder(m_codecCtx->codec_id);
+ if(!aCodec)
+ AUD_THROW(AUD_ERROR_FFMPEG);
+
+ if(avcodec_open(m_codecCtx, aCodec)<0)
+ AUD_THROW(AUD_ERROR_FFMPEG);
+ }
+ catch(AUD_Exception e)
+ {
+ av_close_input_stream(m_formatCtx);
+ delete m_byteiocontext;
+ throw;
+ }
+
+ // last but not least if there hasn't been any error, create the buffers
+ m_buffer = new AUD_Buffer(0); AUD_NEW("buffer")
+ m_pkgbuf = new AUD_Buffer(AVCODEC_MAX_AUDIO_FRAME_SIZE<<1);
+}
+
AUD_FFMPEGReader::~AUD_FFMPEGReader()
{
- // close the file
avcodec_close(m_codecCtx);
- av_close_input_file(m_formatCtx);
+
+ if(m_byteiocontext)
+ {
+ av_close_input_stream(m_formatCtx);
+ av_free(m_byteiocontext);
+ }
+ else
+ av_close_input_file(m_formatCtx);
+
delete m_buffer; AUD_DELETE("buffer")
delete m_pkgbuf;
}
Modified: branches/soundsystem/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h
===================================================================
--- branches/soundsystem/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h 2009-07-11 14:51:13 UTC (rev 21528)
+++ branches/soundsystem/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h 2009-07-11 15:07:36 UTC (rev 21529)
@@ -28,8 +28,10 @@
#include "AUD_IReader.h"
class AUD_Buffer;
-struct AVFormatContext;
struct AVCodecContext;
+extern "C" {
+#include <libavformat/avformat.h>
+}
/**
* This class reads a sound file via ffmpeg.
@@ -80,6 +82,11 @@
AVCodecContext* m_codecCtx;
/**
+ * The ByteIOContext to read the data from.
+ */
+ ByteIOContext* m_byteiocontext;
+
+ /**
* The stream ID in the file.
*/
int m_stream;
@@ -94,6 +101,15 @@
AUD_FFMPEGReader(const char* filename);
/**
+ * Creates a new reader.
+ * \param buffer The buffer to read from.
+ * \param size The size of the buffer.
+ * \exception AUD_Exception Thrown if the buffer specified cannot be read
+ * with ffmpeg.
+ */
+ AUD_FFMPEGReader(unsigned char* buffer, int size);
+
+ /**
* Destroys the reader and closes the file.
*/
virtual ~AUD_FFMPEGReader();
Modified: branches/soundsystem/intern/audaspace/intern/AUD_C-API.cpp
===================================================================
--- branches/soundsystem/intern/audaspace/intern/AUD_C-API.cpp 2009-07-11 14:51:13 UTC (rev 21528)
+++ branches/soundsystem/intern/audaspace/intern/AUD_C-API.cpp 2009-07-11 15:07:36 UTC (rev 21529)
@@ -23,8 +23,6 @@
* ***** END LGPL LICENSE BLOCK *****
*/
-//#define AUD_CAPI_IMPLEMENTATION
-//#include "AUD_C-API.h"
#include "AUD_FFMPEGFactory.h"
#include "AUD_SDLDevice.h"
@@ -35,9 +33,12 @@
typedef AUD_IFactory AUD_Sound;
+#define AUD_CAPI_IMPLEMENTATION
+#include "AUD_C-API.h"
+
static AUD_IDevice* AUD_device = NULL;
-bool AUD_init()
+int AUD_init()
{
av_register_all();
try
@@ -63,6 +64,12 @@
return new AUD_FFMPEGFactory(filename);
}
+AUD_Sound* AUD_loadBuffer(unsigned char* buffer, int size)
+{
+ assert(buffer);
+ return new AUD_FFMPEGFactory(buffer, size);
+}
+
void AUD_unload(AUD_Sound* sound)
{
assert(sound);
@@ -86,32 +93,32 @@
}
}
-bool AUD_pause(AUD_Handle* handle)
+int AUD_pause(AUD_Handle* handle)
{
assert(AUD_device);
return AUD_device->pause(handle);
}
-bool AUD_resume(AUD_Handle* handle)
+int AUD_resume(AUD_Handle* handle)
{
assert(AUD_device);
return AUD_device->resume(handle);
}
-bool AUD_stop(AUD_Handle* handle)
+int AUD_stop(AUD_Handle* handle)
{
assert(AUD_device);
return AUD_device->stop(handle);
}
-bool AUD_setEndBehaviour(AUD_Handle* handle,
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list