23#define DNA_DEPRECATED_ALLOW
37# include <AUD_Handle.h>
38# include <AUD_Sequence.h>
39# include <AUD_Sound.h>
40# include <AUD_Special.h>
63 std::optional<Library *> ,
71 sound_dst->
handle =
nullptr;
72 sound_dst->
cache =
nullptr;
79 sound_dst->
ipo =
nullptr;
129 function_callback(
id, &key, &sound->
waveform, 0, user_data);
177 sound->
cache =
nullptr;
188 sound->
tags &= ~SOUND_TAGS_WAVEFORM_LOADING;
227static char **audio_device_names =
nullptr;
259 STRNCPY(filepath_abs, filepath);
287 STRNCPY(filepath_abs, filepath);
321 AUD_Sound_free(sound->
handle);
327 AUD_Sound_free(sound->
cache);
328 sound->
cache =
nullptr;
337static const char *force_device =
nullptr;
342static void sound_sync_callback(
void *data,
int mode,
float time)
354 force_device = device;
363static AUD_Device *sound_device =
nullptr;
375 AUD_DeviceSpecs specs;
376 int device, buffersize;
377 const char *device_name;
379 device =
U.audiodevice;
380 buffersize =
U.mixbufsize;
381 specs.channels = AUD_Channels(
U.audiochannels);
382 specs.format = AUD_SampleFormat(
U.audioformat);
383 specs.rate =
U.audiorate;
385 if (force_device ==
nullptr) {
388 device_name = names[0];
391 for (i = 0; names[i]; i++) {
393 device_name = names[i];
398 device_name = force_device;
401 if (buffersize < 128) {
405 if (specs.rate < AUD_RATE_8000) {
406 specs.rate = AUD_RATE_48000;
409 if (specs.format <= AUD_FORMAT_INVALID) {
410 specs.format = AUD_FORMAT_S16;
413 if (specs.channels <= AUD_CHANNELS_INVALID) {
414 specs.channels = AUD_CHANNELS_STEREO;
417 if (!(sound_device = AUD_init(device_name, specs, buffersize,
"Blender"))) {
418 sound_device = AUD_init(
"None", specs, buffersize,
"Blender");
428 AUD_setSynchronizerCallback(sound_sync_callback, bmain);
437 AUD_exit(sound_device);
438 sound_device =
nullptr;
443 AUD_exit(sound_device);
444 sound_device =
nullptr;
447 if (audio_device_names !=
nullptr) {
449 for (i = 0; audio_device_names[i]; i++) {
450 free(audio_device_names[i]);
452 free(audio_device_names);
453 audio_device_names =
nullptr;
468 sound->child_sound = source;
469 sound->type = SOUND_TYPE_BUFFER;
471 sound_load(bmain, sound);
476bSound *BKE_sound_new_limiter(
Main *bmain,
bSound *source,
float start,
float end)
485 sound->child_sound = source;
486 sound->start = start;
488 sound->type = SOUND_TYPE_LIMITER;
490 sound_load(bmain, sound);
501 AUD_Sound_free(sound->
cache);
516 AUD_Sound_free(sound->
cache);
517 sound->
cache =
nullptr;
522static void sound_load_audio(
Main *bmain,
bSound *sound,
bool free_waveform)
526 AUD_Sound_free(sound->
cache);
527 sound->
cache =
nullptr;
531 AUD_Sound_free(sound->
handle);
542 switch (sound->type) {
543 case SOUND_TYPE_FILE:
561 sound->
handle = AUD_Sound_file(fullpath);
568 case SOUND_TYPE_BUFFER:
569 if (sound->child_sound && sound->child_sound->
handle) {
570 sound->
handle = AUD_bufferSound(sound->child_sound->
handle);
573 case SOUND_TYPE_LIMITER:
574 if (sound->child_sound && sound->child_sound->
handle) {
575 sound->
handle = AUD_limitSound(sound->child_sound, sound->start, sound->end);
581 void *handle = AUD_Sound_rechannel(sound->
handle, AUD_CHANNELS_MONO);
582 AUD_Sound_free(sound->
handle);
601 sound_load_audio(bmain, sound,
true);
604AUD_Device *BKE_sound_mixdown(
const Scene *scene, AUD_DeviceSpecs specs,
int start,
float volume)
607 return AUD_openMixdownDevice(
608 specs, scene->sound_scene, volume, AUD_RESAMPLE_QUALITY_MEDIUM, start /
FPS);
616 if (scene->r.frs_sec_base == 0) {
617 scene->r.frs_sec_base = 1;
620 scene->sound_scene = AUD_Sequence_create(
FPS, scene->audio.flag &
AUDIO_MUTE);
621 AUD_Sequence_setSpeedOfSound(scene->sound_scene, scene->audio.speed_of_sound);
622 AUD_Sequence_setDopplerFactor(scene->sound_scene, scene->audio.doppler_factor);
623 AUD_Sequence_setDistanceModel(scene->sound_scene,
624 AUD_DistanceModel(scene->audio.distance_model));
625 scene->playback_handle =
nullptr;
626 scene->sound_scrub_handle =
nullptr;
627 scene->speaker_handles =
nullptr;
632 if (scene->playback_handle) {
633 AUD_Handle_stop(scene->playback_handle);
635 if (scene->sound_scrub_handle) {
636 AUD_Handle_stop(scene->sound_scrub_handle);
638 if (scene->speaker_handles) {
641 while ((handle =
AUD_getSet(scene->speaker_handles))) {
642 AUD_Sequence_remove(scene->sound_scene, handle);
647 if (scene->sound_scene) {
648 AUD_Sequence_free(scene->sound_scene);
654 AUD_Device_lock(sound_device);
659 AUD_Device_unlock(sound_device);
666 if (scene->sound_scene) {
669 specs.channels = AUD_Device_getChannels(sound_device);
670 specs.rate = AUD_Device_getRate(sound_device);
672 AUD_Sequence_setSpecs(scene->sound_scene, specs);
679 if (scene->sound_scene) {
680 AUD_Sequence_setMuted(scene->sound_scene, muted);
688 if (scene->sound_scene) {
689 AUD_Sequence_setFPS(scene->sound_scene,
FPS);
699 AUD_Sequence_setSpeedOfSound(scene->sound_scene, scene->audio.speed_of_sound);
700 AUD_Sequence_setDopplerFactor(scene->sound_scene, scene->audio.doppler_factor);
701 AUD_Sequence_setDistanceModel(scene->sound_scene,
702 AUD_DistanceModel(scene->audio.distance_model));
706 Scene *scene,
Sequence *sequence,
int startframe,
int endframe,
int frameskip)
709 if (sequence->
scene && scene != sequence->
scene) {
710 const double fps =
FPS;
711 return AUD_Sequence_add(scene->sound_scene,
730 Scene *scene,
Sequence *sequence,
int startframe,
int endframe,
int frameskip)
734 if (sequence->
sound ==
nullptr) {
738 const double fps =
FPS;
741 if (offset_time >= 0.0f) {
742 return AUD_Sequence_add(scene->sound_scene,
744 startframe / fps + offset_time,
748 return AUD_Sequence_add(scene->sound_scene,
766 AUD_Sequence_remove(scene->sound_scene, handle);
771 AUD_SequenceEntry_setMuted(handle, mute);
782 const double fps =
FPS;
783 const double offset_time = audio_offset - frameskip / fps;
784 if (offset_time >= 0.0f) {
785 AUD_SequenceEntry_move(handle, startframe / fps + offset_time, endframe / fps, 0.0f);
788 AUD_SequenceEntry_move(handle, startframe / fps, endframe / fps, -offset_time);
796 double offset_time = 0.0f;
797 if (sequence->
sound !=
nullptr) {
819 AUD_SequenceEntry_setSound(handle, sound_handle);
830 if (scene->sound_scene ==
nullptr) {
833 AUD_Sequence_setAnimationData(scene->sound_scene,
845 AUD_SequenceEntry_setAnimationData(handle, AUD_AP_VOLUME, frame, &volume, animated);
853 AUD_SequenceEntry_setAnimationData(handle, AUD_AP_PITCH, frame, &pitch, animated);
861 frame_start =
max_ii(0, frame_start);
862 frame_end =
max_ii(0, frame_end);
863 AUD_SequenceEntry_setConstantRangeAnimationData(
864 handle, AUD_AP_PITCH, frame_start, frame_end, &pitch);
872 AUD_SequenceEntry_setAnimationData(handle, AUD_AP_PANNING, frame, &pan, animated);
877 BLI_assert_msg(0,
"is not supposed to be used, is weird function.");
882 scene =
static_cast<Scene *
>(scene->id.next))
888static void sound_start_play_scene(
Scene *scene)
892 if (scene->playback_handle) {
893 AUD_Handle_stop(scene->playback_handle);
898 if ((scene->playback_handle = AUD_Device_play(sound_device, scene->sound_scene, 1))) {
899 AUD_Handle_setLoopCount(scene->playback_handle, -1);
903static double get_cur_time(
Scene *scene)
908 return FRA2TIME((scene->r.cfra + scene->r.subframe) /
double(scene->r.framelen));
916 const double cur_time = get_cur_time(scene);
918 AUD_Device_lock(sound_device);
920 status = scene->playback_handle ? AUD_Handle_getStatus(scene->playback_handle) :
923 if (status == AUD_STATUS_INVALID) {
924 sound_start_play_scene(scene);
926 if (!scene->playback_handle) {
927 AUD_Device_unlock(sound_device);
932 if (status != AUD_STATUS_PLAYING) {
933 AUD_Handle_setPosition(scene->playback_handle, cur_time);
934 AUD_Handle_resume(scene->playback_handle);
938 AUD_playSynchronizer();
941 AUD_Device_unlock(sound_device);
946 if (scene->playback_handle) {
947 AUD_Handle_pause(scene->playback_handle);
950 AUD_stopSynchronizer();
961 int animation_playing;
963 const double one_frame = 1.0 /
FPS +
964 (
U.audiorate > 0 ?
U.mixbufsize /
double(
U.audiorate) : 0.0);
965 const double cur_time =
FRA2TIME(scene->r.cfra);
967 AUD_Device_lock(sound_device);
969 status = scene->playback_handle ? AUD_Handle_getStatus(scene->playback_handle) :
972 if (status == AUD_STATUS_INVALID) {
973 sound_start_play_scene(scene);
975 if (!scene->playback_handle) {
976 AUD_Device_unlock(sound_device);
980 AUD_Handle_pause(scene->playback_handle);
983 animation_playing = 0;
985 screen =
static_cast<bScreen *
>(screen->id.next))
987 if (screen->animtimer) {
988 animation_playing = 1;
993 if (scene->audio.flag &
AUDIO_SCRUB && !animation_playing) {
994 AUD_Handle_setPosition(scene->playback_handle, cur_time);
996 AUD_seekSynchronizer(scene->playback_handle, cur_time);
998 AUD_Handle_resume(scene->playback_handle);
999 if (scene->sound_scrub_handle &&
1000 AUD_Handle_getStatus(scene->sound_scrub_handle) != AUD_STATUS_INVALID)
1002 AUD_Handle_setPosition(scene->sound_scrub_handle, 0);
1005 if (scene->sound_scrub_handle) {
1006 AUD_Handle_stop(scene->sound_scrub_handle);
1008 scene->sound_scrub_handle = AUD_pauseAfter(scene->playback_handle, one_frame);
1013 AUD_seekSynchronizer(scene->playback_handle, cur_time);
1016 if (status == AUD_STATUS_PLAYING) {
1017 AUD_Handle_setPosition(scene->playback_handle, cur_time);
1022 AUD_Device_unlock(sound_device);
1030 if (
G.is_rendering) {
1034 if (scene->playback_handle) {
1036 return AUD_getSynchronizerPosition(scene->playback_handle);
1039 return AUD_Handle_getPosition(scene->playback_handle);
1049 if (
G.is_rendering) {
1054 if (AUD_Device_getRate(sound_device) == AUD_RATE_INVALID) {
1059 return AUD_isSynchronizerPlaying();
1070 if (waveform->
data) {
1079 sound->
tags &= ~SOUND_TAGS_WAVEFORM_NO_RELOAD;
1084 bool need_close_audio_handles =
false;
1087 sound_load_audio(bmain, sound,
true);
1088 need_close_audio_handles =
true;
1095 if (info.length > 0) {
1098 waveform->
data =
static_cast<float *
>(
1099 MEM_mallocN(
sizeof(
float[3]) * length,
"SoundWaveform.samples"));
1101 short stop_i16 = *stop;
1102 waveform->
length = AUD_readSound(
1104 *stop = stop_i16 != 0;
1111 waveform->
data =
nullptr;
1116 if (waveform->
data) {
1121 sound->
tags &= ~SOUND_TAGS_WAVEFORM_LOADING;
1130 sound->
tags &= ~SOUND_TAGS_WAVEFORM_LOADING;
1133 if (need_close_audio_handles) {
1138static void sound_update_base(
Scene *scene,
Object *
object,
void *new_set)
1146 if ((object->type !=
OB_SPEAKER) || !object->adt) {
1155 speaker = (
Speaker *)object->data;
1157 if (
AUD_removeSet(scene->speaker_handles, strip->speaker_handle)) {
1158 if (speaker->
sound) {
1159 AUD_SequenceEntry_move(strip->speaker_handle,
double(strip->start) /
FPS,
FLT_MAX, 0);
1162 AUD_Sequence_remove(scene->sound_scene, strip->speaker_handle);
1163 strip->speaker_handle =
nullptr;
1167 if (speaker->
sound) {
1168 strip->speaker_handle = AUD_Sequence_add(scene->sound_scene,
1170 double(strip->start) /
FPS,
1173 AUD_SequenceEntry_setRelative(strip->speaker_handle, 0);
1177 if (strip->speaker_handle) {
1180 AUD_SequenceEntry_setVolumeMaximum(strip->speaker_handle, speaker->
volume_max);
1181 AUD_SequenceEntry_setVolumeMinimum(strip->speaker_handle, speaker->
volume_min);
1182 AUD_SequenceEntry_setDistanceMaximum(strip->speaker_handle, speaker->
distance_max);
1183 AUD_SequenceEntry_setDistanceReference(strip->speaker_handle, speaker->
distance_reference);
1184 AUD_SequenceEntry_setAttenuation(strip->speaker_handle, speaker->
attenuation);
1185 AUD_SequenceEntry_setConeAngleOuter(strip->speaker_handle, speaker->
cone_angle_outer);
1186 AUD_SequenceEntry_setConeAngleInner(strip->speaker_handle, speaker->
cone_angle_inner);
1187 AUD_SequenceEntry_setConeVolumeOuter(strip->speaker_handle, speaker->
cone_volume_outer);
1191 AUD_SequenceEntry_setAnimationData(
1192 strip->speaker_handle, AUD_AP_LOCATION, scene->r.cfra, location, 1);
1193 AUD_SequenceEntry_setAnimationData(
1194 strip->speaker_handle, AUD_AP_ORIENTATION, scene->r.cfra, quat, 1);
1195 AUD_SequenceEntry_setAnimationData(
1196 strip->speaker_handle, AUD_AP_VOLUME, scene->r.cfra, &speaker->
volume, 1);
1197 AUD_SequenceEntry_setAnimationData(
1198 strip->speaker_handle, AUD_AP_PITCH, scene->r.cfra, &speaker->
pitch, 1);
1200 AUD_SequenceEntry_setMuted(strip->speaker_handle, mute);
1222 sound_update_base(scene,
object, new_set);
1227 while ((handle =
AUD_getSet(scene->speaker_handles))) {
1228 AUD_Sequence_remove(scene->sound_scene, handle);
1231 if (scene->camera) {
1232 mat4_to_quat(quat, scene->camera->object_to_world().ptr());
1233 blender::float3 location = scene->camera->object_to_world().location();
1234 AUD_Sequence_setAnimationData(scene->sound_scene, AUD_AP_LOCATION, scene->r.cfra, location, 1);
1235 AUD_Sequence_setAnimationData(scene->sound_scene, AUD_AP_ORIENTATION, scene->r.cfra, quat, 1);
1239 scene->speaker_handles = new_set;
1244 return ((
bSound *)sound)->playback_handle;
1262 if (audio_device_names ==
nullptr) {
1263 audio_device_names = AUD_getDeviceNames();
1266 return audio_device_names;
1269static bool sound_info_from_playback_handle(
void *playback_handle,
SoundInfo *sound_info)
1271 if (playback_handle ==
nullptr) {
1274 AUD_SoundInfo info = AUD_getInfo(playback_handle);
1284 return sound_info_from_playback_handle(sound->
playback_handle, sound_info);
1289 sound_load_audio(
main, sound,
false);
1290 const bool result = sound_info_from_playback_handle(sound->
playback_handle, sound_info);
1296 const char *filepath,
1303 AUD_StreamInfo *stream_infos;
1306 STRNCPY(filepath_abs, filepath);
1309 sound = AUD_Sound_file(filepath_abs);
1314 stream_count = AUD_Sound_getFileStreams(sound, &stream_infos);
1316 AUD_Sound_free(sound);
1318 if (!stream_infos) {
1322 if ((stream < 0) || (stream >= stream_count)) {
1327 sound_info->
start = stream_infos[stream].start;
1328 sound_info->
duration = stream_infos[stream].duration;
1443 static char *names[1] = {
nullptr};
1466 scene->sound_scene =
nullptr;
1467 scene->playback_handle =
nullptr;
1468 scene->sound_scrub_handle =
nullptr;
1469 scene->speaker_handles =
nullptr;
1474 if (scene->sound_scene !=
nullptr) {
1482 sound->
cache =
nullptr;
1488 if (sound->
cache !=
nullptr) {
1496#if defined(WITH_AUDASPACE) && defined(WITH_JACK)
1508 if (
G.is_rendering) {
1518#ifdef WITH_AUDASPACE
1519 if (scene->playback_handle !=
nullptr) {
1520 AUD_Handle_setPosition(scene->playback_handle, time);
void * AUD_getSet(void *set)
void AUD_addSet(void *set, void *entry)
void AUD_destroySet(void *set)
char AUD_removeSet(void *set, void *entry)
bool BKE_bpath_foreach_path_fixed_process(BPathForeachPathData *bpath_data, char *path, size_t path_maxncpy)
@ BKE_BPATH_FOREACH_PATH_SKIP_PACKED
@ IDTYPE_FLAGS_APPEND_IS_REUSABLE
@ IDTYPE_FLAGS_NO_ANIMDATA
void(*)(ID *id, const IDCacheKey *cache_key, void **cache_p, uint flags, void *user_data) IDTypeForeachCacheFunctionCallback
void * BKE_libblock_alloc(Main *bmain, short type, const char *name, int flag) ATTR_WARN_UNUSED_RESULT
void BKE_id_blend_write(BlendWriter *writer, ID *id)
int BKE_lib_query_foreachid_process_flags_get(const LibraryForeachIDData *data)
@ IDWALK_DO_DEPRECATED_POINTERS
#define BKE_LIB_FOREACHID_PROCESS_ID_NOCHECK(data_, id_, cb_flag_)
const char * BKE_main_blendfile_path(const Main *bmain) ATTR_NONNULL()
PackedFile * BKE_packedfile_duplicate(const PackedFile *pf_src)
void BKE_packedfile_free(PackedFile *pf)
void BKE_packedfile_blend_write(BlendWriter *writer, const PackedFile *pf)
void BKE_packedfile_blend_read(BlendDataReader *reader, PackedFile **pf_p, blender::StringRefNull filepath)
void * BKE_sound_get_factory(void *sound)
#define SOUND_WAVE_SAMPLES_PER_SECOND
void(* SoundJackSyncCallback)(struct Main *bmain, int mode, double time)
void * BKE_sound_get_device(void)
#define BLI_assert_msg(a, msg)
void BLI_kdtree_nd_ free(KDTree *tree)
#define LISTBASE_FOREACH(type, var, list)
MINLINE int max_ii(int a, int b)
void mat4_to_quat(float q[4], const float mat[4][4])
bool BLI_path_abs(char path[FILE_MAX], const char *basepath) ATTR_NONNULL(1
void void void const char * BLI_path_basename(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
#define STRNCPY(dst, src)
#define BLI_string_join(...)
pthread_spinlock_t SpinLock
void BLI_spin_init(SpinLock *spin)
void BLI_spin_unlock(SpinLock *spin)
void BLI_spin_lock(SpinLock *spin)
void BLI_spin_end(SpinLock *spin)
#define UNUSED_VARS_NDEBUG(...)
bool BLO_read_data_is_undo(BlendDataReader *reader)
#define BLO_write_id_struct(writer, struct_name, id_address, id)
bool BLO_write_is_undo(BlendWriter *writer)
#define BLT_I18NCONTEXT_ID_SOUND
typedef double(DMatrix)[4][4]
void DEG_debug_print_eval(Depsgraph *depsgraph, const char *function_name, const char *object_name, const void *object_address)
#define DEG_OBJECT_ITER_BEGIN(settings_, instance_)
#define DEG_OBJECT_ITER_END
bool DEG_id_type_any_exists(const Depsgraph *depsgraph, short id_type)
@ DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY
@ DEG_ITER_OBJECT_FLAG_LINKED_INDIRECTLY
@ DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET
#define ID_BLEND_PATH(_bmain, _id)
@ ID_TAG_COPIED_ON_EVAL_FINAL_RESULT
#define ID_IS_OVERRIDE_LIBRARY(_id)
Object is a sort of wrapper for general info.
@ SOUND_TAGS_WAVEFORM_NO_RELOAD
Read Guarded memory(de)allocation.
void BKE_sound_jack_sync_callback_set(SoundJackSyncCallback callback)
void BKE_sound_ensure_scene(Scene *scene)
BLI_INLINE void sound_verify_evaluated_id(const ID *id)
double BKE_sound_sync_scene(Scene *)
void BKE_sound_destroy_scene(Scene *)
char ** BKE_sound_get_device_names()
void BKE_sound_init(Main *)
static void sound_free_audio(bSound *sound)
int BKE_sound_scene_playing(Scene *)
void BKE_sound_load(Main *, bSound *)
void BKE_sound_move_scene_sound_defaults(Scene *, Sequence *)
void BKE_sound_update_sequencer(Main *, bSound *)
static void sound_free_data(ID *id)
static void sound_blend_read_data(BlendDataReader *reader, ID *id)
void BKE_sound_mute_scene_sound(void *, bool)
void BKE_sound_seek_scene(Main *, Scene *)
void * BKE_sound_add_scene_sound(Scene *, Sequence *, int, int, int)
void BKE_sound_init_main(Main *)
void BKE_sound_play_scene(Scene *)
void BKE_sound_force_device(const char *)
void BKE_sound_jack_scene_update(Scene *scene, int mode, double time)
void BKE_sound_update_scene(Depsgraph *, Scene *)
bSound * BKE_sound_new_file_exists_ex(Main *bmain, const char *filepath, bool *r_exists)
static void sound_blend_write(BlendWriter *writer, ID *id, const void *id_address)
void BKE_sound_mute_scene(Scene *, int)
void * BKE_sound_scene_add_scene_sound(Scene *, Sequence *, int, int, int)
void BKE_sound_exit_once()
bSound * BKE_sound_new_file(Main *bmain, const char *filepath)
void BKE_sound_update_fps(Main *, Scene *)
void BKE_sound_delete_cache(bSound *)
static void sound_foreach_path(ID *id, BPathForeachPathData *bpath_data)
void BKE_sound_remove_scene_sound(Scene *, void *)
void * BKE_sound_add_scene_sound_defaults(Scene *, Sequence *)
void BKE_sound_reset_runtime(bSound *sound)
bool BKE_sound_stream_info_get(Main *, const char *, int, SoundStreamInfo *)
float BKE_sound_get_length(Main *, bSound *)
bool BKE_sound_info_get(Main *, bSound *, SoundInfo *)
static void sound_foreach_id(ID *id, LibraryForeachIDData *data)
void * BKE_sound_scene_add_scene_sound_defaults(Scene *, Sequence *)
void BKE_sound_set_scene_sound_pan_at_frame(void *, int, float, char)
static void sound_copy_data(Main *, std::optional< Library * >, ID *id_dst, const ID *id_src, const int)
void BKE_sound_init_once()
void BKE_sound_set_scene_sound_pitch_at_frame(void *, int, float, char)
void BKE_sound_create_scene(Scene *)
void BKE_sound_update_scene_sound(void *, bSound *)
void BKE_sound_free_waveform(bSound *)
void BKE_sound_set_scene_sound_pitch_constant_range(void *, int, int, float)
static void sound_foreach_cache(ID *id, IDTypeForeachCacheFunctionCallback function_callback, void *user_data)
void BKE_sound_set_scene_volume(Scene *, float)
bSound * BKE_sound_new_file_exists(Main *bmain, const char *filepath)
void BKE_sound_reset_scene_runtime(Scene *scene)
void BKE_sound_update_sequence_handle(void *handle, void *sound_handle)
void BKE_sound_stop_scene(Scene *)
void BKE_sound_reset_scene_specs(Scene *)
void BKE_sound_evaluate(Depsgraph *depsgraph, Main *bmain, bSound *sound)
void BKE_sound_move_scene_sound(const Scene *, void *, int, int, int, double)
void BKE_sound_read_waveform(Main *bmain, bSound *sound, bool *stop)
void BKE_sound_cache(bSound *)
void BKE_sound_update_scene_listener(Scene *)
void BKE_sound_ensure_loaded(Main *bmain, bSound *sound)
void BKE_sound_set_scene_sound_volume_at_frame(void *, int, float, char)
const Depsgraph * depsgraph
DEGForeachIDComponentCallback callback
#define pf(_x, _i)
Prefetch 64.
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)
void SEQ_sound_update(Scene *scene, bSound *sound)
void SEQ_sound_update_length(Main *bmain, Scene *scene)
int SEQ_time_left_handle_frame_get(const Scene *, const Sequence *seq)
int SEQ_time_right_handle_frame_get(const Scene *scene, const Sequence *seq)
unsigned int id_session_uid
struct SoundInfo::@58 specs
struct PackedFile * packedfile
struct PackedFile * newpackedfile
static void sound_jack_sync_callback(Main *bmain, int mode, double time)