[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26693] trunk/blender: 2.5 Audio:

Joerg Mueller nexyon at gmail.com
Mon Feb 8 00:41:17 CET 2010


Revision: 26693
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26693
Author:   nexyon
Date:     2010-02-08 00:41:17 +0100 (Mon, 08 Feb 2010)

Log Message:
-----------
2.5 Audio:

- recode of the whole sequencer audio handling
- encode audio flag removed, instead you choose None as audio codec, added None for video codec too
- ffmpeg formats/codecs: enabled: theora, ogg, vorbis; added: matroska, flac (not working, who can fix?), mp3, wav
- sequencer wave drawing
- volume animation (now also working when mixing down to a file!)
- made sequencer strip position and length values unanimatable

Modified Paths:
--------------
    trunk/blender/intern/audaspace/FX/AUD_LoopReader.cpp
    trunk/blender/intern/audaspace/FX/AUD_LoopReader.h
    trunk/blender/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
    trunk/blender/intern/audaspace/intern/AUD_C-API.cpp
    trunk/blender/intern/audaspace/intern/AUD_C-API.h
    trunk/blender/intern/audaspace/intern/AUD_Mixer.cpp
    trunk/blender/intern/audaspace/intern/AUD_Mixer.h
    trunk/blender/intern/audaspace/intern/AUD_SoftwareDevice.cpp
    trunk/blender/intern/audaspace/intern/AUD_Space.h
    trunk/blender/release/scripts/ui/properties_render.py
    trunk/blender/source/blender/blenkernel/BKE_sequencer.h
    trunk/blender/source/blender/blenkernel/BKE_sound.h
    trunk/blender/source/blender/blenkernel/BKE_writeffmpeg.h
    trunk/blender/source/blender/blenkernel/intern/scene.c
    trunk/blender/source/blender/blenkernel/intern/sequencer.c
    trunk/blender/source/blender/blenkernel/intern/sound.c
    trunk/blender/source/blender/blenkernel/intern/writeffmpeg.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/editors/animation/anim_ops.c
    trunk/blender/source/blender/editors/screen/screen_ops.c
    trunk/blender/source/blender/editors/sound/sound_ops.c
    trunk/blender/source/blender/editors/space_graph/graph_ops.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_add.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/makesdna/DNA_scene_types.h
    trunk/blender/source/blender/makesdna/DNA_sequence_types.h
    trunk/blender/source/blender/makesdna/DNA_sound_types.h
    trunk/blender/source/blender/makesrna/intern/rna_scene.c
    trunk/blender/source/blender/makesrna/intern/rna_sequencer.c
    trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SoundActuator.cpp

Added Paths:
-----------
    trunk/blender/intern/audaspace/intern/AUD_SequencerFactory.cpp
    trunk/blender/intern/audaspace/intern/AUD_SequencerFactory.h
    trunk/blender/intern/audaspace/intern/AUD_SequencerReader.cpp
    trunk/blender/intern/audaspace/intern/AUD_SequencerReader.h

Modified: trunk/blender/intern/audaspace/FX/AUD_LoopReader.cpp
===================================================================
--- trunk/blender/intern/audaspace/FX/AUD_LoopReader.cpp	2010-02-07 23:39:44 UTC (rev 26692)
+++ trunk/blender/intern/audaspace/FX/AUD_LoopReader.cpp	2010-02-07 23:41:17 UTC (rev 26693)
@@ -31,6 +31,7 @@
 AUD_LoopReader::AUD_LoopReader(AUD_IReader* reader, int loop) :
 		AUD_EffectReader(reader), m_loop(loop)
 {
+	m_samples = -1;
 	m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
 }
 
