Skip to content

Commit

Permalink
temporary merge of PR #520
Browse files Browse the repository at this point in the history
  • Loading branch information
opdenkamp committed Nov 1, 2011
1 parent dc2c8b6 commit dbf7116
Show file tree
Hide file tree
Showing 7 changed files with 91 additions and 45 deletions.
2 changes: 1 addition & 1 deletion configure.in
Expand Up @@ -1161,7 +1161,7 @@ if test "x$use_libcec" != "xno"; then

# libcec is dyloaded, so we need to check for its headers and link any depends.
if test "x$use_libcec" != "xno"; then
PKG_CHECK_MODULES([CEC],[libcec = 0.7.0],,[use_libcec="no";AC_MSG_RESULT($libcec_disabled)])
PKG_CHECK_MODULES([CEC],[libcec = 0.8.0],,[use_libcec="no";AC_MSG_RESULT($libcec_disabled)])

if test "x$use_libcec" != "xno"; then
INCLUDES="$INCLUDES $CEC_CFLAGS"
Expand Down
1 change: 1 addition & 0 deletions language/Dutch/strings.xml
Expand Up @@ -2891,5 +2891,6 @@
<string id="36015">HDMI poort nummer</string>
<string id="36016">XBMC verbonden</string>
<string id="36017">Adapter gevonden, maar libcec is niet beschikbaar</string>
<string id="36018">Gebruik de taalinstelling van de TV</string>
</strings>

1 change: 1 addition & 0 deletions language/English/strings.xml
Expand Up @@ -2831,4 +2831,5 @@
<string id="36015">HDMI port number</string>
<string id="36016">XBMC connected</string>
<string id="36017">Adapter found, but libcec is not available</string>
<string id="36018">Use the TV's language setting</string>
</strings>
2 changes: 1 addition & 1 deletion project/BuildDependencies/scripts/libcec_d.txt
@@ -1,3 +1,3 @@
; filename mirror source of the file

libcec7.zip http://xbmc.opdenkamp.eu/ http://packages.pulse-eight.net/
libcec8.zip http://xbmc.opdenkamp.eu/ http://packages.pulse-eight.net/
1 change: 1 addition & 0 deletions system/peripherals.xml
Expand Up @@ -26,5 +26,6 @@
<setting key="cec_mark_inactive_shutdown" type="bool" value="0" label="36010" />
<setting key="standby_pc_on_tv_standby" type="bool" value="1" label="36014" />
<setting key="cec_debug_logging" type="bool" value="0" label="20191" />
<setting key="use_tv_menu_language" type="bool" value="1" label="36018" />
</peripheral>
</peripherals>
116 changes: 75 additions & 41 deletions xbmc/peripherals/devices/PeripheralCecAdapter.cpp
Expand Up @@ -39,9 +39,9 @@ using namespace PERIPHERALS;
using namespace ANNOUNCEMENT;
using namespace CEC;

#define CEC_LIB_SUPPORTED_VERSION 7
#define CEC_LIB_SUPPORTED_VERSION 8

/* time in seconds to ignore standby commands from devices */
/* time in seconds to ignore standby commands from devices after the screensaver has been activated */
#define SCREENSAVER_TIMEOUT 10

class DllLibCECInterface
Expand Down Expand Up @@ -70,7 +70,8 @@ CPeripheralCecAdapter::CPeripheralCecAdapter(const PeripheralType type, const Pe
CThread("CEC Adapter"),
m_bStarted(false),
m_bHasButton(false),
m_bIsReady(false)
m_bIsReady(false),
m_strMenuLanguage("???")
{
m_button.iButton = 0;
m_button.iDuration = 0;
Expand Down Expand Up @@ -149,18 +150,21 @@ void CPeripheralCecAdapter::Announce(EAnnouncementFlag flag, const char *sender,
CLog::Log(LOGDEBUG, "%s - reconnecting to the CEC adapter after standby mode", __FUNCTION__);
m_cecAdapter->Close();

CStdString strPort = GetSettingString("port");
if (!m_cecAdapter->Open(strPort.c_str(), 10000))
CStdString strPort = GetComPort();
if (!strPort.empty())
{
CLog::Log(LOGERROR, "%s - failed to reconnect to the CEC adapter", __FUNCTION__);
FlushLog();
m_bStop = true;
}
else
{
if (GetSettingBool("cec_power_on_startup"))
PowerOnCecDevices();
m_cecAdapter->SetActiveView();
if (!m_cecAdapter->Open(strPort.c_str(), 10000))
{
CLog::Log(LOGERROR, "%s - failed to reconnect to the CEC adapter", __FUNCTION__);
FlushLog();
m_bStop = true;
}
else
{
if (GetSettingBool("cec_power_on_startup"))
PowerOnCecDevices(CECDEVICE_TV);
m_cecAdapter->SetActiveView();
}
}
}
}
Expand All @@ -176,15 +180,8 @@ bool CPeripheralCecAdapter::InitialiseFeature(const PeripheralFeature feature)
return CPeripheral::InitialiseFeature(feature);
}

