Beispiel #1
0
def test_comparison(context):
    """Test basic comparisons."""
    with Source() as source0, Source() as source1, Source() as source2:
        assert source0 != source1
        sources = [source1, source1, source0, source2]
        sources.sort()
        sources.remove(source2)
        sources.remove(source0)
        assert sources[0] == sources[1]
Beispiel #2
0
def play(files: Iterable[str], device: str, reverb: str) -> None:
    """Load and play files on the given device."""
    with Device(device) as dev, Context(dev) as ctx:
        print('Opened', dev.name)
        print('Loading reverb preset', reverb)
        with Source() as src, ReverbEffect(reverb) as fx:
            src.sends[0].effect = fx
            for filename in files:
                try:
                    decoder = decode(filename)
                except RuntimeError:
                    stderr.write(f'Failed to open file: {filename}\n')
                    continue
                decoder.play(CHUNK_LEN, QUEUE_SIZE, src)
                print(f'Playing {filename} ({decoder.sample_type},',
                      f'{decoder.channel_config}, {decoder.frequency} Hz)')
                while src.playing:
                    print(
                        f' {pretty_time(src.offset_seconds)} /'
                        f' {pretty_time(decoder.length_seconds)}',
                        end='\r',
                        flush=True)
                    sleep(PERIOD)
                    ctx.update()
                print()
Beispiel #3
0
def test_gain_auto(context):
    """Test read-write property gain_auto."""
    with Source(context) as source:
        assert all(gain is True for gain in source.gain_auto)
        for gain_auto in product(*repeat((False, True), 3)):
            source.gain_auto = gain_auto
            assert all(map(is_, source.gain_auto, gain_auto))
Beispiel #4
0
def test_relative(context):
    """Test read-write property relative."""
    with Source(context) as source:
        assert source.relative is False
        source.relative = True
        assert source.relative is True
        source.relative = False
        assert source.relative is False
Beispiel #5
0
def test_radius(context):
    """Test read-write property radius."""
    with Source(context) as source:
        assert isclose(source.radius, 0)
        with raises(ValueError):
            source.radius = -1
        source.radius = 5 / 7
        assert isclose(source.radius, 5 / 7)
Beispiel #6
0
def test_velocity(context):
    """Test read-write property velocity."""
    with Source(context) as source:
        assert allclose(source.velocity, (0, 0, 0))
        source.velocity = -1, 0, 1
        assert allclose(source.velocity, (-1, 0, 1))
        source.velocity = 4, 20, 69
        assert allclose(source.velocity, (4, 20, 69))
Beispiel #7
0
def test_position(context):
    """Test read-write property position."""
    with Source(context) as source:
        assert allclose(source.position, (0, 0, 0))
        source.position = -1, 0, 1
        assert allclose(source.position, (-1, 0, 1))
        source.position = 4, 20, 69
        assert allclose(source.position, (4, 20, 69))
Beispiel #8
0
def test_stereo_angles(context):
    """Test read-write property stereo_angles."""
    with Source(context) as source:
        assert allclose(source.stereo_angles, (pi / 6, -pi / 6))
        source.stereo_angles = 420, -69
        assert allclose(source.stereo_angles, (420, -69))
        source.stereo_angles = -5 / 7, 9 / 11
        assert allclose(source.stereo_angles, (-5 / 7, 9 / 11))
Beispiel #9
0
def test_gain(context):
    """Test read-write property gain."""
    with Source(context) as source:
        assert isclose(source.gain, 1)
        with raises(ValueError):
            source.gain = -1
        source.gain = 5 / 7
        assert isclose(source.gain, 5 / 7)
Beispiel #10
0
def test_pitch(context):
    """Test read-write property pitch."""
    with Source(context) as source:
        assert isclose(source.pitch, 1)
        with raises(ValueError):
            source.pitch = -1
        source.pitch = 5 / 7
        assert isclose(source.pitch, 5 / 7)
Beispiel #11
0
def test_looping(context):
    """Test read-write property looping."""
    with Source(context) as source:
        assert source.looping is False
        source.looping = True
        assert source.looping is True
        source.looping = False
        assert source.looping is False
Beispiel #12
0
def test_resampler_index(context):
    """Test read-write property resampler_index."""
    with Source() as source:
        assert source.resampler_index == context.default_resampler_index
        with raises(ValueError):
            source.resampler_index = -1
        source.resampler_index = 69
        assert source.resampler_index == 69
