Commit 166ecacc authored by Archit Tamarapu's avatar Archit Tamarapu
Browse files

- add missing errors for delay and trim related to metadata based formats

- simplify isinstance() checks to check against a tuple for better readability
- add missing checks against OMASA and OSBA in the above instances
parent a7f78b6b
Loading
Loading
Loading
Loading
Loading
+19 −14
Original line number Diff line number Diff line
@@ -163,9 +163,7 @@ def convert_file(
    # write output audio
    write(out_file, output.audio, output.fs)
    # write metadata
    if isinstance(output, audio.ObjectBasedAudio) or isinstance(
        output, audio.OSBAAudio
    ):
    if isinstance(output, (audio.ObjectBasedAudio, audio.OSBAAudio)):
        write_ISM_metadata_in_file(output.object_pos, [out_file], automatic_naming=True)
    elif isinstance(output, audio.MetadataAssistedSpatialAudio) and in_fmt == out_fmt:
        # audio objects point to same MD file, create new one with default naming for output
@@ -292,16 +290,26 @@ def process_audio(

    """delay audio"""
    if delay is not None:
        if isinstance(x, audio.ObjectBasedAudio):
            raise ValueError("Delay not possible for ISM input")
        if isinstance(
            x,
            (
                audio.ObjectBasedAudio,
                audio.MetadataAssistedSpatialAudio,
                audio.OMASAAudio,
                audio.OSBAAudio,
            ),
        ):
            raise ValueError("Delay not possible for ISM, MASA, OMASA and OSBA inputs")
        if logger:
            logger.debug(f"Delaying audio by {delay} ms")
        x.audio = audioarray.delay(x.audio, x.fs, delay)

    """trim or pad audio"""
    if trim is not None:
        if isinstance(x, audio.ObjectBasedAudio):
            # metadata concatenation necessary for ISM
        if isinstance(x, (audio.MetadataAssistedSpatialAudio, audio.OMASAAudio)):
            raise ValueError("Trimming not possible for MASA and OMASA inputs")
        elif isinstance(x, (audio.ObjectBasedAudio, audio.OSBAAudio)):
            # metadata concatenation necessary for ISM/OSBA
            metadata.trim_meta(x, tuple(trim), pad_noise)
        else:
            x.audio = audioarray.trim(x.audio, x.fs, tuple(trim), pad_noise)
@@ -388,12 +396,11 @@ def format_conversion(
    # validation
    # check for MASA/OMASA as output
    if isinstance(output, audio.MetadataAssistedSpatialAudio) and not (
        isinstance(input, audio.SceneBasedAudio)
        or isinstance(input, audio.MetadataAssistedSpatialAudio)
        isinstance(input, (audio.MetadataAssistedSpatialAudio, audio.SceneBasedAudio))
    ):
        raise NotImplementedError("Can only convert to MASA from SBA")
    if isinstance(output, audio.OMASAAudio) and not (
        isinstance(input, audio.OSBAAudio) or isinstance(input, audio.OMASAAudio)
        isinstance(input, (audio.OSBAAudio, audio.OMASAAudio))
    ):
        raise NotImplementedError("Can only convert to OMASA from OSBA")

@@ -402,10 +409,8 @@ def format_conversion(
        raise NotImplementedError(
            "ISM is not supported as an output for rendering! Only usable as pass-through"
        )
    if isinstance(output, audio.OMASAAudio) or isinstance(output, audio.OSBAAudio):
        if not (
            isinstance(input, audio.OMASAAudio) or isinstance(input, audio.OSBAAudio)
        ):
    if isinstance(output, (audio.OMASAAudio, audio.OSBAAudio)):
        if not isinstance(input, (audio.OMASAAudio, audio.OSBAAudio)):
            raise NotImplementedError(
                "OMASA and OSBA only possible as output if input is OMASA or OSBA"
            )
+5 −9
Original line number Diff line number Diff line
@@ -89,9 +89,7 @@ def bs1770demo(
            'A bs1770demo executable without RMS support (cmdl option "-rms") was detected. Please update the bs1770demo executable. See bin/README.md for details.'
        )

    if not isinstance(input, audio.BinauralAudio) and not isinstance(
        input, audio.ChannelBasedAudio
    ):
    if not isinstance(input, (audio.BinauralAudio, audio.ChannelBasedAudio)):
        raise NotImplementedError(
            f"{input.name} is unsupported in ITU-R BS.1770-4. Ensure loudness format was set correctly in CLI/YAML."
        )
@@ -194,14 +192,12 @@ def get_loudness(

    if loudness_format is None:
        # for some formats rendering is necessary prior to loudness measurement
        if isinstance(input, audio.SceneBasedAudio) or isinstance(
            input, audio.MetadataAssistedSpatialAudio
        if isinstance(
            input, (audio.SceneBasedAudio, audio.MetadataAssistedSpatialAudio)
        ):
            loudness_format = "7_1_4"
        elif (
            isinstance(input, audio.ObjectBasedAudio)
            or isinstance(input, audio.OMASAAudio)
            or isinstance(input, audio.OSBAAudio)
        elif isinstance(
            input, (audio.ObjectBasedAudio, audio.OMASAAudio, audio.OSBAAudio)
        ):
            loudness_format = "BINAURAL"
        elif hasattr(input, "layout_file"):
+1 −3
Original line number Diff line number Diff line
@@ -152,9 +152,7 @@ class IVAS(Processing):
        if isinstance(self.in_fmt, audio.MetadataAssistedSpatialAudio):
            md_file = in_file.parent / (in_file.name + ".met")
            metadata_files.append(md_file)
        elif isinstance(self.in_fmt, audio.ObjectBasedAudio) or isinstance(
            self.in_fmt, audio.OSBAAudio
        ):
        elif isinstance(self.in_fmt, (audio.ObjectBasedAudio, audio.OSBAAudio)):
            metadata_files = in_meta
        elif isinstance(self.in_fmt, audio.OMASAAudio):
            metadata_files = in_meta
+2 −2
Original line number Diff line number Diff line
@@ -64,8 +64,8 @@ class Preprocessing2(Processing):
            self.in_fmt, in_file, fs=self.in_fs, in_meta=in_meta
        )

        if isinstance(audio_object, audio.MetadataAssistedSpatialAudio) or isinstance(
            audio_object, audio.OMASAAudio
        if isinstance(
            audio_object, (audio.MetadataAssistedSpatialAudio, audio.OMASAAudio)
        ):
            if self.preamble > 0 or self.background_noise or self.repeat_signal:
                raise ValueError(
+34 −9
Original line number Diff line number Diff line
@@ -60,7 +60,10 @@ class Processing_splitting_scaling(Processing):

        # read file and metadata
        x, fs = read(in_file, nchannels=num_channels, fs=self.fs)
        if isinstance(audio.fromtype(self.out_fmt), audio.ObjectBasedAudio):
        if isinstance(
            audio.fromtype(self.out_fmt),
            (audio.ObjectBasedAudio, audio.OMASAAudio, audio.OSBAAudio),
        ):
            meta_arrays = []
            for meta in in_meta:
                meta_arrays.append(np.genfromtxt(meta, delimiter=","))
@@ -72,7 +75,10 @@ class Processing_splitting_scaling(Processing):
            in_file_noerror = Path(f"{in_file.with_suffix('')}.noerror.wav")
            out_file_noerror = Path(f"{out_file.with_suffix('')}.noerror.wav")
            x_noerror, _ = read(in_file_noerror, nchannels=num_channels, fs=self.fs)
            if isinstance(audio.fromtype(self.out_fmt), audio.ObjectBasedAudio):
            if isinstance(
                audio.fromtype(self.out_fmt),
                (audio.ObjectBasedAudio, audio.OMASAAudio, audio.OSBAAudio),
            ):
                meta_arrays_noerror = []
                for meta in in_meta:
                    path_parts = str(meta).split(".")
@@ -153,7 +159,10 @@ class Processing_splitting_scaling(Processing):
                    str(f).replace(tmp_name, out_name).replace(f".{self.name}.", ".")
                )
            out_out_files.append(f_out)
        if isinstance(audio.fromtype(self.out_fmt), audio.ObjectBasedAudio):
        if isinstance(
            audio.fromtype(self.out_fmt),
            (audio.ObjectBasedAudio, audio.OMASAAudio, audio.OSBAAudio),
        ):
            out_out_meta = []
            for f in out_out_files:
                oom = []
@@ -170,7 +179,10 @@ class Processing_splitting_scaling(Processing):
        ):
            write(of, file_s, fs)
            write(oof, file_s, fs)
            if isinstance(audio.fromtype(self.out_fmt), audio.ObjectBasedAudio):
            if isinstance(
                audio.fromtype(self.out_fmt),
                (audio.ObjectBasedAudio, audio.OMASAAudio, audio.OSBAAudio),
            ):
                write_ISM_metadata_in_file(meta_s, om)
                write_ISM_metadata_in_file(meta_s, oom)
        # write noerror files in tmp folder
@@ -182,7 +194,10 @@ class Processing_splitting_scaling(Processing):
                meta_splits_noerror,
            ):
                write(ofne, file_sne, fs)
                if isinstance(audio.fromtype(self.out_fmt), audio.ObjectBasedAudio):
                if isinstance(
                    audio.fromtype(self.out_fmt),
                    (audio.ObjectBasedAudio, audio.OMASAAudio, audio.OSBAAudio),
                ):
                    write_ISM_metadata_in_file(meta_sne, omne)

    def revert_preamble_concatenation(
@@ -257,7 +272,10 @@ class Processing_splitting_scaling(Processing):
                    for sn in split_names
                ]

            if isinstance(audio.fromtype(self.out_fmt), audio.ObjectBasedAudio):
            if isinstance(
                audio.fromtype(self.out_fmt),
                (audio.ObjectBasedAudio, audio.OMASAAudio, audio.OSBAAudio),
            ):
                out_meta = []
                for of in out_files:
                    of_list = []
@@ -271,7 +289,10 @@ class Processing_splitting_scaling(Processing):
            # set output values
            out_files = [out_file]
            file_splits = [x]
            if isinstance(audio.fromtype(self.out_fmt), audio.ObjectBasedAudio):
            if isinstance(
                audio.fromtype(self.out_fmt),
                (audio.ObjectBasedAudio, audio.OMASAAudio, audio.OSBAAudio),
            ):
                meta_splits = [in_meta]
                out_meta = [
                    [
@@ -305,7 +326,9 @@ def adjust_loudness(
    scaled_signals = []
    for f, m in zip(file_splits, meta):
        audio_object = audio.fromarray(fmt=out_fmt, x=f, fs=fs)
        if isinstance(audio_object, audio.ObjectBasedAudio):
        if isinstance(
            audio_object, (audio.ObjectBasedAudio, audio.OMASAAudio, audio.OSBAAudio)
        ):
            audio_object.object_pos = m
        scaled_signal, _ = loudness_norm(
            audio_object, loudness, loudness_fmt, logger=logger
@@ -322,7 +345,9 @@ def measure_loudness(file_splits, out_fmt, fs, loudness, loudness_fmt, meta, log
    scaling_splits = []
    for f, m in zip(file_splits, meta):
        audio_object = audio.fromarray(fmt=out_fmt, x=f, fs=fs)
        if isinstance(audio_object, audio.ObjectBasedAudio):
        if isinstance(
            audio_object, (audio.ObjectBasedAudio, audio.OMASAAudio, audio.OSBAAudio)
        ):
            audio_object.object_pos = m
        _, scale_factor = loudness_norm(
            audio_object, loudness, loudness_fmt, logger=logger