doxygen: blender/blenkernel tagged.
[blender.git] / source / blender / blenkernel / intern / sound.c
index 23df930aa8466d614373e7ae3424041d7025277c..cfc98b4a67d2755c9f49555092836ee349efc295 100644 (file)
@@ -1,3 +1,6 @@
+/** \file blender/blenkernel/intern/sound.c
+ *  \ingroup bke
+ */
 /**
  * sound.c (mar-2001 nzc)
  *
 #include "DNA_anim_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_sequence_types.h"
-#include "DNA_sound_types.h"
 #include "DNA_packedFile_types.h"
 #include "DNA_screen_types.h"
-#include "DNA_userdef_types.h"
+#include "DNA_sound_types.h"
 
 #include "AUD_C-API.h"
 
 #include "BKE_fcurve.h"
 #include "BKE_animsys.h"
 
-#include "RNA_access.h"
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
 
 static int force_device = -1;
 
@@ -61,7 +58,7 @@ static void sound_sync_callback(void* data, int mode, float time)
 }
 #endif
 
-int sound_define_from_str(char *str)
+int sound_define_from_str(const char *str)
 {
        if (BLI_strcaseeq(str, "NULL"))
                return AUD_NULL_DEVICE;
@@ -80,6 +77,11 @@ void sound_force_device(int device)
        force_device = device;
 }
 
+void sound_init_once(void)
+{
+       AUD_initOnce();
+}
+
 void sound_init(struct Main *bmain)
 {
        AUD_DeviceSpecs specs;
@@ -111,23 +113,30 @@ void sound_init(struct Main *bmain)
                
 #ifdef WITH_JACK
        AUD_setSyncCallback(sound_sync_callback, bmain);
+#else
+       (void)bmain; /* unused */
 #endif
 }
 
-void sound_exit()
+void sound_exit(void)
 {
        AUD_exit();
 }
 
-struct bSound* sound_new_file(struct Main *bmain, char* filename)
+struct bSound* sound_new_file(struct Main *bmain, const char *filename)
 {
        bSound* sound = NULL;
 
        char str[FILE_MAX];
+       char *path;
+
        int len;
 
        strcpy(str, filename);
-       BLI_convertstringcode(str, bmain->name);
+
+       path = /*bmain ? bmain->name :*/ G.main->name;
+
+       BLI_path_abs(str, path);
 
        len = strlen(filename);
        while(len > 0 && filename[len-1] != '/' && filename[len-1] != '\\')
@@ -258,11 +267,11 @@ void sound_load(struct Main *bmain, struct bSound* sound)
                        BLI_strncpy(fullpath, sound->name, sizeof(fullpath));
 
                        if(sound->id.lib)
-                               path = sound->id.lib->filename;
+                               path = sound->id.lib->filepath;
                        else
-                               path = bmain ? bmain->name : G.sce;
+                               path = bmain->name;
 
-                       BLI_convertstringcode(fullpath, path);
+                       BLI_path_abs(fullpath, path);
 
                        /* but we need a packed file then */
                        if (pf)
@@ -270,7 +279,7 @@ void sound_load(struct Main *bmain, struct bSound* sound)
                        /* or else load it from disk */
                        else
                                sound->handle = AUD_load(fullpath);
-               } // XXX
+               }
 // XXX unused currently
 #if 0
                        break;
@@ -349,6 +358,13 @@ void sound_destroy_scene(struct Scene *scene)
                AUD_destroySequencer(scene->sound_scene);
 }
 
+void* sound_scene_add_scene_sound(struct Scene *scene, struct Sequence* sequence, int startframe, int endframe, int frameskip)
+{
+       if(scene != sequence->scene)
+               return AUD_addSequencer(scene->sound_scene, &(sequence->scene->sound_scene), startframe / FPS, endframe / FPS, frameskip / FPS, sequence);
+       return NULL;
+}
+
 void* sound_add_scene_sound(struct Scene *scene, struct Sequence* sequence, int startframe, int endframe, int frameskip)
 {
        return AUD_addSequencer(scene->sound_scene, &(sequence->sound->playback_handle), startframe / FPS, endframe / FPS, frameskip / FPS, sequence);
@@ -369,12 +385,10 @@ void sound_move_scene_sound(struct Scene *scene, void* handle, int startframe, i
        AUD_moveSequencer(scene->sound_scene, handle, startframe / FPS, endframe / FPS, frameskip / FPS);
 }
 
-void sound_start_play_scene(struct Scene *scene)
+static void sound_start_play_scene(struct Scene *scene)
 {
-       AUD_Sound* sound;
-       sound = AUD_loopSound(scene->sound_scene);
-       scene->sound_scene_handle = AUD_play(sound, 1);
-       AUD_unload(sound);
+       scene->sound_scene_handle = AUD_play(scene->sound_scene, 1);
+       AUD_setLoop(scene->sound_scene_handle, -1);
 }
 
 void sound_play_scene(struct Scene *scene)
@@ -387,8 +401,6 @@ void sound_play_scene(struct Scene *scene)
        if(status == AUD_STATUS_INVALID)
                sound_start_play_scene(scene);
 
-       AUD_setLoop(scene->sound_scene_handle, -1, -1);
-
        if(status != AUD_STATUS_PLAYING)
        {
                AUD_seek(scene->sound_scene_handle, CFRA / FPS);
@@ -426,12 +438,18 @@ 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);
                if(scene->audio.flag & AUDIO_SYNC)
+               {
+                       AUD_seek(scene->sound_scene_handle, CFRA / FPS);
                        AUD_seekSequencer(scene->sound_scene_handle, CFRA / FPS);
+               }
                else
                        AUD_seek(scene->sound_scene_handle, CFRA / FPS);
                AUD_resume(scene->sound_scene_handle);
+               if(AUD_getStatus(scene->sound_scrub_handle) != AUD_STATUS_INVALID)
+                       AUD_seek(scene->sound_scrub_handle, 0);
+               else
+                       scene->sound_scrub_handle = AUD_pauseAfter(scene->sound_scene_handle, 1 / FPS);
        }
        else
        {
@@ -463,7 +481,18 @@ int sound_scene_playing(struct Scene *scene)
                return -1;
 }
 
-int sound_read_sound_buffer(struct bSound* sound, float* buffer, int length)
+int sound_read_sound_buffer(struct bSound* sound, float* buffer, int length, float start, float end)
+{
+       AUD_Sound* limiter = AUD_limitSound(sound->cache, start, end);
+       return AUD_readSound(limiter, buffer, length);
+       AUD_unload(limiter);
+}
+
+int sound_get_channels(struct bSound* sound)
 {
-       return AUD_readSound(sound->cache, buffer, length);
+       AUD_SoundInfo info;
+
+       info = AUD_getInfo(sound->playback_handle);
+
+       return info.specs.channels;
 }