Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoerg Mueller <nexyon@gmail.com>2011-04-11 02:40:37 +0400
committerJoerg Mueller <nexyon@gmail.com>2011-04-11 02:40:37 +0400
commite37dc17991668d696497b5af70ad8133db71b107 (patch)
treecb80a2968f4141426b72c68dc1b1220ac26de7ee
parent2afae38019d9031f683f52046c23bd5ae896685b (diff)
Fix for [#26652] "Audio Muted" in Time Line Editor is not working
-> The feature was completely missing o_O Also fixed an ffmpeg seeking bug.
-rw-r--r--intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp2
-rw-r--r--intern/audaspace/intern/AUD_C-API.cpp9
-rw-r--r--intern/audaspace/intern/AUD_C-API.h4
-rw-r--r--intern/audaspace/intern/AUD_SequencerFactory.cpp14
-rw-r--r--intern/audaspace/intern/AUD_SequencerFactory.h5
-rw-r--r--intern/audaspace/intern/AUD_SequencerReader.cpp75
-rw-r--r--source/blender/blenkernel/BKE_sound.h2
-rw-r--r--source/blender/blenkernel/intern/sound.c8
-rw-r--r--source/blender/makesrna/intern/rna_scene.c20
9 files changed, 95 insertions, 44 deletions
diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp
index 078a10a68cb..0dc525b0e5a 100644
--- a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp
+++ b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp
@@ -253,7 +253,7 @@ void AUD_FFMPEGReader::seek(int position)
if(position >= 0)
{
uint64_t st_time = m_formatCtx->start_time;
- uint64_t seek_pos = position * AV_TIME_BASE / m_specs.rate;
+ uint64_t seek_pos = ((uint64_t)position) * ((uint64_t)AV_TIME_BASE) / ((uint64_t)m_specs.rate);
if (seek_pos < 0) {
seek_pos = 0;
diff --git a/intern/audaspace/intern/AUD_C-API.cpp b/intern/audaspace/intern/AUD_C-API.cpp
index 3fb11e31c37..0119bb105d8 100644
--- a/intern/audaspace/intern/AUD_C-API.cpp
+++ b/intern/audaspace/intern/AUD_C-API.cpp
@@ -864,7 +864,7 @@ AUD_Channel* AUD_pauseAfter(AUD_Channel* handle, float seconds)
}
}
-AUD_Sound* AUD_createSequencer(void* data, AUD_volumeFunction volume)
+AUD_Sound* AUD_createSequencer(int muted, void* data, AUD_volumeFunction volume)
{
/* AUD_XXX should be this: but AUD_createSequencer is called before the device
* is initialized.
@@ -874,7 +874,7 @@ AUD_Sound* AUD_createSequencer(void* data, AUD_volumeFunction volume)
AUD_Specs specs;
specs.channels = AUD_CHANNELS_STEREO;
specs.rate = AUD_RATE_44100;
- return new AUD_SequencerFactory(specs, data, volume);
+ return new AUD_SequencerFactory(specs, muted, data, volume);
}
void AUD_destroySequencer(AUD_Sound* sequencer)
@@ -882,6 +882,11 @@ void AUD_destroySequencer(AUD_Sound* sequencer)
delete ((AUD_SequencerFactory*)sequencer);
}
+void AUD_setSequencerMuted(AUD_Sound* sequencer, int muted)
+{
+ ((AUD_SequencerFactory*)sequencer)->mute(muted);
+}
+
AUD_SequencerEntry* AUD_addSequencer(AUD_Sound** sequencer, AUD_Sound* sound,
float begin, float end, float skip, void* data)
{
diff --git a/intern/audaspace/intern/AUD_C-API.h b/intern/audaspace/intern/AUD_C-API.h
index 04343bb9c4c..b2242f09547 100644
--- a/intern/audaspace/intern/AUD_C-API.h
+++ b/intern/audaspace/intern/AUD_C-API.h
@@ -459,10 +459,12 @@ extern float* AUD_readSoundBuffer(const char* filename, float low, float high,
*/
extern AUD_Channel* AUD_pauseAfter(AUD_Channel* handle, float seconds);
-extern AUD_Sound* AUD_createSequencer(void* data, AUD_volumeFunction volume);
+extern AUD_Sound* AUD_createSequencer(int muted, void* data, AUD_volumeFunction volume);
extern void AUD_destroySequencer(AUD_Sound* sequencer);
+extern void AUD_setSequencerMuted(AUD_Sound* sequencer, int muted);
+
extern AUD_SequencerEntry* AUD_addSequencer(AUD_Sound** sequencer, AUD_Sound* sound,
float begin, float end, float skip, void* data);
diff --git a/intern/audaspace/intern/AUD_SequencerFactory.cpp b/intern/audaspace/intern/AUD_SequencerFactory.cpp
index 77d83458c68..f49dd94fe11 100644
--- a/intern/audaspace/intern/AUD_SequencerFactory.cpp
+++ b/intern/audaspace/intern/AUD_SequencerFactory.cpp
@@ -34,9 +34,11 @@
typedef std::list<AUD_SequencerReader*>::iterator AUD_ReaderIterator;
-AUD_SequencerFactory::AUD_SequencerFactory(AUD_Specs specs, void* data,
+AUD_SequencerFactory::AUD_SequencerFactory(AUD_Specs specs, bool muted,
+ void* data,
AUD_volumeFunction volume) :
m_specs(specs),
+ m_muted(muted),
m_data(data),
m_volume(volume)
{
@@ -62,6 +64,16 @@ AUD_SequencerFactory::~AUD_SequencerFactory()
}
}
+void AUD_SequencerFactory::mute(bool muted)
+{
+ m_muted = muted;
+}
+
+bool AUD_SequencerFactory::getMute() const
+{
+ return m_muted;
+}
+
AUD_IReader* AUD_SequencerFactory::newReader()
{
AUD_SequencerReader* reader = new AUD_SequencerReader(this, m_entries,
diff --git a/intern/audaspace/intern/AUD_SequencerFactory.h b/intern/audaspace/intern/AUD_SequencerFactory.h
index 5eea95eb6ef..8f3466f75ce 100644
--- a/intern/audaspace/intern/AUD_SequencerFactory.h
+++ b/intern/audaspace/intern/AUD_SequencerFactory.h
@@ -63,6 +63,7 @@ private:
std::list<AUD_SequencerEntry*> m_entries;
std::list<AUD_SequencerReader*> m_readers;
+ bool m_muted;
void* m_data;
AUD_volumeFunction m_volume;
@@ -73,9 +74,11 @@ private:
AUD_SequencerFactory& operator=(const AUD_SequencerFactory&);
public:
- AUD_SequencerFactory(AUD_Specs specs, void* data, AUD_volumeFunction volume);
+ AUD_SequencerFactory(AUD_Specs specs, bool muted, void* data, AUD_volumeFunction volume);
~AUD_SequencerFactory();
+ void mute(bool muted);
+ bool getMute() const;
AUD_SequencerEntry* add(AUD_IFactory** sound, float begin, float end, float skip, void* data);
void remove(AUD_SequencerEntry* entry);
void move(AUD_SequencerEntry* entry, float begin, float end, float skip);
diff --git a/intern/audaspace/intern/AUD_SequencerReader.cpp b/intern/audaspace/intern/AUD_SequencerReader.cpp
index c02f9e02b33..95e0dca6323 100644
--- a/intern/audaspace/intern/AUD_SequencerReader.cpp
+++ b/intern/audaspace/intern/AUD_SequencerReader.cpp
@@ -182,55 +182,58 @@ void AUD_SequencerReader::read(int & length, sample_t* & buffer)
m_buffer.resize(size);
buffer = m_buffer.getBuffer();
- for(AUD_StripIterator i = m_strips.begin(); i != m_strips.end(); i++)
+ if(!m_factory->getMute())
{
- strip = *i;
- if(!strip->entry->muted)
+ for(AUD_StripIterator i = m_strips.begin(); i != m_strips.end(); i++)
{
- if(strip->old_sound != *strip->entry->sound)
+ strip = *i;
+ if(!strip->entry->muted)
{
- strip->old_sound = *strip->entry->sound;
- if(strip->reader)
- delete strip->reader;
-
- if(strip->old_sound)
+ if(strip->old_sound != *strip->entry->sound)
{
- try
+ strip->old_sound = *strip->entry->sound;
+ if(strip->reader)
+ delete strip->reader;
+
+ if(strip->old_sound)
{
- strip->reader = m_mixer->prepare(strip->old_sound->createReader());
+ try
+ {
+ strip->reader = m_mixer->prepare(strip->old_sound->createReader());
+ }
+ catch(AUD_Exception)
+ {
+ strip->reader = NULL;
+ }
}
- catch(AUD_Exception)
- {
+ else
strip->reader = NULL;
- }
}
- else
- strip->reader = NULL;
- }
- if(strip->reader)
- {
- end = floor(strip->entry->end * rate);
- if(m_position < end)
+ if(strip->reader)
{
- start = floor(strip->entry->begin * rate);
- if(m_position + length > start)
+ end = floor(strip->entry->end * rate);
+ if(m_position < end)
{
- current = m_position - start;
- if(current < 0)
+ start = floor(strip->entry->begin * rate);
+ if(m_position + length > start)
{
- skip = -current;
- current = 0;
+ current = m_position - start;
+ if(current < 0)
+ {
+ skip = -current;
+ current = 0;
+ }
+ else
+ skip = 0;
+ current += strip->entry->skip * rate;
+ len = length > end - m_position ? end - m_position : length;
+ len -= skip;
+ if(strip->reader->getPosition() != current)
+ strip->reader->seek(current);
+ strip->reader->read(len, buf);
+ m_mixer->add(buf, skip, len, m_volume(m_data, strip->entry->data, (float)m_position / (float)rate));
}
- else
- skip = 0;
- current += strip->entry->skip * rate;
- len = length > end - m_position ? end - m_position : length;
- len -= skip;
- if(strip->reader->getPosition() != current)
- strip->reader->seek(current);
- strip->reader->read(len, buf);
- m_mixer->add(buf, skip, len, m_volume(m_data, strip->entry->data, (float)m_position / (float)rate));
}
}
}
diff --git a/source/blender/blenkernel/BKE_sound.h b/source/blender/blenkernel/BKE_sound.h
index acd4718a65a..04597fd666e 100644
--- a/source/blender/blenkernel/BKE_sound.h
+++ b/source/blender/blenkernel/BKE_sound.h
@@ -78,6 +78,8 @@ void sound_create_scene(struct Scene *scene);
void sound_destroy_scene(struct Scene *scene);
+void sound_mute_scene(struct Scene *scene, int muted);
+
void* sound_scene_add_scene_sound(struct Scene *scene, struct Sequence* sequence, int startframe, int endframe, int frameskip);
void* sound_add_scene_sound(struct Scene *scene, struct Sequence* sequence, int startframe, int endframe, int frameskip);
diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c
index 52e1faaabee..e0e456a371e 100644
--- a/source/blender/blenkernel/intern/sound.c
+++ b/source/blender/blenkernel/intern/sound.c
@@ -347,7 +347,7 @@ AUD_Device* sound_mixdown(struct Scene *scene, AUD_DeviceSpecs specs, int start,
void sound_create_scene(struct Scene *scene)
{
- scene->sound_scene = AUD_createSequencer(scene, (AUD_volumeFunction)&sound_get_volume);
+ scene->sound_scene = AUD_createSequencer(scene->audio.flag & AUDIO_MUTE, scene, (AUD_volumeFunction)&sound_get_volume);
}
void sound_destroy_scene(struct Scene *scene)
@@ -358,6 +358,12 @@ void sound_destroy_scene(struct Scene *scene)
AUD_destroySequencer(scene->sound_scene);
}
+void sound_mute_scene(struct Scene *scene, int muted)
+{
+ if(scene->sound_scene)
+ AUD_setSequencerMuted(scene->sound_scene, muted);
+}
+
void* sound_scene_add_scene_sound(struct Scene *scene, struct Sequence* sequence, int startframe, int endframe, int frameskip)
{
if(scene != sequence->scene)
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 331d9cfa957..35177daeb9b 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -912,6 +912,24 @@ static void rna_Scene_simplify_update(Main *bmain, Scene *scene, PointerRNA *ptr
rna_Scene_use_simplify_update(bmain, scene, ptr);
}
+static int rna_Scene_use_audio_get(PointerRNA *ptr)
+{
+ Scene *scene= (Scene*)ptr->data;
+ return scene->audio.flag & AUDIO_MUTE;
+}
+
+static void rna_Scene_use_audio_set(PointerRNA *ptr, int value)
+{
+ Scene *scene= (Scene*)ptr->data;
+
+ if(value)
+ scene->audio.flag |= AUDIO_MUTE;
+ else
+ scene->audio.flag &= ~AUDIO_MUTE;
+
+ sound_mute_scene(scene, value);
+}
+
static int rna_Scene_sync_mode_get(PointerRNA *ptr)
{
Scene *scene= (Scene*)ptr->data;
@@ -3350,7 +3368,7 @@ void RNA_def_scene(BlenderRNA *brna)
/* Audio Settings */
prop= RNA_def_property(srna, "use_audio", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_negative_sdna(prop, NULL, "audio.flag", AUDIO_MUTE);
+ RNA_def_property_boolean_funcs(prop, "rna_Scene_use_audio_get", "rna_Scene_use_audio_set");
RNA_def_property_ui_text(prop, "Audio Muted", "Play back of audio from Sequence Editor will be muted");
RNA_def_property_update(prop, NC_SCENE, NULL);