@@ -51,6 +52,7 @@
 	if(message.type == AUD_MSG_LOOP)
 	{
 		m_loop = message.loopcount;
+		m_samples = message.time * m_reader->getSpecs().rate;
 
 		m_reader->notify(message);
 
@@ -64,6 +66,13 @@
 	AUD_Specs specs = m_reader->getSpecs();
 	int samplesize = AUD_SAMPLE_SIZE(specs);
 
+	if(m_samples >= 0)
+	{
+		if(length > m_samples)
+			length = m_samples;
+		m_samples -= length;
+	}
+
 	int len = length;
 
 	m_reader->read(len, buffer);

Modified: trunk/blender/intern/audaspace/FX/AUD_LoopReader.h
===================================================================
--- trunk/blender/intern/audaspace/FX/AUD_LoopReader.h	2010-02-07 23:39:44 UTC (rev 26692)
+++ trunk/blender/intern/audaspace/FX/AUD_LoopReader.h	2010-02-07 23:41:17 UTC (rev 26693)
@@ -46,6 +46,11 @@
 	 */
 	int m_loop;
 
+	/**
+	 * The left samples.
+	 */
+	int m_samples;
+
 public:
 	/**
 	 * Creates a new loop reader.

Modified: trunk/blender/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
===================================================================
--- trunk/blender/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp	2010-02-07 23:39:44 UTC (rev 26692)
+++ trunk/blender/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp	2010-02-07 23:41:17 UTC (rev 26693)
@@ -180,7 +180,7 @@
 											 AUD_DEVICE_SAMPLE_SIZE(specs),
 											 specs.rate);
 
-								if(alGetError() != AL_NO_ERROR)
+								if((err = alGetError()) != AL_NO_ERROR)
 								{
 									sound->data_end = true;
 									break;
@@ -839,13 +839,14 @@
 
 			if(info != AL_PLAYING)
 			{
-				if(info != AL_STOPPED)
+				if(info == AL_PAUSED)
 					alSourceStop(alhandle->source);
 
-				alSourceUnqueueBuffers(alhandle->source,
-									   AUD_OPENAL_CYCLE_BUFFERS,
-									   alhandle->buffers);
-				if(alGetError() == AL_NO_ERROR)
+				alSourcei(alhandle->source, AL_BUFFER, 0);
+				alhandle->current = 0;
+
+				ALenum err;
+				if((err = alGetError()) == AL_NO_ERROR)
 				{
 					sample_t* buf;
 					int length;

Modified: trunk/blender/intern/audaspace/intern/AUD_C-API.cpp
===================================================================
--- trunk/blender/intern/audaspace/intern/AUD_C-API.cpp	2010-02-07 23:39:44 UTC (rev 26692)
+++ trunk/blender/intern/audaspace/intern/AUD_C-API.cpp	2010-02-07 23:41:17 UTC (rev 26693)
@@ -47,6 +47,7 @@
 #include "AUD_ReadDevice.h"
 #include "AUD_SourceCaps.h"
 #include "AUD_IReader.h"
+#include "AUD_SequencerFactory.h"
 
 #ifdef WITH_SDL
 #include "AUD_SDLDevice.h"
@@ -231,7 +232,7 @@
 	}
 }
 
-extern AUD_Sound* AUD_limitSound(AUD_Sound* sound, float start, float end)
+AUD_Sound* AUD_limitSound(AUD_Sound* sound, float start, float end)
 {
 	assert(sound);
 
@@ -273,13 +274,14 @@
 	}
 }
 
-int AUD_stopLoop(AUD_Handle* handle)
+int AUD_setLoop(AUD_Handle* handle, int loops, float time)
 {
 	if(handle)
 	{
 		AUD_Message message;
 		message.type = AUD_MSG_LOOP;
-		message.loopcount = 0;
+		message.loopcount = loops;
+		message.time = time;
 
 		try
 		{
@@ -537,14 +539,16 @@
 	}
 }
 
-AUD_Handle* AUD_playDevice(AUD_Device* device, AUD_Sound* sound)
+AUD_Handle* AUD_playDevice(AUD_Device* device, AUD_Sound* sound, float seek)
 {
 	assert(device);
 	assert(sound);
 
 	try
 	{
-		return device->play(sound);
+		AUD_Handle* handle = device->play(sound);
+		device->seek(handle, seek);
+		return handle;
 	}
 	catch(AUD_Exception)
 	{
@@ -663,3 +667,97 @@
 	*length = position;
 	return result;
 }
+
+AUD_Sound* AUD_createSequencer(void* data, AUD_volumeFunction volume)
+{
+	if(AUD_device)
+	{
+		return new AUD_SequencerFactory(AUD_device->getSpecs().specs, data, volume);
+	}
+	else
+	{
+		AUD_Specs specs;
+		specs.channels = AUD_CHANNELS_STEREO;
+		specs.rate = AUD_RATE_44100;
+		return new AUD_SequencerFactory(specs, data, volume);
+	}
+}
+
+void AUD_destroySequencer(AUD_Sound* sequencer)
+{
+	delete ((AUD_SequencerFactory*)sequencer);
+}
+
+AUD_SequencerEntry* AUD_addSequencer(AUD_Sound** sequencer, AUD_Sound* sound,
+								 float begin, float end, float skip, void* data)
+{
+	return ((AUD_SequencerFactory*)sequencer)->add((AUD_IFactory**) sound, begin, end, skip, data);
+}
+
+void AUD_removeSequencer(AUD_Sound* sequencer, AUD_SequencerEntry* entry)
+{
+	((AUD_SequencerFactory*)sequencer)->remove(entry);
+}
+
+void AUD_moveSequencer(AUD_Sound* sequencer, AUD_SequencerEntry* entry,
+				   float begin, float end, float skip)
+{
+	((AUD_SequencerFactory*)sequencer)->move(entry, begin, end, skip);
+}
+
+void AUD_muteSequencer(AUD_Sound* sequencer, AUD_SequencerEntry* entry, char mute)
+{
+	((AUD_SequencerFactory*)sequencer)->mute(entry, mute);
+}
+
+int AUD_readSound(AUD_Sound* sound, sample_t* buffer, int length)
+{
+	AUD_IReader* reader = sound->createReader();
+	AUD_DeviceSpecs specs;
+	sample_t* buf;
+
+	specs.specs = reader->getSpecs();
+	specs.channels = AUD_CHANNELS_MONO;
+	specs.format = AUD_FORMAT_FLOAT32;
+
+	AUD_ChannelMapperFactory mapper(reader, specs);
+
+	if(!reader || reader->getType() != AUD_TYPE_BUFFER)
+		return -1;
+
+	reader = mapper.createReader();
+
+	if(!reader)
+		return -1;
+
+	int len = reader->getLength();
+	float samplejump = (float)len / (float)length;
+	float min, max;
+
+	for(int i = 0; i < length; i++)
+	{
+		len = floor(samplejump * (i+1)) - floor(samplejump * i);
+		reader->read(len, buf);
+
+		if(len < 1)
+		{
+			length = i;
+			break;
+		}
+
+		max = min = *buf;
+		for(int j = 1; j < len; j++)
+		{
+			if(buf[j] < min)
+				min = buf[j];
+			if(buf[j] > max)
+				max = buf[j];
+			buffer[i * 2] = min;
+			buffer[i * 2 + 1] = max;
+		}
+	}
+
+	delete reader; AUD_DELETE("reader")
+
+	return length;
+}

Modified: trunk/blender/intern/audaspace/intern/AUD_C-API.h
===================================================================
--- trunk/blender/intern/audaspace/intern/AUD_C-API.h	2010-02-07 23:39:44 UTC (rev 26692)
+++ trunk/blender/intern/audaspace/intern/AUD_C-API.h	2010-02-07 23:41:17 UTC (rev 26693)
@@ -50,6 +50,8 @@
 	typedef void AUD_Sound;
 	typedef void AUD_Handle;
 	typedef void AUD_Device;
+	typedef void AUD_SequencerEntry;
+	typedef float (*AUD_volumeFunction)(void*, void*, float);
 #endif
 
 /**
@@ -143,11 +145,13 @@
 extern AUD_Sound* AUD_loopSound(AUD_Sound* sound);
 
 /**
- * Stops a looping sound when the current playback finishes.
+ * Sets a remaining loop count of a looping sound that currently plays.
  * \param handle The playback handle.
+ * \param loops The count of remaining loops, -1 for infinity.
+ * \param time The time after which playback should stop, -1 for infinity.
  * \return Whether the handle is valid.
  */
-extern int AUD_stopLoop(AUD_Handle* handle);
+extern int AUD_setLoop(AUD_Handle* handle, int loops, float time);
 
 /**
  * Rectifies a sound.
@@ -211,6 +215,7 @@
 
 /**
  * Retrieves the playback position of a handle.
+ * \param handle The handle to the sound.
  * \return The current playback position in seconds or 0.0 if the handle is
  *         invalid.
  */
@@ -318,9 +323,10 @@
  * Plays back a sound file through a read device.
  * \param device The read device.
  * \param sound The handle of the sound file.
+ * \param seek The position where the sound should be seeked to.
  * \return A handle to the played back sound.
  */
-extern AUD_Handle* AUD_playDevice(AUD_Device* device, AUD_Sound* sound);
+extern AUD_Handle* AUD_playDevice(AUD_Device* device, AUD_Sound* sound, float seek);
 
 /**
  * Sets the volume of a played back sound of a read device.
@@ -360,6 +366,23 @@
 								  float sthreshold, int samplerate,
 								  int* length);
 
+extern AUD_Sound* AUD_createSequencer(void* data, AUD_volumeFunction volume);
+
+extern void AUD_destroySequencer(AUD_Sound* sequencer);
+
+extern AUD_SequencerEntry* AUD_addSequencer(AUD_Sound** sequencer, AUD_Sound* sound,
+										float begin, float end, float skip, void* data);
+
+extern void AUD_removeSequencer(AUD_Sound* sequencer, AUD_SequencerEntry* entry);
+
+extern void AUD_moveSequencer(AUD_Sound* sequencer, AUD_SequencerEntry* entry,
+						  float begin, float end, float skip);
+
+extern void AUD_muteSequencer(AUD_Sound* sequencer, AUD_SequencerEntry* entry,
+						  char mute);
+
+extern int AUD_readSound(AUD_Sound* sound, sample_t* buffer, int length);
+
 #ifdef __cplusplus
 }
 #endif

Modified: trunk/blender/intern/audaspace/intern/AUD_Mixer.cpp
===================================================================
--- trunk/blender/intern/audaspace/intern/AUD_Mixer.cpp	2010-02-07 23:39:44 UTC (rev 26692)
+++ trunk/blender/intern/audaspace/intern/AUD_Mixer.cpp	2010-02-07 23:41:17 UTC (rev 26693)
@@ -68,6 +68,11 @@
 	return reader;
 }
 
+AUD_DeviceSpecs AUD_Mixer::getSpecs()
+{
+	return m_specs;
+}
+
 void AUD_Mixer::setSpecs(AUD_DeviceSpecs specs)
 {
 	m_specs = specs;
@@ -115,10 +120,11 @@
 	}
 }
 
-void AUD_Mixer::add(sample_t* buffer, int length, float volume)
+void AUD_Mixer::add(sample_t* buffer, int start, int length, float volume)
 {
 	AUD_MixerBuffer buf;
 	buf.buffer = buffer;
+	buf.start = start;
 	buf.length = length;
 	buf.volume = volume;
 	m_buffers.push_back(buf);
@@ -145,11 +151,11 @@
 		buf = m_buffers.front();
 		m_buffers.pop_front();
 
-		end = buf.length*channels;
+		end = buf.length * channels;
 		in = buf.buffer;
 
 		for(int i = 0; i < end; i++)
-			out[i] += in[i]*buf.volume * volume;
+			out[i + buf.start * channels] += in[i] * buf.volume * volume;
 	}
 
 	m_convert(buffer, (data_t*) out, length * channels);

Modified: trunk/blender/intern/audaspace/intern/AUD_Mixer.h
===================================================================
--- trunk/blender/intern/audaspace/intern/AUD_Mixer.h	2010-02-07 23:39:44 UTC (rev 26692)
+++ trunk/blender/intern/audaspace/intern/AUD_Mixer.h	2010-02-07 23:41:17 UTC (rev 26693)
@@ -37,6 +37,7 @@
 struct AUD_MixerBuffer
 {
 	sample_t* buffer;
+	int start;
 	int length;
 	float volume;
 };
@@ -99,6 +100,12 @@
 	AUD_IReader* prepare(AUD_IReader* reader);
 
 	/**
+	 * Returns the target specification for superposing.
+	 * \return The target specification.
+	 */
+	AUD_DeviceSpecs getSpecs();
+
+	/**
 	 * Sets the target specification for superposing.

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list