diff --git a/sound_objects/intern/generate_adm.py b/sound_objects/intern/generate_adm.py index 74c6b97..7a864f9 100644 --- a/sound_objects/intern/generate_adm.py +++ b/sound_objects/intern/generate_adm.py @@ -6,6 +6,7 @@ import lxml import uuid from fractions import Fraction import struct +from os.path import dirname import numpy @@ -22,33 +23,15 @@ from ear.fileio.adm.xml import adm_to_xml from ear.fileio.adm.builder import (ADMBuilder) from ear.fileio.adm.generate_ids import generate_ids -from sound_objects.intern.geom_utils import (speaker_active_time_range, +from .geom_utils import (speaker_active_time_range, speakers_by_min_distance, speakers_by_start_time) -from sound_objects.intern.object_mix import (ObjectMix, ObjectMixPool) +from .object_mix import (ObjectMix, ObjectMixPool, object_mixes_from_source_groups) -from sound_objects.intern.speaker_utils import (all_speakers) +from .speaker_utils import (all_speakers) -@contextmanager -def adm_object_rendering_context(scene: bpy.types.Scene): - old_ff = scene.render.image_settings.file_format - old_codec = scene.render.ffmpeg.audio_codec - old_chans = scene.render.ffmpeg.audio_channels - - scene = bpy.context.scene - - scene.render.image_settings.file_format = 'FFMPEG' - scene.render.ffmpeg.audio_codec = 'PCM' - scene.render.ffmpeg.audio_channels = 'MONO' - - yield scene - - scene.render.image_settings.file_format = old_ff - scene.render.ffmpeg.audio_codec = old_codec - scene.render.ffmpeg.audio_channels = old_chans - def group_speakers(speakers, scene) -> List[List[bpy.types.Object]]: def list_can_accept_speaker(speaker_list, speaker_to_test): @@ -218,7 +201,10 @@ def generate_adm(context: bpy.types.Context, filepath: str, room_size: float, ma if len(object_groups) == 0: return {'FINISHED'} - with ObjectMixPool.pool_from_source_groups(object_groups) as pool: + mix_groups = object_mixes_from_source_groups(object_groups, + scene=scene, base_dir=dirname(filepath)) + + with ObjectMixPool(object_mixes=mix_groups) as pool: mux_adm_from_object_mix_pool(scene, mix_pool=pool, output_filename=filepath, room_size=room_size) diff --git a/sound_objects/intern/geom_utils.py b/sound_objects/intern/geom_utils.py index 89c04e7..21104d0 100644 --- a/sound_objects/intern/geom_utils.py +++ b/sound_objects/intern/geom_utils.py @@ -1,9 +1,12 @@ import sys from math import sqrt +import bpy + import numpy from numpy.linalg import norm +from mathutils import Vector, Quaternion class FrameInterval: def __init__(self, start_frame, end_frame): diff --git a/sound_objects/intern/object_mix.py b/sound_objects/intern/object_mix.py index 8af599a..251f4b6 100644 --- a/sound_objects/intern/object_mix.py +++ b/sound_objects/intern/object_mix.py @@ -7,9 +7,27 @@ from typing import List from ear.fileio.adm.elements import ObjectCartesianPosition, JumpPosition, AudioBlockFormatObjects from ear.fileio.bw64 import Bw64Reader -from sound_objects.intern.generate_adm import adm_object_rendering_context -from sound_objects.intern.geom_utils import speaker_active_time_range, compute_relative_vector, room_norm_vector -from sound_objects.intern.speaker_utils import solo_speakers, unmute_all_speakers +from .geom_utils import speaker_active_time_range, compute_relative_vector, room_norm_vector +from .speaker_utils import solo_speakers, unmute_all_speakers + + +@contextmanager +def adm_object_rendering_context(scene: bpy.types.Scene): + old_ff = scene.render.image_settings.file_format + old_codec = scene.render.ffmpeg.audio_codec + old_chans = scene.render.ffmpeg.audio_channels + + scene = bpy.context.scene + + scene.render.image_settings.file_format = 'FFMPEG' + scene.render.ffmpeg.audio_codec = 'PCM' + scene.render.ffmpeg.audio_channels = 'MONO' + + yield scene + + scene.render.image_settings.file_format = old_ff + scene.render.ffmpeg.audio_codec = old_codec + scene.render.ffmpeg.audio_channels = old_chans class ObjectMix: @@ -115,21 +133,14 @@ class ObjectMix: self._mixdown_file_handle.close() self._mixdown_file_handle = None - os.remove(self.intermediate_filename) - self.intermediate_filename = None + if self.intermediate_filename is not None: + os.remove(self.intermediate_filename) + self.intermediate_filename = None -@contextmanager +#@contextmanager class ObjectMixPool: - @classmethod - def pool_from_source_groups(cls, groups: List[List[bpy.types.Speaker]]): - mixes = [] - for group in groups: - mixes.append(ObjectMix(sources=group)) - - return ObjectMixPool(object_mixes=mixes) - def __init__(self, object_mixes: List[ObjectMix]): self.object_mixes = object_mixes @@ -142,5 +153,13 @@ class ObjectMixPool: @property def shortest_file_length(self): - lengths = map(lambda f: len(f.mixdown_reader)) + lengths = map(lambda f: len(f.mixdown_reader), self.object_mixes) return min(lengths) + + +def object_mixes_from_source_groups(groups: List[List[bpy.types.Speaker]], scene, base_dir): + mixes = [] + for group in groups: + mixes.append(ObjectMix(sources=group, scene=scene, base_dir=base_dir)) + + return mixes