[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