void CPeripheralCecAdapter::Process(void)
CStdString CPeripheralCecAdapter::GetComPort(void)
{
if (!GetSettingBool("enabled"))
{
CLog::Log(LOGDEBUG, "%s - CEC adapter is disabled in peripheral settings", __FUNCTION__);
m_bStarted = false;
return;
}

CStdString strPort = GetSettingString("port");
if (strPort.IsEmpty())
{
Expand All @@ -197,8 +194,7 @@ void CPeripheralCecAdapter::Process(void)
{
CLog::Log(LOGWARNING, "%s - no CEC adapters found on %s", __FUNCTION__, strPort.c_str());
CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(36000), g_localizeStrings.Get(36011));
m_bStarted = false;
return;
strPort = "";
}
else
{
Expand All @@ -212,11 +208,21 @@ void CPeripheralCecAdapter::Process(void)
}
}

// set the correct physical address
int iHdmiPort = GetSettingInt("cec_hdmi_port");
if (iHdmiPort <= 0 || iHdmiPort > 16)
iHdmiPort = 1;
m_cecAdapter->SetPhysicalAddress(iHdmiPort << 12);
return strPort;
}

void CPeripheralCecAdapter::Process(void)
{
if (!GetSettingBool("enabled"))
{
CLog::Log(LOGDEBUG, "%s - CEC adapter is disabled in peripheral settings", __FUNCTION__);
m_bStarted = false;
return;
}

CStdString strPort = GetComPort();
if (strPort.empty())
return;

// open the CEC adapter
CLog::Log(LOGDEBUG, "%s - opening a connection to the CEC adapter: %s", __FUNCTION__, strPort.c_str());
Expand All @@ -234,11 +240,33 @@ void CPeripheralCecAdapter::Process(void)
m_bIsReady = true;
CAnnouncementManager::AddAnnouncer(this);

// set correct physical address from peripheral settings
int iHdmiPort = GetSettingInt("cec_hdmi_port");
if (iHdmiPort <= 0 || iHdmiPort > 16)
iHdmiPort = 1;
m_cecAdapter->SetPhysicalAddress((uint16_t) (iHdmiPort << 12));

FlushLog();

if (GetSettingBool("cec_power_on_startup"))
PowerOnCecDevices();
{
cec_power_status status = m_cecAdapter->GetDevicePowerStatus(CECDEVICE_TV);
if (status == CEC_POWER_STATUS_STANDBY ||
status == CEC_POWER_STATUS_IN_TRANSITION_ON_TO_STANDBY)
PowerOnCecDevices(CECDEVICE_TV);
FlushLog();
}

m_cecAdapter->SetActiveView();
FlushLog();

if (GetSettingBool("use_tv_menu_language"))
{
cec_menu_language language;
if (m_cecAdapter->GetDeviceMenuLanguage(CECDEVICE_TV, &language))
SetMenuLanguage(language.language);
}

m_cecAdapter->SetOSDString(CECDEVICE_TV, CEC_DISPLAY_CONTROL_DISPLAY_FOR_DEFAULT_TIME, g_localizeStrings.Get(36016).c_str());

while (!m_bStop)
Expand All @@ -247,7 +275,7 @@ void CPeripheralCecAdapter::Process(void)
if (!m_bStop)
ProcessNextCommand();
if (!m_bStop)
Sleep(50);
Sleep(5);
}

m_cecAdapter->Close();
Expand All @@ -256,27 +284,27 @@ void CPeripheralCecAdapter::Process(void)
m_bStarted = false;
}

bool CPeripheralCecAdapter::PowerOnCecDevices(void)
bool CPeripheralCecAdapter::PowerOnCecDevices(cec_logical_address iLogicalAddress)
{
bool bReturn(false);

if (m_cecAdapter && m_bIsReady)
{
CLog::Log(LOGDEBUG, "%s - powering on CEC capable devices", __FUNCTION__);
bReturn = m_cecAdapter->PowerOnDevices();
CLog::Log(LOGDEBUG, "%s - powering on CEC capable devices with address %1x", __FUNCTION__, iLogicalAddress);
bReturn = m_cecAdapter->PowerOnDevices(iLogicalAddress);
}

return bReturn;
}