Beispiel #13
0
def test_group(context):
    """Test read-write property group."""
    with Source(context) as source, SourceGroup(context) as source_group:
        assert source.group is None
        source.group = source_group
        assert source.group == source_group
        assert source in source_group.sources
        source.group = None
        assert source.group is None
Beispiel #14
0
def test_rolloff_factors(context):
    """Test read-write property rolloff_factors."""
    with Source(context) as source:
        assert allclose(source.rolloff_factors, (1, 0))
        with raises(ValueError):
            source.rolloff_factors = -6, 9
        with raises(ValueError):
            source.rolloff_factors = 6, -9
        source.rolloff_factors = 6, 9
        assert allclose(source.rolloff_factors, (6, 9))
Beispiel #15
0
def test_air_absorption_factor(context):
    """Test read-write property air_absorption_factor."""
    with Source(context) as source:
        assert isclose(source.air_absorption_factor, 0)
        with raises(ValueError):
            source.air_absorption_factor = -1
        with raises(ValueError):
            source.air_absorption_factor = 11
        source.air_absorption_factor = 420 / 69
        assert isclose(source.air_absorption_factor, 420 / 69)
Beispiel #16
0
def test_filter(context):
    """Test write-only property filter."""
    with Source() as source:
        with raises(AttributeError):
            source.filter
        source.filter = 1, 6.9, 5 / 7
        source.filter = 0, 0, 0
        for gain, gain_hf, gain_lf in permutations([4, -2, 0]):
            with raises(ValueError):
                source.filter = gain, gain_hf, gain_lf
Beispiel #17
0
def test_doppler_factor(context):
    """Test read-write property doppler_factor."""
    with Source(context) as source:
        assert isclose(source.doppler_factor, 1)
        with raises(ValueError):
            source.doppler_factor = -6.9
        with raises(ValueError):
            source.doppler_factor = 4.20
        source.doppler_factor = 5 / 7
        assert isclose(source.doppler_factor, 5 / 7)
Beispiel #18
0
def test_spatialize(context):
    """Test read-write property spatialize."""
    with Source(context) as source:
        assert source.spatialize is None
        source.spatialize = False
        assert source.spatialize is False
        source.spatialize = True
        assert source.spatialize is True
        source.spatialize = None
        assert source.spatialize is None
Beispiel #19
0
def test_gain_range(context):
    """Test read-write property gain_range."""
    with Source(context) as source:
        assert allclose(source.gain_range, (0, 1))
        with raises(ValueError):
            source.gain_range = 9 / 11, 5 / 7
        with raises(ValueError):
            source.gain_range = 6 / 9, 420
        with raises(ValueError):
            source.gain_range = -420, 6 / 9
        source.gain_range = 5 / 7, 9 / 11
        assert allclose(source.gain_range, (5 / 7, 9 / 11))
Beispiel #20
0
def test_cone_angles(context):
    """Test read-write property cone_angles."""
    with Source(context) as source:
        assert allclose(source.cone_angles, (360, 360))
        with raises(ValueError):
            source.cone_angles = 420, 69
        with raises(ValueError):
            source.cone_angles = -4.20, 69
        with raises(ValueError):
            source.cone_angles = 4.20, -69
        source.cone_angles = 4.20, 69
        assert allclose(source.cone_angles, (4.20, 69))
Beispiel #21
0
def test_distance_range(context):
    """Test read-write property distance_range."""
    with Source(context) as source:
        assert allclose(source.distance_range, (1, FLT_MAX))
        with raises(ValueError):
            source.distance_range = 9 / 11, 5 / 7
        with raises(ValueError):
            source.distance_range = -420, 6 / 9
        with raises(ValueError):
            source.distance_range = 420, inf
        source.distance_range = 5 / 7, 9 / 11
        assert allclose(source.distance_range, (5 / 7, 9 / 11))
        source.distance_range = 1, FLT_MAX
        assert allclose(source.distance_range, (1, FLT_MAX))
Beispiel #22
0
def test_outer_cone_gains(context):
    """Test read-write property outer_cone_gains."""
    with Source(context) as source:
        assert allclose(source.outer_cone_gains, (0, 1))
        with raises(ValueError):
            source.outer_cone_gains = 6 / 9, -420
        with raises(ValueError):
            source.outer_cone_gains = 6 / 9, 420
        with raises(ValueError):
            source.outer_cone_gains = -420, 6 / 9
        with raises(ValueError):
            source.outer_cone_gains = 420, 6 / 9
        source.outer_cone_gains = 5 / 7, 9 / 11
        assert allclose(source.outer_cone_gains, (5 / 7, 9 / 11))
