blob: e1fac1cf6ca4232c531a48746ea395732de70c09 [file] [log] [blame]
// Copyright 2017 The Chromium 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 <memory>
#include "base/macros.h"
namespace chromecast {
namespace media {
// Handles setting the volume and mute state on the appropriate system mixer
// elements (based on command-line args); also detects changes to the mute state
// or volume and informs a delegate.
// Must be created on an IO thread, and all methods must be called on that
// thread.
class SystemVolumeControl {
class Delegate {
// Called whenever the system volume or mute state have changed.
// Unfortunately it is not possible in all cases to differentiate between
// a volume change and a mute change, so the two events must be combined.
virtual void OnSystemVolumeOrMuteChange(float new_volume,
bool new_mute) = 0;
virtual ~Delegate() = default;
static std::unique_ptr<SystemVolumeControl> Create(Delegate* delegate);
SystemVolumeControl() = default;
virtual ~SystemVolumeControl() = default;
// Returns the value that you would get if you called GetVolume() after
// SetVolume(volume).
virtual float GetRoundtripVolume(float volume) = 0;
// Returns the current system volume (0 <= volume <= 1).
virtual float GetVolume() = 0;
// Sets the system volume to |level| (0 <= level <= 1).
virtual void SetVolume(float level) = 0;
// Returns |true| if system is currently muted.
virtual bool IsMuted() = 0;
// Sets the system mute state to |muted|.
virtual void SetMuted(bool muted) = 0;
// Sets the system power save state to |power_save_on|.
virtual void SetPowerSave(bool power_save_on) = 0;
// Sets the volume limit to be applied to the system volume.
virtual void SetLimit(float limit) = 0;
} // namespace media
} // namespace chromecast