Commit | Line | Data |
---|---|---|
004b8382 LOK |
1 | #pragma once |
2 | /* | |
3 | * This file is part of the libCEC(R) library. | |
4 | * | |
16f47961 | 5 | * libCEC(R) is Copyright (C) 2011-2013 Pulse-Eight Limited. All rights reserved. |
004b8382 LOK |
6 | * libCEC(R) is an original work, containing original code. |
7 | * | |
8 | * libCEC(R) is a trademark of Pulse-Eight Limited. | |
9 | * | |
10 | * This program is dual-licensed; you can redistribute it and/or modify | |
11 | * it under the terms of the GNU General Public License as published by | |
12 | * the Free Software Foundation; either version 2 of the License, or | |
13 | * (at your option) any later version. | |
14 | * | |
15 | * This program is distributed in the hope that it will be useful, | |
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 | * GNU General Public License for more details. | |
19 | * | |
20 | * You should have received a copy of the GNU General Public License | |
21 | * along with this program; if not, write to the Free Software | |
22 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
23 | * | |
24 | * | |
25 | * Alternatively, you can license this library under a commercial license, | |
26 | * please contact Pulse-Eight Licensing for more information. | |
27 | * | |
28 | * For more information contact: | |
29 | * Pulse-Eight Licensing <license@pulse-eight.com> | |
30 | * http://www.pulse-eight.com/ | |
31 | * http://www.pulse-eight.net/ | |
32 | */ | |
33 | ||
2b44051c | 34 | #include <string> |
004b8382 LOK |
35 | #include "platform/threads/mutex.h" |
36 | #include "platform/util/buffer.h" | |
37 | ||
004b8382 LOK |
38 | namespace CEC |
39 | { | |
40 | class CCECProcessor; | |
2b44051c LOK |
41 | class CCECBusDevice; |
42 | class CCECPlaybackDevice; | |
004b8382 LOK |
43 | |
44 | class CCECClient | |
45 | { | |
679dfa07 LOK |
46 | friend class CCECProcessor; |
47 | ||
004b8382 | 48 | public: |
c0152c09 | 49 | CCECClient(CCECProcessor *processor, const libcec_configuration &configuration); |
004b8382 LOK |
50 | virtual ~CCECClient(void); |
51 | ||
679dfa07 LOK |
52 | /*! |
53 | * @return True when initialised and registered, false otherwise. | |
54 | */ | |
55 | virtual bool IsInitialised(void); | |
56 | ||
57 | /*! | |
58 | * @return True when registered in the processor, false otherwise. | |
59 | */ | |
60 | virtual bool IsRegistered(void); | |
61 | ||
62 | /*! | |
63 | * @return The primary logical address that this client is controlling. | |
64 | */ | |
65 | virtual cec_logical_address GetPrimaryLogicalAdddress(void); | |
66 | ||
67 | /*! | |
68 | * @return The primary device that this client is controlling, or NULL if none. | |
69 | */ | |
70 | virtual CCECBusDevice *GetPrimaryDevice(void); | |
71 | ||
72 | /*! | |
73 | * @return Get the playback device or recording device that this client is controlling, or NULL if none. | |
74 | */ | |
75 | virtual CCECPlaybackDevice *GetPlaybackDevice(void); | |
76 | ||
77 | /*! | |
78 | * @brief Change one of the device types that this client is controlling into another. | |
79 | * @param from The type to change. | |
80 | * @param to The new value. | |
81 | * @return True when changed, false otherwise. | |
82 | */ | |
83 | virtual bool ChangeDeviceType(const cec_device_type from, const cec_device_type to); | |
84 | ||
85 | /*! | |
86 | * @brief Get a device that this client is controlling, given it's type. | |
87 | * @param type The type of the device to get. | |
88 | * @return The requested device, or NULL if not found. | |
89 | */ | |
90 | virtual CCECBusDevice *GetDeviceByType(const cec_device_type type) const; | |
91 | ||
92 | /*! | |
93 | * @brief Reset the physical address from the configuration. | |
94 | */ | |
95 | virtual void ResetPhysicalAddress(void); | |
96 | ||
97 | /*! | |
98 | * @return A string that describes this client. | |
99 | */ | |
2b44051c | 100 | virtual std::string GetConnectionInfo(void); |
679dfa07 LOK |
101 | |
102 | /*! | |
103 | * @return The current value of the TV vendor override setting. | |
104 | */ | |
105 | virtual cec_vendor_id GetTVVendorOverride(void); | |
106 | ||
107 | /*! | |
108 | * @return The current value of the OSD name setting. | |
109 | */ | |
2b44051c | 110 | virtual std::string GetOSDName(void); |
679dfa07 LOK |
111 | |
112 | /*! | |
113 | * @return Get the current value of the wake device setting. | |
114 | */ | |
115 | virtual cec_logical_addresses GetWakeDevices(void); | |
116 | ||
117 | /*! | |
118 | * @return The version of this client. | |
119 | */ | |
120 | virtual cec_client_version GetClientVersion(void); | |
121 | ||
122 | /*! | |
123 | * @return The device types that this client is controlling. | |
124 | */ | |
125 | virtual cec_device_type_list GetDeviceTypes(void); | |
004b8382 LOK |
126 | |
127 | // client-specific part of ICECAdapter | |
679dfa07 LOK |
128 | virtual bool EnableCallbacks(void *cbParam, ICECCallbacks *callbacks); |
129 | virtual bool PingAdapter(void); | |
2b44051c | 130 | virtual bool Transmit(const cec_command &data, bool bIsReply); |
679dfa07 LOK |
131 | virtual bool SetLogicalAddress(const cec_logical_address iLogicalAddress); |
132 | virtual bool SetPhysicalAddress(const uint16_t iPhysicalAddress); | |
133 | virtual bool SetHDMIPort(const cec_logical_address iBaseDevice, const uint8_t iPort, bool bForce = false); | |
134 | virtual bool SendPowerOnDevices(const cec_logical_address address = CECDEVICE_TV); | |
135 | virtual bool SendStandbyDevices(const cec_logical_address address = CECDEVICE_BROADCAST); | |
136 | virtual bool SendSetActiveSource(const cec_device_type type = CEC_DEVICE_TYPE_RESERVED); | |
137 | virtual bool SendSetDeckControlMode(const cec_deck_control_mode mode, bool bSendUpdate = true); | |
138 | virtual bool SendSetDeckInfo(const cec_deck_info info, bool bSendUpdate = true); | |
139 | virtual bool SendSetInactiveView(void); | |
140 | virtual bool SendSetMenuState(const cec_menu_state state, bool bSendUpdate = true); | |
141 | virtual bool SendSetOSDString(const cec_logical_address iLogicalAddress, const cec_display_control duration, const char *strMessage); | |
142 | virtual bool SwitchMonitoring(bool bEnable); | |
143 | virtual cec_version GetDeviceCecVersion(const cec_logical_address iAddress); | |
144 | virtual bool GetDeviceMenuLanguage(const cec_logical_address iAddress, cec_menu_language &language); | |
145 | virtual uint64_t GetDeviceVendorId(const cec_logical_address iAddress); | |
146 | virtual cec_power_status GetDevicePowerStatus(const cec_logical_address iAddress); | |
147 | virtual uint16_t GetDevicePhysicalAddress(const cec_logical_address iAddress); | |
148 | virtual bool PollDevice(const cec_logical_address iAddress); | |
149 | virtual cec_logical_addresses GetActiveDevices(void); | |
150 | virtual bool IsActiveDevice(const cec_logical_address iAddress); | |
151 | virtual bool IsActiveDeviceType(const cec_device_type type); | |
152 | virtual uint8_t SendVolumeUp(bool bSendRelease = true); | |
153 | virtual uint8_t SendVolumeDown(bool bSendRelease = true); | |
154 | virtual uint8_t SendMuteAudio(void); | |
6d2bc8de LOK |
155 | virtual uint8_t AudioToggleMute(void); |
156 | virtual uint8_t AudioMute(void); | |
157 | virtual uint8_t AudioUnmute(void); | |
158 | virtual uint8_t AudioStatus(void); | |
679dfa07 LOK |
159 | virtual bool SendKeypress(const cec_logical_address iDestination, const cec_user_control_code key, bool bWait = true); |
160 | virtual bool SendKeyRelease(const cec_logical_address iDestination, bool bWait = true); | |
161 | virtual cec_osd_name GetDeviceOSDName(const cec_logical_address iAddress); | |
162 | virtual cec_logical_address GetActiveSource(void); | |
163 | virtual bool IsActiveSource(const cec_logical_address iAddress); | |
164 | virtual bool SetStreamPath(const cec_logical_address iAddress); | |
165 | virtual bool SetStreamPath(const uint16_t iPhysicalAddress); | |
166 | virtual cec_logical_addresses GetLogicalAddresses(void); | |
167 | virtual void RescanActiveDevices(void); | |
168 | virtual bool IsLibCECActiveSource(void); | |
004b8382 LOK |
169 | |
170 | // configuration | |
679dfa07 LOK |
171 | virtual bool GetCurrentConfiguration(libcec_configuration &configuration); |
172 | virtual bool SetConfiguration(const libcec_configuration &configuration); | |
173 | virtual bool CanPersistConfiguration(void); | |
174 | virtual bool PersistConfiguration(const libcec_configuration &configuration); | |
175 | virtual void SetPhysicalAddress(const libcec_configuration &configuration); | |
004b8382 LOK |
176 | |
177 | // callbacks | |
679dfa07 LOK |
178 | virtual void AddCommand(const cec_command &command); |
179 | virtual int MenuStateChanged(const cec_menu_state newState); | |
2b44051c LOK |
180 | virtual void Alert(const libcec_alert type, const libcec_parameter ¶m) { CallbackAlert(type, param); } |
181 | virtual void AddLog(const cec_log_message &message) { CallbackAddLog(message); } | |
df312c6c | 182 | virtual void AddKey(bool bSendComboKey = false); |
679dfa07 LOK |
183 | virtual void AddKey(const cec_keypress &key); |
184 | virtual void SetCurrentButton(const cec_user_control_code iButtonCode); | |
185 | virtual void CheckKeypressTimeout(void); | |
29d5198c LOK |
186 | virtual void SourceActivated(const cec_logical_address logicalAddress); |
187 | virtual void SourceDeactivated(const cec_logical_address logicalAddress); | |
004b8382 LOK |
188 | |
189 | protected: | |
679dfa07 LOK |
190 | /*! |
191 | * @brief Register this client in the processor | |
192 | * @return True when registered, false otherwise. | |
193 | */ | |
194 | virtual bool OnRegister(void); | |
195 | ||
196 | /*! | |
197 | * @brief Called by the processor when this client is unregistered | |
198 | */ | |
199 | virtual void OnUnregister(void) { SetRegistered(false); SetInitialised(false); } | |
200 | ||
201 | /*! | |
202 | * @brief Set the registered state of this client. | |
203 | * @param bSetTo The new value. | |
204 | */ | |
205 | virtual void SetRegistered(bool bSetTo); | |
206 | ||
207 | /*! | |
208 | * @brief Set the initialised state of this client. | |
209 | * @param bSetTo The new value | |
210 | */ | |
211 | virtual void SetInitialised(bool bSetTo); | |
212 | ||
213 | /*! | |
214 | * @brief Change the TV vendor id override setting. | |
215 | * @param id The new value. | |
216 | */ | |
217 | virtual void SetTVVendorOverride(const cec_vendor_id id); | |
218 | ||
219 | /*! | |
220 | * @brief Change the OSD name of the primary device that this client is controlling. | |
221 | * @param strDeviceName The new value. | |
222 | */ | |
2b44051c | 223 | virtual void SetOSDName(const std::string &strDeviceName); |
679dfa07 LOK |
224 | |
225 | /*! | |
226 | * @brief Change the value of the devices to wake. | |
227 | * @param addresses The new value. | |
228 | */ | |
229 | virtual void SetWakeDevices(const cec_logical_addresses &addresses); | |
230 | ||
231 | /*! | |
232 | * @brief Change the value of the client version setting. | |
233 | * @param version The new version setting. | |
234 | */ | |
235 | virtual void SetClientVersion(const cec_client_version version); | |
236 | ||
237 | /*! | |
238 | * @brief Change the device types that this client is controlling. | |
239 | * @param deviceTypes The new types. | |
240 | * @return True when the client needs to be re-registered to pick up the new setting, false otherwise. | |
241 | */ | |
242 | virtual bool SetDeviceTypes(const cec_device_type_list &deviceTypes); | |
243 | ||
244 | /*! | |
245 | * @return A pointer to the current configuration of this client. | |
246 | */ | |
247 | virtual libcec_configuration *GetConfiguration(void) { return &m_configuration; } | |
248 | ||
249 | /*! | |
250 | * @brief Called by the processor when registering this client to allocate the logical addresses. | |
251 | * @return True when the addresses for all types were allocated, false otherwise. | |
252 | */ | |
253 | virtual bool AllocateLogicalAddresses(void); | |
254 | ||
255 | /*! | |
256 | * @brief Try to allocate a logical address for a recording device controlled by this client. | |
257 | * @return The logical address that was allocated, or CECDEVICE_UNKNOWN if none could be allocated. | |
258 | */ | |
259 | virtual cec_logical_address AllocateLogicalAddressRecordingDevice(void); | |
260 | ||
261 | /*! | |
262 | * @brief Try to allocate a logical address for a tuner controlled by this client. | |
263 | * @return The logical address that was allocated, or CECDEVICE_UNKNOWN if none could be allocated. | |
264 | */ | |
265 | virtual cec_logical_address AllocateLogicalAddressTuner(void); | |
266 | ||
267 | /*! | |
268 | * @brief Try to allocate a logical address for a playback device controlled by this client. | |
269 | * @return The logical address that was allocated, or CECDEVICE_UNKNOWN if none could be allocated. | |
270 | */ | |
271 | virtual cec_logical_address AllocateLogicalAddressPlaybackDevice(void); | |
272 | ||
273 | /*! | |
274 | * @brief Try to allocate a logical address for an audiosystem controlled by this client. | |
275 | * @return The logical address that was allocated, or CECDEVICE_UNKNOWN if none could be allocated. | |
276 | */ | |
277 | virtual cec_logical_address AllocateLogicalAddressAudioSystem(void); | |
278 | ||
279 | /*! | |
280 | * @brief Change the physical address of the devices controlled by this client. | |
281 | * @param iPhysicalAddress The new physical address. | |
282 | * @return True when changed, false otherwise. | |
283 | */ | |
284 | virtual bool SetDevicePhysicalAddress(const uint16_t iPhysicalAddress); | |
285 | ||
679dfa07 LOK |
286 | /*! |
287 | * @brief Try to autodetect the physical address. | |
288 | * @return True when autodetected (and set in m_configuration), false otherwise. | |
289 | */ | |
290 | virtual bool AutodetectPhysicalAddress(void); | |
291 | ||
42d28d15 LOK |
292 | /*! |
293 | * @brief Replaces all device types in m_configuration by types that are supported by the command handler of the TV | |
294 | */ | |
295 | virtual void SetSupportedDeviceTypes(void); | |
296 | ||
2b44051c LOK |
297 | virtual void CallbackAddCommand(const cec_command &command); |
298 | virtual void CallbackAddKey(const cec_keypress &key); | |
299 | virtual void CallbackAddLog(const cec_log_message &message); | |
300 | virtual void CallbackAlert(const libcec_alert type, const libcec_parameter ¶m); | |
301 | virtual void CallbackConfigurationChanged(const libcec_configuration &config); | |
302 | virtual int CallbackMenuStateChanged(const cec_menu_state newState); | |
303 | virtual void CallbackSourceActivated(bool bActivated, const cec_logical_address logicalAddress); | |
304 | ||
2d4e263c LOK |
305 | CCECProcessor * m_processor; /**< a pointer to the processor */ |
306 | libcec_configuration m_configuration; /**< the configuration of this client */ | |
307 | bool m_bInitialised; /**< true when initialised, false otherwise */ | |
308 | bool m_bRegistered; /**< true when registered in the processor, false otherwise */ | |
309 | PLATFORM::CMutex m_mutex; /**< mutex for changes to this instance */ | |
310 | PLATFORM::CMutex m_cbMutex; /**< mutex that is held when doing anything with callbacks */ | |
311 | cec_user_control_code m_iCurrentButton; /**< the control code of the button that's currently held down (if any) */ | |
312 | int64_t m_buttontime; /**< the timestamp when the button was pressed (in seconds since epoch), or 0 if none was pressed. */ | |
313 | int64_t m_iPreventForwardingPowerOffCommand; /**< prevent forwarding standby commands until this time */ | |
dbf90acf LOK |
314 | int64_t m_iLastKeypressTime; /**< last time a key press was sent to the client */ |
315 | cec_keypress m_lastKeypress; /**< the last key press that was sent to the client */ | |
004b8382 LOK |
316 | }; |
317 | } |