bool CPeripheralCecAdapter::StandbyCecDevices(void)
bool CPeripheralCecAdapter::StandbyCecDevices(cec_logical_address iLogicalAddress)
{
bool bReturn(false);

if (m_cecAdapter && m_bIsReady)
{
CLog::Log(LOGDEBUG, "%s - putting CEC capable devices in standby mode", __FUNCTION__);
bReturn = m_cecAdapter->StandbyDevices();
CLog::Log(LOGDEBUG, "%s - putting CEC capable devices with address %1x in standby mode", __FUNCTION__, iLogicalAddress);
bReturn = m_cecAdapter->StandbyDevices(iLogicalAddress);
}

return bReturn;
Expand Down Expand Up @@ -322,6 +350,9 @@ bool CPeripheralCecAdapter::SetHdmiPort(int iHdmiPort)

void CPeripheralCecAdapter::SetMenuLanguage(const char *strLanguage)
{
if (m_strMenuLanguage.Equals(strLanguage))
return;

CStdString strGuiLanguage;

if (!strcmp(strLanguage, "bul"))
Expand Down Expand Up @@ -383,13 +414,13 @@ void CPeripheralCecAdapter::ProcessNextCommand(void)
cec_command command;
if (m_cecAdapter && m_bIsReady && m_cecAdapter->GetNextCommand(&command))
{
CLog::Log(LOGDEBUG, "%s - processing command: initiator=%d destination=%d opcode=%d", __FUNCTION__, command.initiator, command.destination, command.opcode);
CLog::Log(LOGDEBUG, "%s - processing command: initiator=%1x destination=%1x opcode=%02x", __FUNCTION__, command.initiator, command.destination, command.opcode);

switch (command.opcode)
{
case CEC_OPCODE_STANDBY:
/* a device was put in standby mode */
CLog::Log(LOGDEBUG, "%s - device %d was put in standby mode", __FUNCTION__, command.initiator);
CLog::Log(LOGDEBUG, "%s - device %1x was put in standby mode", __FUNCTION__, command.initiator);
if (command.initiator == CECDEVICE_TV && GetSettingBool("standby_pc_on_tv_standby") &&
(!m_screensaverLastActivated.IsValid() || CDateTime::GetCurrentDateTime() - m_screensaverLastActivated > CDateTimeSpan(0, 0, 0, SCREENSAVER_TIMEOUT)))
{
Expand All @@ -398,7 +429,7 @@ void CPeripheralCecAdapter::ProcessNextCommand(void)
}
break;
case CEC_OPCODE_SET_MENU_LANGUAGE:
if (command.initiator == CECDEVICE_TV && command.parameters.size == 3)
if (GetSettingBool("use_tv_menu_language") && command.initiator == CECDEVICE_TV && command.parameters.size == 3)
{
char strNewLanguage[4];
for (int iPtr = 0; iPtr < 3; iPtr++)
Expand Down Expand Up @@ -440,7 +471,7 @@ bool CPeripheralCecAdapter::GetNextKey(void)
if (!m_bIsReady || !m_cecAdapter->GetNextKeypress(&key))
return false;

CLog::Log(LOGDEBUG, "%s - received key %d", __FUNCTION__, key.keycode);
CLog::Log(LOGDEBUG, "%s - received key %2x", __FUNCTION__, key.keycode);
DWORD iButton = 0;

switch (key.keycode)
Expand Down Expand Up @@ -683,10 +714,13 @@ void CPeripheralCecAdapter::FlushLog(void)
case CEC_LOG_NOTICE:
iLevel = LOGDEBUG;
break;
case CEC_LOG_TRAFFIC:
case CEC_LOG_DEBUG:
if (GetSettingBool("cec_debug_logging"))
iLevel = LOGDEBUG;
break;
default:
break;
}

if (iLevel >= 0)
Expand Down
13 changes: 11 additions & 2 deletions xbmc/peripherals/devices/PeripheralCecAdapter.h
Expand Up @@ -20,12 +20,16 @@
*
*/

#if defined(HAVE_LIBCEC)

#include "PeripheralHID.h"
#include "interfaces/AnnouncementManager.h"
#include "threads/Thread.h"
#include "threads/CriticalSection.h"
#include <queue>

#include <cectypes.h>

class DllLibCEC;

namespace CEC
Expand All @@ -49,8 +53,8 @@ namespace PERIPHERALS
virtual ~CPeripheralCecAdapter(void);

virtual void Announce(ANNOUNCEMENT::EAnnouncementFlag flag, const char *sender, const char *message, const CVariant &data);
virtual bool PowerOnCecDevices(void);
virtual bool StandbyCecDevices(void);
virtual bool PowerOnCecDevices(CEC::cec_logical_address iLogicalAddress);
virtual bool StandbyCecDevices(CEC::cec_logical_address iLogicalAddress);

virtual bool SendPing(void);
virtual bool StartBootloader(void);
Expand All @@ -61,6 +65,7 @@ namespace PERIPHERALS
virtual WORD GetButton(void);
virtual unsigned int GetHoldTime(void);
virtual void ResetButton(void);
virtual CStdString GetComPort(void);

protected:
virtual void FlushLog(void);
Expand All @@ -77,8 +82,12 @@ namespace PERIPHERALS
bool m_bStarted;
bool m_bHasButton;
bool m_bIsReady;
CStdString m_strMenuLanguage;
CDateTime m_screensaverLastActivated;
CecButtonPress m_button;
CCriticalSection m_critSection;
};
}

#endif

0 comments on commit dbf7116

Please sign in to comment.