doxygen: blender/blenkernel tagged.
[blender.git] / source / blender / blenkernel / intern / sound.c
index f780e71d5cdd599ea01b881ac8d71b46964c4c26..cfc98b4a67d2755c9f49555092836ee349efc295 100644 (file)
@@ -1,3 +1,6 @@
+/** \file blender/blenkernel/intern/sound.c
+ *  \ingroup bke
+ */
 /**
  * sound.c (mar-2001 nzc)
  *
@@ -16,6 +19,7 @@
 #include "DNA_sequence_types.h"
 #include "DNA_packedFile_types.h"
 #include "DNA_screen_types.h"
+#include "DNA_sound_types.h"
 
 #include "AUD_C-API.h"
 
@@ -54,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;
@@ -73,7 +77,7 @@ void sound_force_device(int device)
        force_device = device;
 }
 
-void sound_init_once()
+void sound_init_once(void)
 {
        AUD_initOnce();
 }
@@ -109,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_path_abs(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,7 +269,7 @@ void sound_load(struct Main *bmain, struct bSound* sound)
                        if(sound->id.lib)
                                path = sound->id.lib->filepath;
                        else
-                               path = bmain ? bmain->name : G.sce;
+                               path = bmain->name;
 
                        BLI_path_abs(fullpath, path);
 
@@ -268,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;
@@ -374,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)
@@ -392,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);
@@ -431,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
        {
@@ -474,3 +487,12 @@ int sound_read_sound_buffer(struct bSound* sound, float* buffer, int length, flo
        return AUD_readSound(limiter, buffer, length);
        AUD_unload(limiter);
 }
+
+int sound_get_channels(struct bSound* sound)
+{
+       AUD_SoundInfo info;
+
+       info = AUD_getInfo(sound->playback_handle);
+
+       return info.specs.channels;
+}