Revision: 21863 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21863 Author: nexyon Date: 2009-07-24 20:28:09 +0200 (Fri, 24 Jul 2009)
Log Message: ----------- Initial (ugly) sequencer sound support. Modified Paths: -------------- branches/soundsystem/intern/audaspace/AUD_C-API.h branches/soundsystem/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp branches/soundsystem/intern/audaspace/intern/AUD_BufferReader.cpp branches/soundsystem/intern/audaspace/intern/AUD_C-API.cpp branches/soundsystem/source/blender/blenkernel/BKE_sequence.h branches/soundsystem/source/blender/blenkernel/BKE_sound.h branches/soundsystem/source/blender/blenkernel/intern/sequence.c branches/soundsystem/source/blender/blenkernel/intern/sound.c branches/soundsystem/source/blender/blenloader/intern/readfile.c branches/soundsystem/source/blender/editors/CMakeLists.txt branches/soundsystem/source/blender/editors/animation/anim_ops.c branches/soundsystem/source/blender/editors/screen/screen_ops.c branches/soundsystem/source/blender/editors/space_sequencer/SConscript branches/soundsystem/source/blender/editors/space_sequencer/sequencer_add.c branches/soundsystem/source/blender/editors/space_sequencer/sequencer_draw.c Modified: branches/soundsystem/intern/audaspace/AUD_C-API.h =================================================================== --- branches/soundsystem/intern/audaspace/AUD_C-API.h 2009-07-24 17:17:04 UTC (rev 21862) +++ branches/soundsystem/intern/audaspace/AUD_C-API.h 2009-07-24 18:28:09 UTC (rev 21863) @@ -39,6 +39,12 @@ AUD_OPENAL_DEVICE } AUD_DeviceType; +typedef struct +{ + AUD_Specs specs; + float length; +} AUD_SoundInfo; + #ifndef AUD_CAPI_IMPLEMENTATION typedef void AUD_Sound; typedef void AUD_Handle; @@ -66,6 +72,13 @@ extern void AUD_exit(); /** + * Returns information about a sound. + * \param sound The sound to get the info about. + * \return The AUD_SoundInfo structure with filled in data. + */ +extern AUD_SoundInfo AUD_getInfo(AUD_Sound* sound); + +/** * Loads a sound file. * \param filename The filename of the sound file. * \return A handle of the sound file. @@ -174,11 +187,9 @@ * Seeks a playing or paused sound. * \param handle The handle to the sound. * \param seekTo From where the sound file should be played back in seconds. - * A negative value indicates the seconds that should be waited - * before playback starts. * \return Whether the handle has been valid or not. */ -extern int AUD_seek(AUD_Handle* handle, int seekTo); +extern int AUD_seek(AUD_Handle* handle, float seekTo); /** * Returns the status of a playing, paused or stopped sound. Modified: branches/soundsystem/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp =================================================================== --- branches/soundsystem/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp 2009-07-24 17:17:04 UTC (rev 21862) +++ branches/soundsystem/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp 2009-07-24 18:28:09 UTC (rev 21863) @@ -61,6 +61,9 @@ /// The first buffer to be read next. int current; + + /// Whether the stream doesn't return any more data. + bool data_end; }; struct AUD_OpenALBufferedFactory @@ -145,7 +148,7 @@ while(info--) { // if there's still data to play back - if(sound->current >= 0) + if(!sound->data_end) { // read data length = m_buffersize; @@ -154,7 +157,7 @@ // read nothing? if(length == 0) { - sound->current = -1; + sound->data_end = true; break; } @@ -164,7 +167,7 @@ ALenum err; if((err = alGetError()) != AL_NO_ERROR) { - sound->current = -1; + sound->data_end = true; break; } @@ -177,7 +180,7 @@ if(alGetError() != AL_NO_ERROR) { - sound->current = -1; + sound->data_end = true; break; } @@ -186,7 +189,7 @@ &sound->buffers[sound->current]); if(alGetError() != AL_NO_ERROR) { - sound->current = -1; + sound->data_end = true; break; } @@ -204,14 +207,11 @@ if(info == AL_STOPPED) { // if it really stopped - if(sound->current < 0) + if(sound->data_end) { // pause or if(sound->keep) - { - alSourceRewind(sound->source); pause(sound); - } // stop else stop(sound); @@ -332,7 +332,6 @@ delete sound; AUD_DELETE("handle") m_playingSounds->erase(m_playingSounds->begin()); } - delete m_playingSounds; AUD_DELETE("list") // delete all paused sounds while(!m_pausedSounds->empty()) @@ -347,7 +346,6 @@ delete sound; AUD_DELETE("handle") m_pausedSounds->erase(m_pausedSounds->begin()); } - delete m_pausedSounds; AUD_DELETE("list") // delete all buffered factories while(!m_bufferedFactories->empty()) @@ -356,11 +354,14 @@ delete *m_bufferedFactories->begin(); AUD_DELETE("bufferedfactory"); m_bufferedFactories->erase(m_bufferedFactories->begin()); } - delete m_bufferedFactories; AUD_DELETE("list") alcProcessContext(m_context); unlock(); + delete m_playingSounds; AUD_DELETE("list") + delete m_pausedSounds; AUD_DELETE("list") + delete m_bufferedFactories; AUD_DELETE("list") + // wait for the thread to stop if(m_thread != 0) pthread_join(m_thread, NULL); @@ -521,6 +522,7 @@ sound->keep = keep; sound->current = -1; sound->isBuffered = true; + sound->data_end = true; alcSuspendContext(m_context); @@ -598,6 +600,7 @@ sound->reader = reader; sound->current = 0; sound->isBuffered = false; + sound->data_end = false; valid &= getFormat(sound->format, specs); @@ -702,15 +705,30 @@ bool AUD_OpenALDevice::resume(AUD_Handle* handle) { + ALint info; + lock(); + // only songs that are paused can be resumed - lock(); for(AUD_HandleIterator i = m_pausedSounds->begin(); i != m_pausedSounds->end(); i++) { if(*i == handle) { m_playingSounds->push_back(*i); - alSourcePlay((*i)->source); + + alGetSourcei((*i)->source, AL_SOURCE_STATE, &info); + + switch(info) + { + case AL_PLAYING: + break; + case AL_STOPPED: +// alSourceRewind((*i)->source); + default: +// alSourcePlay((*i)->source); + break; + } + start(); m_pausedSounds->erase(i); unlock(); @@ -813,8 +831,11 @@ if(alhandle->isBuffered) alSourcef(alhandle->source, AL_SEC_OFFSET, position); else + { alhandle->reader->seek((int)(position * alhandle->reader->getSpecs().rate)); + alhandle->data_end = false; + } unlock(); return true; } @@ -1098,6 +1119,8 @@ alListenerfv(AL_POSITION, (ALfloat*)data.position); alListenerfv(AL_VELOCITY, (ALfloat*)data.velocity); alListenerfv(AL_ORIENTATION, (ALfloat*)&(data.orientation[3])); + + return true; } bool AUD_OpenALDevice::setSetting(AUD_3DSetting setting, float value) @@ -1162,8 +1185,6 @@ return std::numeric_limits<float>::quiet_NaN(); } -#include <stdio.h> - bool AUD_OpenALDevice::updateSource(AUD_Handle* handle, AUD_3DData &data) { lock(); Modified: branches/soundsystem/intern/audaspace/intern/AUD_BufferReader.cpp =================================================================== --- branches/soundsystem/intern/audaspace/intern/AUD_BufferReader.cpp 2009-07-24 17:17:04 UTC (rev 21862) +++ branches/soundsystem/intern/audaspace/intern/AUD_BufferReader.cpp 2009-07-24 18:28:09 UTC (rev 21863) @@ -45,7 +45,7 @@ if(position < 0) m_position = 0; else if(position > m_buffer.get()->getSize() / AUD_SAMPLE_SIZE(m_specs)) - position = m_buffer.get()->getSize() / AUD_SAMPLE_SIZE(m_specs); + m_position = m_buffer.get()->getSize() / AUD_SAMPLE_SIZE(m_specs); else m_position = position; } Modified: branches/soundsystem/intern/audaspace/intern/AUD_C-API.cpp =================================================================== --- branches/soundsystem/intern/audaspace/intern/AUD_C-API.cpp 2009-07-24 17:17:04 UTC (rev 21862) +++ branches/soundsystem/intern/audaspace/intern/AUD_C-API.cpp 2009-07-24 18:28:09 UTC (rev 21863) @@ -36,13 +36,8 @@ #include "AUD_LoopFactory.h" #include "AUD_ReadDevice.h" #include "AUD_SourceCaps.h" +#include "AUD_IReader.h" -/* -#define WITH_SDL -#define WITH_OPENAL -#define WITH_FFMPEG -//*/ - #ifdef WITH_SDL #include "AUD_SDLDevice.h" #include "AUD_FloatMixer.h" @@ -138,6 +133,30 @@ AUD_3ddevice = NULL; } +AUD_SoundInfo AUD_getInfo(AUD_Sound* sound) +{ + assert(sound); + + AUD_IReader* reader = sound->createReader(); + + AUD_SoundInfo info; + + if(reader) + { + info.specs = reader->getSpecs(); + info.length = reader->getLength() / (float) info.specs.rate; + } + else + { + info.specs.channels = AUD_CHANNELS_INVALID; + info.specs.format = AUD_FORMAT_INVALID; + info.specs.rate = AUD_RATE_INVALID; + info.length = 0.0; + } + + return info; +} + AUD_Sound* AUD_load(const char* filename) { assert(filename); @@ -291,11 +310,10 @@ return AUD_device->setKeep(handle, keep); } -int AUD_seek(AUD_Handle* handle, double seekTo) +int AUD_seek(AUD_Handle* handle, float seekTo) { assert(AUD_device); - int position = (int)(seekTo * AUD_device->getSpecs().rate); - return AUD_device->seek(handle, position); + return AUD_device->seek(handle, seekTo); } AUD_Status AUD_getStatus(AUD_Handle* handle) Modified: branches/soundsystem/source/blender/blenkernel/BKE_sequence.h =================================================================== --- branches/soundsystem/source/blender/blenkernel/BKE_sequence.h 2009-07-24 17:17:04 UTC (rev 21862) +++ branches/soundsystem/source/blender/blenkernel/BKE_sequence.h 2009-07-24 18:28:09 UTC (rev 21863) @@ -9,7 +9,7 @@ * of the License, or (at your option) any later version. The Blender * Foundation also sells licenses for use in proprietary software under * the Blender License. See http://www.blender.org/BL/ for information - * about this. + * about this. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -37,6 +37,7 @@ struct StripElem; struct ImBuf; struct Scene; +struct bContext; #define MAXSEQ 32 @@ -44,7 +45,6 @@ #define BUILD_SEQAR_COUNT_CURRENT 1 #define BUILD_SEQAR_COUNT_CHILDREN 2 - /* sequence iterator */ typedef struct SeqIterator { @@ -65,7 +65,7 @@ SeqIterator iter;\ for(seq_begin(ed, &iter, 1); iter.valid; seq_next(&iter)) { \ seq= iter.seq; - + #define SEQ_BEGIN(ed, seq) \ { \ SeqIterator iter;\ @@ -90,41 +90,41 @@ /* init & init_plugin are _only_ called on first creation */ void (*init)(struct Sequence *seq); void (*init_plugin)(struct Sequence *seq, const char *fname); - - /* number of input strips needed + + /* number of input strips needed (called directly after construction) */ int (*num_inputs)(); - + /* load is called first time after readblenfile in get_sequence_effect automatically */ void (*load)(struct Sequence *seq); - + /* duplicate */ void (*copy)(struct Sequence *dst, struct Sequence *src); - + /* destruct */ void (*free)(struct Sequence *seq); - + /* returns: -1: no input needed, - 0: no early out, - 1: out = ibuf1, + 0: no early out, + 1: out = ibuf1, 2: out = ibuf2 */ int (*early_out)(struct Sequence *seq, - float facf0, float facf1); - + float facf0, float facf1); + /* stores the y-range of the effect IPO */ void (*store_icu_yrange)(struct Sequence * seq, short adrcode, float *ymin, float *ymax); - + /* stores the default facf0 and facf1 if no IPO is present */ void (*get_default_fac)(struct Sequence *seq, int cfra, float * facf0, float * facf1); - + /* execute the effect sequence effects are only required to either support @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs