blob: c554a56f76bdcabdec3e1a65422f2c51558c7cf0 [file] [log] [blame]
// Copyright 2015 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.
#ifndef CHROMECAST_PUBLIC_AVSETTINGS_H_
#define CHROMECAST_PUBLIC_AVSETTINGS_H_
#include "task_runner.h"
namespace chromecast {
// Pure abstract interface to get and set media-related information. Each
// platform must provide its own implementation.
// All functions except constructor and destructor are called in one thread.
// All delegate functions can be called by platform implementation on any
// threads, for example, created by platform implementation internally.
class AvSettings {
public:
// Defines whether or not the cast receiver is the current active source of
// the screen. If the device is connected to HDMI sinks, it may be unknown.
enum ActiveState {
UNKNOWN,
STANDBY, // Screen is off
INACTIVE, // Screen is on, but cast receiver is not active
ACTIVE, // Screen is on and cast receiver is active
};
// Audio codec supported by the device (or HDMI sink).
enum AudioCodec {
AC3 = 1 << 0,
DTS = 1 << 1,
DTS_HD = 1 << 2,
EAC3 = 1 << 3,
LPCM = 1 << 4,
};
enum Event {
// This event shall be fired whenever the active state is changed including
// when the screen turned on, when the cast receiver (or the device where
// cast receiver is running on) became the active input source, or after a
// call to TurnActive() or TurnStandby().
// WakeSystem() may change the active state depending on implementation.
// On this event, GetActiveState() will be called on the thread where
// Initialize() was called.
ACTIVE_STATE_CHANGED = 0,
// This event shall be fired whenever the system volume level or muted state
// are changed including when user changed volume via a remote controller,
// or after a call to SetAudioVolume() or SetAudioMuted().
// On this event, GetAudioVolume() and IsAudioMuted() will be called on
// the thread where Initialize() was called.
AUDIO_VOLUME_CHANGED = 1,
// This event shall be fired whenever the audio codecs supported by the
// device (or HDMI sinks connected to the device) are changed.
// On this event, GetAudioCodecsSupported() and GetMaxAudioChannels() will
// be called on the thread where Initialize() was called.
AUDIO_CODECS_SUPPORTED_CHANGED = 2,
// This event shall be fired whenever the screen information of the device
// (or HDMI sinks connected to the device) are changed including screen
// resolution.
// On this event, GetScreenResolution() will be called on the thread where
// Initialize() was called.
SCREEN_INFO_CHANGED = 3,
// This event should be fired when the device is connected to HDMI sinks.
HDMI_CONNECTED = 100,
// This event should be fired when the device is disconnected to HDMI sinks.
HDMI_DISCONNECTED = 101,
};
// Delegate to inform the caller events. As a subclass of TaskRunner,
// AvSettings implementation can post tasks to the thread where Initialize()
// was called.
class Delegate : public TaskRunner {
public:
// This may be invoked to posts a task to the thread where Initialize() was
// called.
bool PostTask(Task* task, uint64_t delay_ms) override = 0;
// This must be invoked to fire an event when one of the conditions
// described above (Event) happens.
virtual void OnMediaEvent(Event event) = 0;
// This should be invoked when a key is pressed.
// |key_code| is a CEC code defined in User Control Codes table of the CEC
// specification (CEC Table 30 in the HDMI 1.4a specification).
virtual void OnKeyPressed(int key_code) = 0;
protected:
~Delegate() override {}
};
virtual ~AvSettings() {}
// Initializes avsettings and starts delivering events to |delegate|.
// |delegate| must not be null.
virtual void Initialize(Delegate* delegate) = 0;
// Finalizes avsettings. It must assume |delegate| passed to Initialize() is
// invalid after this call and stop delivering events.
virtual void Finalize() = 0;
// Returns current active state.
virtual ActiveState GetActiveState() = 0;
// Turns the screen on and sets the active input to the cast receiver.
// If successful, it must return true and fire ACTIVE_STATE_CHANGED.
virtual bool TurnActive() = 0;
// Turns the screen off (or stand-by). If the device is connecting to HDMI
// sinks, broadcasts a CEC standby message on the HDMI control bus to put all
// sink devices (TV, AVR) into a standby state.
// If successful, it must return true and fire ACTIVE_STATE_CHANGED.
virtual bool TurnStandby() = 0;
// Requests the system where cast receiver is running on to be kept awake for
// |time_ms|. If the system is already being kept awake, the period should be
// extended from |time_ms| in the future.
// It will be called when cast senders discover the cast receiver while the
// system is in a stand-by mode (or a deeper sleeping/dormant mode depending
// on the system). To respond to cast senders' requests, cast receiver needs
// the system awake for given amount of time. The system should not turn
// screen on.
// Returns true if successful.
virtual bool KeepSystemAwake(int time_ms) = 0;
// Whether or not the device is a master volume system, i.e the system volume
// is changed, but not attenuated. For example, normal TVs, devices of CEC
// audio controls, and audio devices are master volume systems.
// The counter examples are Chromecast (which doesn't do CEC audio controls)
// and Nexus Player (which has volume fixed).
virtual bool IsMasterVolumeDevice() = 0;
// Returns the current volume level, which must be from 0.0 (inclusive) to
// 1.0 (inclusive).
virtual float GetAudioVolume() = 0;
// Sets new volume level of the device (or HDMI sinks). |level| is from 0.0
// (inclusive) to 1.0 (inclusive).
// If successful and the level has changed, it must return true and fire
// AUDIO_VOLUME_CHANGED.
virtual bool SetAudioVolume(float level) = 0;
// Whether or not the device (or HDMI sinks) is muted.
virtual bool IsAudioMuted() = 0;
// Sets the device (or HDMI sinks) muted.
// If successful and the muted state has changed, it must return true and fire
// AUDIO_VOLUME_CHANGED.
virtual bool SetAudioMuted(bool muted) = 0;
// Gets audio codecs supported by the device (or HDMI sinks).
// The result is an integer of OR'ed AudioCodec values.
virtual int GetAudioCodecsSupported() = 0;
// Gets maximum number of channels for given audio codec, |codec|.
virtual int GetMaxAudioChannels(AudioCodec codec) = 0;
// Retrieves the resolution of screen of the device (or HDMI sinks).
// Returns true if it gets resolution successfully.
virtual bool GetScreenResolution(int* width, int* height) = 0;
};
} // namespace chromecast
#endif // CHROMECAST_PUBLIC_AVSETTINGS_H_