diff --git a/intern/object_mix.py b/intern/object_mix.py index 5b6e4c4..63b2596 100644 --- a/intern/object_mix.py +++ b/intern/object_mix.py @@ -4,12 +4,14 @@ from contextlib import contextmanager from fractions import Fraction from typing import List -from ear.fileio.adm.elements import (ObjectCartesianPosition, JumpPosition, - AudioBlockFormatObjects) -from ear.fileio.bw64 import Bw64Reader +import wave -from .geom_utils import (speaker_active_time_range, compute_relative_vector, - room_norm_vector) +# from ear.fileio.adm.elements import (ObjectCartesianPosition, JumpPosition, +# AudioBlockFormatObjects) +# from ear.fileio.bw64 import Bw64Reader + +# from .geom_utils import (speaker_active_time_range, compute_relative_vector, +# room_norm_vector) from .speaker_utils import solo_speakers, unmute_all_speakers @@ -50,33 +52,25 @@ class ObjectMix: def frame_end(self): return self.scene.frame_end - @property - def sample_rate(self): - return self.mixdown_reader.sampleRate + @property + def sample_rate(self) -> int | None: + if self.intermediate_filename: + with wave.open(self.intermediate_filename, "rb") as f: + return f.getframerate() + else: + return None @property - def bits_per_sample(self): - return self.mixdown_reader.bitdepth + def bits_per_sample(self) -> int | None: + with wave.open(self.mixdown_filename, "rb") as f: + return f.getsampwidth() * 8 @property - def mixdown_reader(self) -> Bw64Reader: - if self._mixdown_reader is None: - self._mixdown_reader = Bw64Reader(self.mixdown_file_handle) - - return self._mixdown_reader - - @property - def mixdown_file_handle(self): - assert self.mixdown_filename - if self._mixdown_file_handle is None: - self._mixdown_file_handle = open(self.mixdown_filename, 'rb') - - return self._mixdown_file_handle - - @property - def mixdown_filename(self): + def mixdown_filename(self) -> str: if self.intermediate_filename is None: self.mixdown() + + assert self.intermediate_filename return self.intermediate_filename @@ -102,43 +96,6 @@ class ObjectMix: unmute_all_speakers(scene) - def adm_block_formats(self, room_size=1.): - fps = self.scene.render.fps - block_formats = [] - - for speaker_obj in self.sources: - speaker_interval = speaker_active_time_range(speaker_obj) - for frame in range(speaker_interval.start_frame, - speaker_interval.end_frame + 1): - - assert self.scene.camera - self.scene.frame_set(frame) - relative_vector = compute_relative_vector( - camera=self.scene.camera, - target=speaker_obj) - - norm_vec = room_norm_vector( - relative_vector, room_size=room_size) - - pos = ObjectCartesianPosition(X=norm_vec.x, Y=norm_vec.y, - Z=norm_vec.z) - - if len(block_formats) == 0 or pos != block_formats[-1].position: - jp = JumpPosition( - flag=True, interpolationLength=Fraction(1, fps * 2)) - block = AudioBlockFormatObjects(position=pos, - rtime=Fraction(frame, fps), - duration=Fraction(1, fps), - cartesian=True, - jumpPosition=jp) - - block_formats.append(block) - else: - block_formats[-1].duration = block_formats[-1].duration + \ - Fraction(1, fps) - - return block_formats - def rm_mixdown(self): if self._mixdown_reader is not None: self._mixdown_reader = None diff --git a/intern/speaker_utils.py b/intern/speaker_utils.py index 9580b68..e0ea597 100644 --- a/intern/speaker_utils.py +++ b/intern/speaker_utils.py @@ -5,6 +5,10 @@ def all_speakers(scene: bpy.types.Scene) -> list[bpy.types.Object]: def solo_speakers(scene: bpy.types.Scene, solo_group: list[bpy.types.Object]): + """ + Mutes all Objects not in `solo_group` and ensures all objects in this group + are not muted. + """ for speaker in all_speakers(scene): assert type(speaker.data) is bpy.types.Speaker if speaker in solo_group: @@ -16,6 +20,9 @@ def solo_speakers(scene: bpy.types.Scene, solo_group: list[bpy.types.Object]): def unmute_all_speakers(scene): + """ + Unmutes all speakers. + """ for speaker in all_speakers(scene): assert type(speaker.data) is bpy.types.Speaker speaker.data.muted = False