blob: 210b1892e03aec7802eff734c2bd9a0e98f4dd26 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <fuchsia/media/cpp/fidl.h>
#include <cmath>
#include "src/media/audio/lib/test/hermetic_audio_test.h"
using AudioCaptureUsage = fuchsia::media::AudioCaptureUsage;
using AudioRenderUsage = fuchsia::media::AudioRenderUsage;
namespace media::audio::test {
class VolumeControlTest : public HermeticAudioTest {
protected:
fuchsia::media::audio::VolumeControlPtr CreateRenderUsageControl(AudioRenderUsage u) {
fuchsia::media::audio::VolumeControlPtr c;
audio_core_->BindUsageVolumeControl(fuchsia::media::Usage::WithRenderUsage(std::move(u)),
c.NewRequest());
AddErrorHandler(c, "VolumeControl");
return c;
}
};
TEST_F(VolumeControlTest, SetVolumeAndMute) {
auto client1 = CreateRenderUsageControl(AudioRenderUsage::MEDIA);
auto client2 = CreateRenderUsageControl(AudioRenderUsage::MEDIA);
float volume = 0.0;
bool muted = false;
auto add_callback = [this, &client2, &volume, &muted]() {
client2.events().OnVolumeMuteChanged =
AddCallback("OnVolumeMuteChanged", [&volume, &muted](float new_volume, bool new_muted) {
volume = new_volume;
muted = new_muted;
});
};
// The initial callback happens immediately.
add_callback();
ExpectCallback();
EXPECT_FLOAT_EQ(volume, 1.0);
EXPECT_EQ(muted, false);
// Further callbacks happen in response to events.
add_callback();
client1->SetVolume(0.5);
ExpectCallback();
EXPECT_FLOAT_EQ(volume, 0.5);
EXPECT_EQ(muted, false);
add_callback();
client1->SetMute(true);
ExpectCallback();
EXPECT_EQ(muted, true);
// Unmute should restore the volume.
add_callback();
client1->SetMute(false);
ExpectCallback();
EXPECT_FLOAT_EQ(volume, 0.5);
EXPECT_EQ(muted, false);
}
TEST_F(VolumeControlTest, RoutedCorrectly) {
auto c1 = CreateRenderUsageControl(AudioRenderUsage::MEDIA);
auto c2 = CreateRenderUsageControl(AudioRenderUsage::BACKGROUND);
// The initial callbacks happen immediately.
c1.events().OnVolumeMuteChanged = AddCallback("OnVolumeMuteChanged1 InitialCall");
c2.events().OnVolumeMuteChanged = AddCallback("OnVolumeMuteChanged2 InitialCall");
ExpectCallback();
// Routing to c1.
c1.events().OnVolumeMuteChanged = AddCallback("OnVolumeMuteChanged1 RouteTo1");
c2.events().OnVolumeMuteChanged = AddUnexpectedCallback("OnVolumeMuteChanged2 RouteTo1");
c1->SetVolume(0);
ExpectCallback();
// Routing to c2.
c1.events().OnVolumeMuteChanged = AddUnexpectedCallback("OnVolumeMuteChanged1 RouteTo2");
c2.events().OnVolumeMuteChanged = AddCallback("OnVolumeMuteChanged2 RouteTo2");
c2->SetVolume(0);
ExpectCallback();
}
TEST_F(VolumeControlTest, FailToConnectToCaptureUsageVolume) {
fuchsia::media::Usage usage;
usage.set_capture_usage(fuchsia::media::AudioCaptureUsage::SYSTEM_AGENT);
fuchsia::media::audio::VolumeControlPtr client;
audio_core_->BindUsageVolumeControl(fidl::Clone(usage), client.NewRequest());
AddErrorHandler(client, "VolumeControl");
ExpectError(client, ZX_ERR_NOT_SUPPORTED);
}
} // namespace media::audio::test