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:
Diffstat (limited to 'source/blender/blenkernel/intern/sound.c')
-rw-r--r--source/blender/blenkernel/intern/sound.c77
1 files changed, 68 insertions, 9 deletions
diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c
index 4e08a52d992..a1a6880569b 100644
--- a/source/blender/blenkernel/intern/sound.c
+++ b/source/blender/blenkernel/intern/sound.c
@@ -39,6 +39,26 @@
static int force_device = -1;
+static void sound_sync_callback(void* data, int mode, float time)
+{
+ struct Main* main = (struct Main*)data;
+ struct Scene* scene;
+
+ scene = main->scene.first;
+ while(scene)
+ {
+ if(scene->audio.flag & AUDIO_SYNC)
+ {
+ if(mode)
+ sound_play_scene(scene);
+ else
+ sound_stop_scene(scene);
+ AUD_seek(scene->sound_scene_handle, time);
+ }
+ scene = scene->id.next;
+ }
+}
+
int sound_define_from_str(char *str)
{
if (BLI_strcaseeq(str, "NULL"))
@@ -58,7 +78,7 @@ void sound_force_device(int device)
force_device = device;
}
-void sound_init()
+void sound_init(struct Main *main)
{
AUD_DeviceSpecs specs;
int device, buffersize;
@@ -86,6 +106,7 @@ void sound_init()
if(!AUD_init(device, specs, buffersize))
AUD_init(AUD_NULL_DEVICE, specs, buffersize);
+ AUD_setSyncCallback(sound_sync_callback, main);
}
void sound_exit()
@@ -353,14 +374,24 @@ void sound_start_play_scene(struct Scene *scene)
void sound_play_scene(struct Scene *scene)
{
+ AUD_Status status;
AUD_lock();
- if(!scene->sound_scene_handle || AUD_getStatus(scene->sound_scene_handle) == AUD_STATUS_INVALID)
+ status = AUD_getStatus(scene->sound_scene_handle);
+
+ if(status == AUD_STATUS_INVALID)
sound_start_play_scene(scene);
- AUD_seek(scene->sound_scene_handle, CFRA / FPS);
AUD_setLoop(scene->sound_scene_handle, -1, -1);
- AUD_resume(scene->sound_scene_handle);
+
+ if(status != AUD_STATUS_PLAYING)
+ {
+ AUD_seek(scene->sound_scene_handle, CFRA / FPS);
+ AUD_resume(scene->sound_scene_handle);
+ }
+
+ if(scene->audio.flag & AUDIO_SYNC)
+ AUD_startPlayback();
AUD_unlock();
}
@@ -368,15 +399,21 @@ void sound_play_scene(struct Scene *scene)
void sound_stop_scene(struct Scene *scene)
{
AUD_pause(scene->sound_scene_handle);
+
+ if(scene->audio.flag & AUDIO_SYNC)
+ AUD_stopPlayback();
}
void sound_seek_scene(struct bContext *C)
{
struct Scene *scene = CTX_data_scene(C);
+ AUD_Status status;
AUD_lock();
- if(!scene->sound_scene_handle || AUD_getStatus(scene->sound_scene_handle) == AUD_STATUS_INVALID)
+ status = AUD_getStatus(scene->sound_scene_handle);
+
+ if(status == AUD_STATUS_INVALID)
{
sound_start_play_scene(scene);
AUD_pause(scene->sound_scene_handle);
@@ -385,21 +422,43 @@ void sound_seek_scene(struct bContext *C)
if(scene->audio.flag & AUDIO_SCRUB && !CTX_wm_screen(C)->animtimer)
{
AUD_setLoop(scene->sound_scene_handle, -1, 1 / FPS);
- AUD_seek(scene->sound_scene_handle, CFRA / FPS);
+ if(scene->audio.flag & AUDIO_SYNC)
+ AUD_seekSequencer(scene->sound_scene_handle, CFRA / FPS);
+ else
+ AUD_seek(scene->sound_scene_handle, CFRA / FPS);
AUD_resume(scene->sound_scene_handle);
}
else
- AUD_seek(scene->sound_scene_handle, CFRA / FPS);
+ {
+ if(scene->audio.flag & AUDIO_SYNC)
+ AUD_seekSequencer(scene->sound_scene_handle, CFRA / FPS);
+ else
+ {
+ if(status == AUD_STATUS_PLAYING)
+ AUD_seek(scene->sound_scene_handle, CFRA / FPS);
+ }
+ }
AUD_unlock();
}
float sound_sync_scene(struct Scene *scene)
{
- return AUD_getPosition(scene->sound_scene_handle);
+ if(scene->audio.flag & AUDIO_SYNC)
+ return AUD_getSequencerPosition(scene->sound_scene_handle);
+ else
+ return AUD_getPosition(scene->sound_scene_handle);
+}
+
+int sound_scene_playing(struct Scene *scene)
+{
+ if(scene->audio.flag & AUDIO_SYNC)
+ return AUD_doesPlayback();
+ else
+ return -1;
}
-int sound_read_sound_buffer(bSound* sound, float* buffer, int length)
+int sound_read_sound_buffer(struct bSound* sound, float* buffer, int length)
{
return AUD_readSound(sound->cache, buffer, length);
}