Beispiel #23
0
def play(files: Iterable[str], device: str, hrtf_name: str,
         omega: float) -> None:
    """Render files using HRTF with source rotating in omega rad/s."""
    with Device(device) as dev:
        print('Opened', dev.name)
        hrtf_names = dev.hrtf_names
        if hrtf_names:
            print('Available HRTFs:')
            for name in hrtf_names:
                print(f'    {name}')
        else:
            print('No HRTF found!')
        attrs = {HRTF: TRUE}
        if hrtf_name is not None:
            try:
                attrs[HRTF_ID] = hrtf_names.index(hrtf_name)
            except ValueError:
                stderr.write(f'HRTF {hrtf_name!r} not found\n')

        with Context(dev, attrs) as ctx, Source() as src:
            if dev.hrtf_enabled:
                print(f'Using HRTF {dev.current_hrtf!r}')
            else:
                print('HRTF not enabled!')
            src.spatialize = True

            for filename in files:
                try:
                    decoder = decode(filename)
                except RuntimeError:
                    stderr.write(f'Failed to open file: {filename}\n')
                    continue
                decoder.play(CHUNK_LEN, QUEUE_SIZE, src)
                print(f'Playing {filename} ({decoder.sample_type},',
                      f'{decoder.channel_config}, {decoder.frequency} Hz)')

                for i in takewhile(lambda i: src.playing, count(step=PERIOD)):
                    print(
                        f' {pretty_time(src.offset_seconds)} /'
                        f' {pretty_time(decoder.length_seconds)}',
                        end='\r',
                        flush=True)
                    src.position = sin(i * omega), 0, -cos(i * omega)
                    sleep(PERIOD)
                    ctx.update()
                print()
Beispiel #24
0
def play(files: Iterable[str], device: str) -> None:
    """Load and play the file on given device."""
    with Device(device) as dev, Context(dev) as ctx, Source() as src:
        print('Opened', dev.name)
        for filename in files:
            try:
                decoder = decode(filename)
            except RuntimeError:
                stderr.write(f'Failed to open file: {filename}\n')
            decoder.play(CHUNK_LEN, QUEUE_SIZE, src)
            print(f'Playing {filename} ({decoder.sample_type},',
                  f'{decoder.channel_config}, {decoder.frequency} Hz)')
            while src.playing:
                print('Offset:',
                      round(src.offset_seconds),
                      's - Latency:',
                      src.latency // 10**6,
                      'ms',
                      end='\r',
                      flush=True)
                sleep(PERIOD)
                ctx.update()
            print()
Beispiel #25
0
def tests_sends(device, context):
    """Test send paths assignment."""
    with Source() as source, BaseEffect() as effect:
        invalid_filter = [-1, 0, 1]
        for i in range(device.max_auxiliary_sends):
            source.sends[i].effect = effect
            source.sends[i].filter = random(), random(), random()
            shuffle(invalid_filter)
            with raises(ValueError):
                source.sends[i].filter = invalid_filter
            with raises(AttributeError):
                source.sends[i].effect
            with raises(AttributeError):
                source.sends[i].filter
        with raises(IndexError):
            source.sends[-1]
        with raises(TypeError):
            source.sends[4.2]
        with raises(TypeError):
            source.sends['0']
        with raises(TypeError):
            source.sends[6:9]
        with raises(AttributeError):
            source.sends = ...
def test_source_setter(data):
    """Test setters of a Source when its context is not current."""
    with Device() as device, Context(device), Source() as source:
        with raises(RuntimeError), Context(device):
            setattr(source, data, getattr(source, data))
Beispiel #27
0
def test_priority(context):
    """Test read-write property priority."""
    with Source(context) as source:
        assert source.priority == 0
        source.priority = 42
        assert source.priority == 42
Beispiel #28
0
 def source_stopped(self, source: Source) -> None:
     """Destroy the source as playback finishes."""
     source.destroy()
Beispiel #29
0
def test_bool(context):
    """Test boolean value."""
    with Source() as source:
        assert source
    assert not source
Beispiel #30
0
def test_orientation(context):
    """Test read-write property orientation."""
    with Source(context) as source:
        assert allclose(source.orientation, ((0, 0, -1), (0, 1, 0)), allclose)
        source.orientation = (1, 1, -2), (3, -5, 8)
        assert allclose(source.orientation, ((1, 1, -2), (3, -5, 8)), allclose)