// 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_