10#include <condition_variable>
30#define DNA_DEPRECATED_ALLOW
44# include <AUD_Handle.h>
45# include <AUD_Sequence.h>
46# include <AUD_Sound.h>
47# include <AUD_Special.h>
48# include <AUD_Types.h>
74 std::optional<Library *> ,
82 sound_dst->
handle =
nullptr;
83 sound_dst->
cache =
nullptr;
130 function_callback(
id, &key, &sound->
waveform, 0, user_data);
178 sound->
cache =
nullptr;
229static char **audio_device_names =
nullptr;
261 STRNCPY(filepath_abs, filepath);
289 STRNCPY(filepath_abs, filepath);
323 AUD_Sound_free(sound->
handle);
329 AUD_Sound_free(sound->
cache);
330 sound->
cache =
nullptr;
343 const char *force_device =
nullptr;
346 const char *device_name =
nullptr;
347 AUD_DeviceSpecs initialized_specs;
350 AUD_Device *sound_device =
nullptr;
352 std::mutex sound_device_mutex;
354 bool need_exit =
false;
355 bool use_delayed_close =
true;
356 std::thread delayed_close_thread;
357 std::condition_variable delayed_close_cv;
359 int num_device_users = 0;
360 std::chrono::time_point<std::chrono::steady_clock> last_user_disconnect_time_point;
377 std::unique_lock
lock(sound_device_mutex);
381 if (delayed_close_thread.joinable()) {
382 delayed_close_cv.notify_all();
383 delayed_close_thread.join();
391static void sound_device_close_no_lock()
395 AUD_exit(
g_state.sound_device);
396 g_state.sound_device =
nullptr;
400static void sound_device_open_no_lock(AUD_DeviceSpecs requested_specs)
406 g_state.sound_device = AUD_init(
407 g_state.device_name, requested_specs,
g_state.buffer_size,
"Blender");
409 g_state.sound_device = AUD_init(
"None", requested_specs,
g_state.buffer_size,
"Blender");
412 g_state.initialized_specs.channels = AUD_Device_getChannels(
g_state.sound_device);
413 g_state.initialized_specs.rate = AUD_Device_getRate(
g_state.sound_device);
414 g_state.initialized_specs.format = AUD_Device_getFormat(
g_state.sound_device);
417static void sound_device_use_begin()
425 sound_device_open_no_lock(
g_state.initialized_specs);
428static void sound_device_use_end_after(
const std::chrono::milliseconds after_ms)
431 if (
g_state.num_device_users == 0) {
436 if (
g_state.num_device_users == 0) {
437 g_state.last_user_disconnect_time_point = std::chrono::steady_clock::now() + after_ms;
438 g_state.delayed_close_cv.notify_one();
442static void sound_device_use_end()
444 sound_device_use_end_after(std::chrono::milliseconds(0));
450static bool sound_use_close_thread()
454# if defined(WITH_PYTHON_MODULE) || defined(WITH_HEADLESS)
465 if (__builtin_available(macOS 15.2, *)) {
474static void delayed_close_thread_run()
476 constexpr std::chrono::milliseconds device_close_delay{30000};
481 if (!
g_state.use_delayed_close) {
489 if (
g_state.num_device_users == 0) {
490 if (
g_state.sound_device ==
nullptr) {
495 g_state.delayed_close_cv.wait_until(
496 lock,
g_state.last_user_disconnect_time_point + device_close_delay);
512 if (!
g_state.use_delayed_close) {
523 CLOG_DEBUG(&
LOG,
"Checking last device usage and timestamp");
525 if (
g_state.num_device_users) {
530 const std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
531 if ((now -
g_state.last_user_disconnect_time_point) >= device_close_delay) {
532 sound_device_close_no_lock();
541static void sound_sync_callback(
void *
data,
int mode,
float time)
558 if (sound_use_close_thread()) {
560 g_state.delayed_close_thread = std::thread(delayed_close_thread_run);
567 sound_device_close_no_lock();
575 sound_device_close_no_lock();
578 if (audio_device_names !=
nullptr) {
580 for (
i = 0; audio_device_names[
i];
i++) {
581 free(audio_device_names[
i]);
583 free(audio_device_names);
584 audio_device_names =
nullptr;
592 sound_device_close_no_lock();
594 AUD_DeviceSpecs requested_specs;
595 requested_specs.channels = AUD_Channels(
U.audiochannels);
596 requested_specs.format = AUD_SampleFormat(
U.audioformat);
597 requested_specs.rate =
U.audiorate;
599 if (
g_state.force_device ==
nullptr) {
601 g_state.device_name = names[0];
604 for (
int i = 0; names[
i];
i++) {
605 if (
i ==
U.audiodevice) {
614 g_state.buffer_size =
U.mixbufsize < 128 ? 1024 :
U.mixbufsize;
616 if (requested_specs.rate < AUD_RATE_8000) {
617 requested_specs.rate = AUD_RATE_48000;
620 if (requested_specs.format <= AUD_FORMAT_INVALID) {
621 requested_specs.format = AUD_FORMAT_S16;
624 if (requested_specs.channels <= AUD_CHANNELS_INVALID) {
625 requested_specs.channels = AUD_CHANNELS_STEREO;
629 sound_device_open_no_lock(requested_specs);
643 g_state.use_delayed_close =
false;
644 AUD_setSynchronizerCallback(sound_sync_callback, bmain);
647 g_state.use_delayed_close =
true;
648 sound_device_close_no_lock();
656 AUD_setSynchronizerCallback(sound_sync_callback, bmain);
671 sound->child_sound = source;
672 sound->type = SOUND_TYPE_BUFFER;
674 sound_load(bmain, sound);
679bSound *BKE_sound_new_limiter(
Main *bmain,
bSound *source,
float start,
float end)
688 sound->child_sound = source;
689 sound->start = start;
691 sound->type = SOUND_TYPE_LIMITER;
693 sound_load(bmain, sound);
704 AUD_Sound_free(sound->
cache);
719 AUD_Sound_free(sound->
cache);
720 sound->
cache =
nullptr;
725static void sound_load_audio(
Main *bmain,
bSound *sound,
bool free_waveform)
729 AUD_Sound_free(sound->
cache);
730 sound->
cache =
nullptr;
734 AUD_Sound_free(sound->
handle);
745 switch (sound->type) {
746 case SOUND_TYPE_FILE:
764 sound->
handle = AUD_Sound_file(fullpath);
771 case SOUND_TYPE_BUFFER:
772 if (sound->child_sound && sound->child_sound->
handle) {
773 sound->
handle = AUD_bufferSound(sound->child_sound->
handle);
776 case SOUND_TYPE_LIMITER:
777 if (sound->child_sound && sound->child_sound->
handle) {
778 sound->
handle = AUD_limitSound(sound->child_sound, sound->start, sound->end);
784 void *handle = AUD_Sound_rechannel(sound->
handle, AUD_CHANNELS_MONO);
785 AUD_Sound_free(sound->
handle);
804 sound_load_audio(bmain, sound,
true);
807AUD_Device *BKE_sound_mixdown(
const Scene *scene, AUD_DeviceSpecs specs,
int start,
float volume)
810 return AUD_openMixdownDevice(specs,
813 AUD_RESAMPLE_QUALITY_MEDIUM,
814 start / scene->frames_per_second());
826 scene->
sound_scene = AUD_Sequence_create(scene->frames_per_second(),
861 g_state.sound_device_mutex.lock();
862 if (
g_state.sound_device ==
nullptr) {
865 AUD_Device_lock(
g_state.sound_device);
870 g_state.sound_device_mutex.unlock();
871 if (
g_state.sound_device ==
nullptr) {
874 AUD_Device_unlock(
g_state.sound_device);
899 AUD_Sequence_setFPS(scene->
sound_scene, scene->frames_per_second());
916 Scene *scene,
Strip *sequence,
int startframe,
int endframe,
int frameskip)
919 if (sequence->
scene && scene != sequence->
scene) {
920 const double fps = scene->frames_per_second();
941 Scene *scene,
Strip *sequence,
int startframe,
int endframe,
int frameskip)
945 if (sequence->
sound ==
nullptr) {
949 const double fps = scene->frames_per_second();
952 if (offset_time >= 0.0f) {
955 startframe / fps + offset_time,
982 AUD_SequenceEntry_setMuted(handle, mute);
993 const double fps = scene->frames_per_second();
994 const double offset_time = audio_offset - frameskip / fps;
995 if (offset_time >= 0.0f) {
996 AUD_SequenceEntry_move(handle, startframe / fps + offset_time, endframe / fps, 0.0f);
999 AUD_SequenceEntry_move(handle, startframe / fps, endframe / fps, -offset_time);
1007 double offset_time = 0.0f;
1008 if (sequence->
sound !=
nullptr) {
1029#ifdef WITH_AUDASPACE
1030 AUD_SequenceEntry_setSound(handle, sound_handle);
1036#ifdef WITH_AUDASPACE
1054 const char animated)
1056 AUD_SequenceEntry_setAnimationData(handle, AUD_AP_VOLUME, frame, &volume, animated);
1062 const char animated)
1064 AUD_SequenceEntry_setAnimationData(handle, AUD_AP_PITCH, frame, &pitch, animated);
1072 frame_start =
max_ii(0, frame_start);
1073 frame_end =
max_ii(0, frame_end);
1074 AUD_SequenceEntry_setConstantRangeAnimationData(
1075 handle, AUD_AP_PITCH, frame_start, frame_end, &pitch);
1081 const char animated)
1083 AUD_SequenceEntry_setAnimationData(handle, AUD_AP_PANNING, frame, &pan, animated);
1088 BLI_assert_msg(0,
"is not supposed to be used, is weird function.");
1092 for (scene =
static_cast<Scene *
>(
main->scenes.first); scene;
1100static void sound_start_play_scene(
Scene *scene)
1119 sound_device_use_begin();
1125 AUD_Device_lock(
g_state.sound_device);
1142 if (
status == AUD_STATUS_INVALID) {
1143 sound_start_play_scene(scene);
1146 AUD_Device_unlock(
g_state.sound_device);
1151 if (
status != AUD_STATUS_PLAYING) {
1154 AUD_seekSynchronizer(cur_time);
1160 AUD_playSynchronizer();
1163 AUD_Device_unlock(
g_state.sound_device);
1174 AUD_stopSynchronizer();
1177 sound_device_use_end();
1183 bool animation_playing =
false;
1185 screen =
static_cast<bScreen *
>(screen->id.next))
1187 if (screen->animtimer) {
1188 animation_playing =
true;
1195 if (do_audio_scrub) {
1197 sound_device_use_begin();
1199 else if (
g_state.sound_device ==
nullptr) {
1205 AUD_Device_lock(
g_state.sound_device);
1209 if (
status == AUD_STATUS_INVALID) {
1210 sound_start_play_scene(scene);
1213 AUD_Device_unlock(
g_state.sound_device);
1214 if (do_audio_scrub) {
1215 sound_device_use_end();
1223 const double one_frame = 1.0 / scene->frames_per_second() +
1224 (
U.audiorate > 0 ?
U.mixbufsize / double(
U.audiorate) : 0.0);
1227 if (do_audio_scrub) {
1242 sound_device_use_end_after(std::chrono::milliseconds(
int(one_frame * 1000)));
1244 else if (
status == AUD_STATUS_PLAYING) {
1249 AUD_seekSynchronizer(cur_time);
1253 AUD_Device_unlock(
g_state.sound_device);
1261 if (
G.is_rendering) {
1267 return AUD_getSynchronizerPosition();
1280 if (waveform->
data) {
1294 bool need_close_audio_handles =
false;
1297 sound_load_audio(bmain, sound,
true);
1298 need_close_audio_handles =
true;
1304 if (info.length > 0) {
1308 waveform->
length = AUD_readSound(
1316 waveform->
data =
nullptr;
1321 if (waveform->
data) {
1338 if (need_close_audio_handles) {
1343static void sound_update_base(
Scene *scene,
Object *
object,
void *new_set)
1363 if (speaker->
sound) {
1364 AUD_SequenceEntry_move(strip->speaker_handle,
1365 double(strip->start) / scene->frames_per_second(),
1370 AUD_Sequence_remove(scene->
sound_scene, strip->speaker_handle);
1371 strip->speaker_handle =
nullptr;
1375 if (speaker->
sound) {
1376 strip->speaker_handle = AUD_Sequence_add(scene->
sound_scene,
1378 double(strip->start) /
1379 scene->frames_per_second(),
1382 AUD_SequenceEntry_setRelative(strip->speaker_handle, 0);
1386 if (strip->speaker_handle) {
1389 AUD_SequenceEntry_setVolumeMaximum(strip->speaker_handle, speaker->
volume_max);
1390 AUD_SequenceEntry_setVolumeMinimum(strip->speaker_handle, speaker->
volume_min);
1391 AUD_SequenceEntry_setDistanceMaximum(strip->speaker_handle, speaker->
distance_max);
1392 AUD_SequenceEntry_setDistanceReference(strip->speaker_handle, speaker->
distance_reference);
1393 AUD_SequenceEntry_setAttenuation(strip->speaker_handle, speaker->
attenuation);
1394 AUD_SequenceEntry_setConeAngleOuter(strip->speaker_handle, speaker->
cone_angle_outer);
1395 AUD_SequenceEntry_setConeAngleInner(strip->speaker_handle, speaker->
cone_angle_inner);
1396 AUD_SequenceEntry_setConeVolumeOuter(strip->speaker_handle, speaker->
cone_volume_outer);
1400 AUD_SequenceEntry_setAnimationData(
1401 strip->speaker_handle, AUD_AP_LOCATION, scene->
r.
cfra, location, 1);
1402 AUD_SequenceEntry_setAnimationData(
1403 strip->speaker_handle, AUD_AP_ORIENTATION, scene->
r.
cfra, quat, 1);
1404 AUD_SequenceEntry_setAnimationData(
1405 strip->speaker_handle, AUD_AP_VOLUME, scene->
r.
cfra, &speaker->
volume, 1);
1406 AUD_SequenceEntry_setAnimationData(
1407 strip->speaker_handle, AUD_AP_PITCH, scene->
r.
cfra, &speaker->
pitch, 1);
1409 AUD_SequenceEntry_setMuted(strip->speaker_handle, mute);
1431 sound_update_base(scene,
object, new_set);
1443 AUD_Sequence_setAnimationData(scene->
sound_scene, AUD_AP_LOCATION, scene->
r.
cfra, location, 1);
1444 AUD_Sequence_setAnimationData(scene->
sound_scene, AUD_AP_ORIENTATION, scene->
r.
cfra, quat, 1);
1453 return ((
bSound *)sound)->playback_handle;
1471 if (audio_device_names ==
nullptr) {
1472 audio_device_names = AUD_getDeviceNames();
1475 return audio_device_names;
1478static bool sound_info_from_playback_handle(
void *playback_handle,
SoundInfo *sound_info)
1480 if (playback_handle ==
nullptr) {
1483 AUD_SoundInfo info = AUD_getInfo(playback_handle);
1493 return sound_info_from_playback_handle(sound->
playback_handle, sound_info);
1498 sound_load_audio(
main, sound,
false);
1505 const char *filepath,
1512 AUD_StreamInfo *stream_infos;
1515 STRNCPY(filepath_abs, filepath);
1518 sound = AUD_Sound_file(filepath_abs);
1523 stream_count = AUD_Sound_getFileStreams(sound, &stream_infos);
1525 AUD_Sound_free(sound);
1527 if (!stream_infos) {
1531 if ((stream < 0) || (stream >= stream_count)) {
1536 sound_info->
start = stream_infos[stream].start;
1537 sound_info->
duration = stream_infos[stream].duration;
1544# ifdef WITH_RUBBERBAND
1548 AUD_Sound *cur_seq_sound = sequence_handle ? AUD_SequenceEntry_getSound(sequence_handle) :
1550 if (AUD_Sound_isAnimateableTimeStretchPitchScale(cur_seq_sound) &&
1551 AUD_Sound_animateableTimeStretchPitchScale_getFPS(cur_seq_sound) == fps)
1553 return cur_seq_sound;
1557 return AUD_Sound_animateableTimeStretchPitchScale(
1558 sound_handle, fps, 1.0, 1.0, AUD_STRETCHER_QUALITY_HIGH,
false);
1565 AUD_Sound_animateableTimeStretchPitchScale_setAnimationData(
1566 handle, AUD_AP_TIME_STRETCH, frame, &time_stretch, animated);
1573 frame_start =
max_ii(0, frame_start);
1574 frame_end =
max_ii(0, frame_end);
1575 AUD_Sound_animateableTimeStretchPitchScale_setConstantRangeAnimationData(
1576 handle, AUD_AP_TIME_STRETCH, frame_start, frame_end, &time_stretch);
1685 static char *names[1] = {
nullptr};
1706#if !defined(WITH_AUDASPACE) || !defined(WITH_RUBBERBAND)
1746 sound->
cache =
nullptr;
1752 if (sound->
cache !=
nullptr) {
1760#if defined(WITH_AUDASPACE)
1772 if (
G.is_rendering) {
1775#ifdef WITH_AUDASPACE
1776 AUD_Device_lock(
g_state.sound_device);
1787 AUD_Device_unlock(
g_state.sound_device);
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
void(*)(ID *id, const IDCacheKey *cache_key, void **cache_p, uint flags, void *user_data) IDTypeForeachCacheFunctionCallback
@ IDTYPE_FLAGS_APPEND_IS_REUSABLE
@ IDTYPE_FLAGS_NO_ANIMDATA
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)
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)
#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
char * STRNCPY(char(&dst)[N], const char *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
#define CLOG_DEBUG(clg_ref,...)
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
@ ID_TAG_COPIED_ON_EVAL_FINAL_RESULT
#define ID_BLEND_PATH(_bmain, _id)
#define ID_IS_OVERRIDE_LIBRARY(_id)
Object is a sort of wrapper for general info.
@ SOUND_TAGS_WAVEFORM_LOADING
@ SOUND_TAGS_WAVEFORM_NO_RELOAD
Read Guarded memory(de)allocation.
void BKE_sound_jack_sync_callback_set(SoundJackSyncCallback callback)
void BKE_sound_refresh_callback_bmain(Main *)
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_add_scene_sound_defaults(Scene *, Strip *)
void BKE_sound_destroy_scene(Scene *)
char ** BKE_sound_get_device_names()
void BKE_sound_init(Main *)
static void sound_free_audio(bSound *sound)
void BKE_sound_load(Main *, bSound *)
void BKE_sound_update_sequencer(Main *, bSound *)
static void sound_free_data(ID *id)
void BKE_sound_set_scene_sound_time_stretch_at_frame(void *, int, float, char)
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_set_scene_sound_time_stretch_constant_range(void *, int, int, float)
void BKE_sound_play_scene(Scene *)
void * BKE_sound_ensure_time_stretch_effect(void *, void *, float)
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_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_move_scene_sound_defaults(Scene *, Strip *)
void * BKE_sound_scene_add_scene_sound_defaults(Scene *, Strip *)
void BKE_sound_remove_scene_sound(Scene *, void *)
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 *)
void * BKE_sound_scene_add_scene_sound(Scene *, Strip *, int, int, int)
bool BKE_sound_info_get(Main *, bSound *, SoundInfo *)
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_add_scene_sound(Scene *, Strip *, int, int, int)
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)
BMesh const char void * data
BPy_StructRNA * depsgraph
#define pf(_x, _i)
Prefetch 64.
static GPUSelectNextState g_state
float length(VecOp< float, D >) RET
void * MEM_mallocN(size_t len, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
int time_right_handle_frame_get(const Scene *scene, const Strip *strip)
void sound_update_length(Main *bmain, Scene *scene)
int time_left_handle_frame_get(const Scene *, const Strip *strip)
void sound_update(Scene *scene, bSound *sound)
VecBase< float, 3 > float3
unsigned int id_session_uid
void * sound_scrub_handle
struct SoundInfo::@351331251115247062377132230300211145252373324171 specs
struct PackedFile * packedfile
struct PackedFile * newpackedfile
static void sound_jack_sync_callback(Main *bmain, int mode, double time)