Typos and fixes, runs in Blender

This commit is contained in:
Jamie Hardt
2020-09-20 20:54:53 -07:00
parent 0e471e3efd
commit df55519ea9
3 changed files with 45 additions and 37 deletions

View File

@@ -6,6 +6,7 @@ import lxml
import uuid import uuid
from fractions import Fraction from fractions import Fraction
import struct import struct
from os.path import dirname
import numpy 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.builder import (ADMBuilder)
from ear.fileio.adm.generate_ids import generate_ids 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_min_distance,
speakers_by_start_time) 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 group_speakers(speakers, scene) -> List[List[bpy.types.Object]]:
def list_can_accept_speaker(speaker_list, speaker_to_test): 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: if len(object_groups) == 0:
return {'FINISHED'} 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, mux_adm_from_object_mix_pool(scene, mix_pool=pool,
output_filename=filepath, output_filename=filepath,
room_size=room_size) room_size=room_size)

View File

@@ -1,9 +1,12 @@
import sys import sys
from math import sqrt from math import sqrt
import bpy
import numpy import numpy
from numpy.linalg import norm from numpy.linalg import norm
from mathutils import Vector, Quaternion
class FrameInterval: class FrameInterval:
def __init__(self, start_frame, end_frame): def __init__(self, start_frame, end_frame):

View File

@@ -7,9 +7,27 @@ from typing import List
from ear.fileio.adm.elements import ObjectCartesianPosition, JumpPosition, AudioBlockFormatObjects from ear.fileio.adm.elements import ObjectCartesianPosition, JumpPosition, AudioBlockFormatObjects
from ear.fileio.bw64 import Bw64Reader from ear.fileio.bw64 import Bw64Reader
from sound_objects.intern.generate_adm import adm_object_rendering_context from .geom_utils import speaker_active_time_range, compute_relative_vector, room_norm_vector
from sound_objects.intern.geom_utils import speaker_active_time_range, compute_relative_vector, room_norm_vector from .speaker_utils import solo_speakers, unmute_all_speakers
from sound_objects.intern.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: class ObjectMix:
@@ -115,21 +133,14 @@ class ObjectMix:
self._mixdown_file_handle.close() self._mixdown_file_handle.close()
self._mixdown_file_handle = None self._mixdown_file_handle = None
if self.intermediate_filename is not None:
os.remove(self.intermediate_filename) os.remove(self.intermediate_filename)
self.intermediate_filename = None self.intermediate_filename = None
@contextmanager #@contextmanager
class ObjectMixPool: 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]): def __init__(self, object_mixes: List[ObjectMix]):
self.object_mixes = object_mixes self.object_mixes = object_mixes
@@ -142,5 +153,13 @@ class ObjectMixPool:
@property @property
def shortest_file_length(self): 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) 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