mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-08-01 15:07:49 +00:00
xbmc-pvr: update libcec patches
Signed-off-by: Stephan Raue <stephan@openelec.tv>
This commit is contained in:
parent
b808ed0e6a
commit
e4cec82495
File diff suppressed because it is too large
Load Diff
@ -1,624 +0,0 @@
|
|||||||
From 94ec6e9f96f23613da43a8cb14352d0fbd99f552 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Lars Op den Kamp <lars@opdenkamp.eu>
|
|
||||||
Date: Sun, 11 Dec 2011 23:42:17 +0100
|
|
||||||
Subject: [PATCH 1/5] cec: added volume control on a CEC enabled amplifier
|
|
||||||
when one is found
|
|
||||||
|
|
||||||
---
|
|
||||||
xbmc/Application.cpp | 64 ++++++++++
|
|
||||||
xbmc/Application.h | 1 +
|
|
||||||
xbmc/peripherals/devices/PeripheralCecAdapter.cpp | 128 ++++++++++++++++++++-
|
|
||||||
xbmc/peripherals/devices/PeripheralCecAdapter.h | 17 +++
|
|
||||||
4 files changed, 208 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp
|
|
||||||
index 0e0511e..2cfb8d3 100644
|
|
||||||
--- a/xbmc/Application.cpp
|
|
||||||
+++ b/xbmc/Application.cpp
|
|
||||||
@@ -2592,6 +2592,26 @@ bool CApplication::OnAction(const CAction &action)
|
|
||||||
// Check for global volume control
|
|
||||||
if (action.GetAmount() && (action.GetID() == ACTION_VOLUME_UP || action.GetID() == ACTION_VOLUME_DOWN))
|
|
||||||
{
|
|
||||||
+ /* try to set the volume on a connected amp */
|
|
||||||
+ #ifdef HAVE_LIBCEC
|
|
||||||
+ vector<CPeripheral *> peripherals;
|
|
||||||
+ if (g_peripherals.GetPeripheralsWithFeature(peripherals, FEATURE_CEC))
|
|
||||||
+ {
|
|
||||||
+ for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++)
|
|
||||||
+ {
|
|
||||||
+ CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr);
|
|
||||||
+ if (cecDevice && cecDevice->HasConnectedAudioSystem())
|
|
||||||
+ {
|
|
||||||
+ if (action.GetID() == ACTION_VOLUME_UP)
|
|
||||||
+ cecDevice->ScheduleVolumeUp();
|
|
||||||
+ else
|
|
||||||
+ cecDevice->ScheduleVolumeDown();
|
|
||||||
+ return true;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ #endif
|
|
||||||
+
|
|
||||||
if (!m_pPlayer || !m_pPlayer->IsPassthrough())
|
|
||||||
{
|
|
||||||
// increase or decrease the volume
|
|
||||||
@@ -5031,11 +5051,49 @@ void CApplication::ShowVolumeBar(const CAction *action)
|
|
||||||
|
|
||||||
bool CApplication::IsMuted() const
|
|
||||||
{
|
|
||||||
+ /* try to set the mute setting on a connected amp */
|
|
||||||
+#ifdef HAVE_LIBCEC
|
|
||||||
+ vector<CPeripheral *> peripherals;
|
|
||||||
+ if (g_peripherals.GetPeripheralsWithFeature(peripherals, FEATURE_CEC))
|
|
||||||
+ {
|
|
||||||
+ for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++)
|
|
||||||
+ {
|
|
||||||
+ CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr);
|
|
||||||
+ if (cecDevice && cecDevice->HasConnectedAudioSystem())
|
|
||||||
+ return false;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+#endif
|
|
||||||
return g_settings.m_bMute;
|
|
||||||
}
|
|
||||||
|
|
||||||
+bool CApplication::CecMute(void)
|
|
||||||
+{
|
|
||||||
+ /* try to set the mute setting on a connected amp */
|
|
||||||
+#ifdef HAVE_LIBCEC
|
|
||||||
+ vector<CPeripheral *> peripherals;
|
|
||||||
+ if (g_peripherals.GetPeripheralsWithFeature(peripherals, FEATURE_CEC))
|
|
||||||
+ {
|
|
||||||
+ for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++)
|
|
||||||
+ {
|
|
||||||
+ CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr);
|
|
||||||
+ if (cecDevice && cecDevice->HasConnectedAudioSystem())
|
|
||||||
+ {
|
|
||||||
+ cecDevice->ScheduleMute();
|
|
||||||
+ return true;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+ return false;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
void CApplication::ToggleMute(void)
|
|
||||||
{
|
|
||||||
+ if (CecMute())
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
if (g_settings.m_bMute)
|
|
||||||
UnMute();
|
|
||||||
else
|
|
||||||
@@ -5044,6 +5102,9 @@ void CApplication::ToggleMute(void)
|
|
||||||
|
|
||||||
void CApplication::Mute()
|
|
||||||
{
|
|
||||||
+ if (CecMute())
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
g_settings.m_iPreMuteVolumeLevel = GetVolume();
|
|
||||||
SetVolume(0);
|
|
||||||
g_settings.m_bMute = true;
|
|
||||||
@@ -5051,6 +5112,9 @@ void CApplication::Mute()
|
|
||||||
|
|
||||||
void CApplication::UnMute()
|
|
||||||
{
|
|
||||||
+ if (CecMute())
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
SetVolume(g_settings.m_iPreMuteVolumeLevel);
|
|
||||||
g_settings.m_iPreMuteVolumeLevel = 0;
|
|
||||||
g_settings.m_bMute = false;
|
|
||||||
diff --git a/xbmc/Application.h b/xbmc/Application.h
|
|
||||||
index 7688de7..26552ba 100644
|
|
||||||
--- a/xbmc/Application.h
|
|
||||||
+++ b/xbmc/Application.h
|
|
||||||
@@ -172,6 +172,7 @@ class CApplication : public CXBApplicationEx, public IPlayerCallback, public IMs
|
|
||||||
void SetVolume(long iValue, bool isPercentage = true);
|
|
||||||
bool IsMuted() const;
|
|
||||||
void ToggleMute(void);
|
|
||||||
+ bool CecMute(void);
|
|
||||||
void ShowVolumeBar(const CAction *action = NULL);
|
|
||||||
int GetPlaySpeed() const;
|
|
||||||
int GetSubtitleDelay() const;
|
|
||||||
diff --git a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp
|
|
||||||
index 21eb069..868a27c 100644
|
|
||||||
--- a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp
|
|
||||||
+++ b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp
|
|
||||||
@@ -31,6 +31,7 @@
|
|
||||||
#include "peripherals/Peripherals.h"
|
|
||||||
#include "peripherals/bus/PeripheralBus.h"
|
|
||||||
#include "settings/GUISettings.h"
|
|
||||||
+#include "settings/Settings.h"
|
|
||||||
#include "utils/log.h"
|
|
||||||
|
|
||||||
#include <cec.h>
|
|
||||||
@@ -72,7 +73,8 @@ class DllLibCEC : public DllDynamic, DllLibCECInterface
|
|
||||||
m_bHasButton(false),
|
|
||||||
m_bIsReady(false),
|
|
||||||
m_strMenuLanguage("???"),
|
|
||||||
- m_lastKeypress(0)
|
|
||||||
+ m_lastKeypress(0),
|
|
||||||
+ m_lastChange(VOLUME_CHANGE_NONE)
|
|
||||||
{
|
|
||||||
m_button.iButton = 0;
|
|
||||||
m_button.iDuration = 0;
|
|
||||||
@@ -284,8 +286,24 @@ void CPeripheralCecAdapter::Process(void)
|
|
||||||
SetMenuLanguage(language.language);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ CStdString strNotification;
|
|
||||||
+ cec_osd_name tvName = m_cecAdapter->GetDeviceOSDName(CECDEVICE_TV);
|
|
||||||
+ strNotification.Format("%s: %s", g_localizeStrings.Get(36016), tvName.name);
|
|
||||||
+
|
|
||||||
+ /* disable the mute setting when an amp is found, because the amp handles the mute setting and
|
|
||||||
+ set PCM output to 100% */
|
|
||||||
+ if (HasConnectedAudioSystem())
|
|
||||||
+ {
|
|
||||||
+ cec_osd_name ampName = m_cecAdapter->GetDeviceOSDName(CECDEVICE_AUDIOSYSTEM);
|
|
||||||
+ CLog::Log(LOGDEBUG, "%s - CEC capable amplifier found (%s). volume will be controlled on the amp", __FUNCTION__, ampName.name);
|
|
||||||
+ strNotification.AppendFormat(" - %s", ampName.name);
|
|
||||||
+
|
|
||||||
+ g_settings.m_bMute = false;
|
|
||||||
+ g_settings.m_nVolumeLevel = VOLUME_MAXIMUM;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
m_cecAdapter->SetOSDString(CECDEVICE_TV, CEC_DISPLAY_CONTROL_DISPLAY_FOR_DEFAULT_TIME, g_localizeStrings.Get(36016).c_str());
|
|
||||||
- CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36000), g_localizeStrings.Get(36016));
|
|
||||||
+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36000), strNotification);
|
|
||||||
|
|
||||||
while (!m_bStop)
|
|
||||||
{
|
|
||||||
@@ -293,6 +311,8 @@ void CPeripheralCecAdapter::Process(void)
|
|
||||||
if (!m_bStop)
|
|
||||||
ProcessNextCommand();
|
|
||||||
if (!m_bStop)
|
|
||||||
+ ProcessVolumeChange();
|
|
||||||
+ if (!m_bStop)
|
|
||||||
Sleep(5);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -354,6 +374,110 @@ bool CPeripheralCecAdapter::SetHdmiPort(int iHdmiPort)
|
|
||||||
return bReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
+bool CPeripheralCecAdapter::HasConnectedAudioSystem(void)
|
|
||||||
+{
|
|
||||||
+ return m_cecAdapter && m_cecAdapter->IsActiveDeviceType(CEC_DEVICE_TYPE_AUDIO_SYSTEM);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void CPeripheralCecAdapter::ScheduleVolumeUp(void)
|
|
||||||
+{
|
|
||||||
+ CSingleLock lock(m_critSection);
|
|
||||||
+ m_volumeChangeQueue.push(VOLUME_CHANGE_UP);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void CPeripheralCecAdapter::ScheduleVolumeDown(void)
|
|
||||||
+{
|
|
||||||
+ CSingleLock lock(m_critSection);
|
|
||||||
+ m_volumeChangeQueue.push(VOLUME_CHANGE_DOWN);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void CPeripheralCecAdapter::ScheduleMute(void)
|
|
||||||
+{
|
|
||||||
+ CSingleLock lock(m_critSection);
|
|
||||||
+ m_volumeChangeQueue.push(VOLUME_CHANGE_MUTE);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void CPeripheralCecAdapter::ProcessVolumeChange(void)
|
|
||||||
+{
|
|
||||||
+ bool bSendRelease(false);
|
|
||||||
+ CecVolumeChange pendingVolumeChange = VOLUME_CHANGE_NONE;
|
|
||||||
+ {
|
|
||||||
+ CSingleLock lock(m_critSection);
|
|
||||||
+ if (m_volumeChangeQueue.size() > 0)
|
|
||||||
+ {
|
|
||||||
+ /* get the first change from the queue */
|
|
||||||
+ if (pendingVolumeChange == VOLUME_CHANGE_NONE)
|
|
||||||
+ {
|
|
||||||
+ pendingVolumeChange = m_volumeChangeQueue.front();
|
|
||||||
+ m_volumeChangeQueue.pop();
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* remove all dupe entries */
|
|
||||||
+ while (m_volumeChangeQueue.size() > 0 && m_volumeChangeQueue.front() == pendingVolumeChange)
|
|
||||||
+ m_volumeChangeQueue.pop();
|
|
||||||
+
|
|
||||||
+ m_lastKeypress = XbmcThreads::SystemClockMillis();
|
|
||||||
+
|
|
||||||
+ /* only send the keypress when it hasn't been sent yet */
|
|
||||||
+ if (pendingVolumeChange != m_lastChange)
|
|
||||||
+ m_lastChange = pendingVolumeChange;
|
|
||||||
+ else
|
|
||||||
+ pendingVolumeChange = VOLUME_CHANGE_NONE;
|
|
||||||
+ }
|
|
||||||
+ else if (m_lastKeypress > 0 && m_lastKeypress + CEC_BUTTON_TIMEOUT < XbmcThreads::SystemClockMillis())
|
|
||||||
+ {
|
|
||||||
+ /* send a key release */
|
|
||||||
+ bSendRelease = true;
|
|
||||||
+ m_lastKeypress = 0;
|
|
||||||
+ m_lastChange = VOLUME_CHANGE_NONE;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ switch (pendingVolumeChange)
|
|
||||||
+ {
|
|
||||||
+ case VOLUME_CHANGE_UP:
|
|
||||||
+ m_cecAdapter->SendKeypress(CECDEVICE_AUDIOSYSTEM, CEC_USER_CONTROL_CODE_VOLUME_UP, false);
|
|
||||||
+ break;
|
|
||||||
+ case VOLUME_CHANGE_DOWN:
|
|
||||||
+ m_cecAdapter->SendKeypress(CECDEVICE_AUDIOSYSTEM, CEC_USER_CONTROL_CODE_VOLUME_DOWN, false);
|
|
||||||
+ break;
|
|
||||||
+ case VOLUME_CHANGE_MUTE:
|
|
||||||
+ m_cecAdapter->SendKeypress(CECDEVICE_AUDIOSYSTEM, CEC_USER_CONTROL_CODE_MUTE, false);
|
|
||||||
+ break;
|
|
||||||
+ case VOLUME_CHANGE_NONE:
|
|
||||||
+ if (bSendRelease)
|
|
||||||
+ m_cecAdapter->SendKeyRelease(CECDEVICE_AUDIOSYSTEM, false);
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void CPeripheralCecAdapter::VolumeUp(void)
|
|
||||||
+{
|
|
||||||
+ if (HasConnectedAudioSystem())
|
|
||||||
+ {
|
|
||||||
+ CSingleLock lock(m_critSection);
|
|
||||||
+ m_volumeChangeQueue.push(VOLUME_CHANGE_UP);
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void CPeripheralCecAdapter::VolumeDown(void)
|
|
||||||
+{
|
|
||||||
+ if (HasConnectedAudioSystem())
|
|
||||||
+ {
|
|
||||||
+ CSingleLock lock(m_critSection);
|
|
||||||
+ m_volumeChangeQueue.push(VOLUME_CHANGE_DOWN);
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void CPeripheralCecAdapter::Mute(void)
|
|
||||||
+{
|
|
||||||
+ if (HasConnectedAudioSystem())
|
|
||||||
+ {
|
|
||||||
+ CSingleLock lock(m_critSection);
|
|
||||||
+ m_volumeChangeQueue.push(VOLUME_CHANGE_MUTE);
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
void CPeripheralCecAdapter::SetMenuLanguage(const char *strLanguage)
|
|
||||||
{
|
|
||||||
if (m_strMenuLanguage.Equals(strLanguage))
|
|
||||||
diff --git a/xbmc/peripherals/devices/PeripheralCecAdapter.h b/xbmc/peripherals/devices/PeripheralCecAdapter.h
|
|
||||||
index 2fcbb1d..e1e302d 100644
|
|
||||||
--- a/xbmc/peripherals/devices/PeripheralCecAdapter.h
|
|
||||||
+++ b/xbmc/peripherals/devices/PeripheralCecAdapter.h
|
|
||||||
@@ -49,6 +49,13 @@
|
|
||||||
unsigned int iDuration;
|
|
||||||
} CecButtonPress;
|
|
||||||
|
|
||||||
+ typedef enum
|
|
||||||
+ {
|
|
||||||
+ VOLUME_CHANGE_NONE,
|
|
||||||
+ VOLUME_CHANGE_UP,
|
|
||||||
+ VOLUME_CHANGE_DOWN,
|
|
||||||
+ VOLUME_CHANGE_MUTE
|
|
||||||
+ } CecVolumeChange;
|
|
||||||
|
|
||||||
class CPeripheralCecAdapter : public CPeripheralHID, public ANNOUNCEMENT::IAnnouncer, private CThread
|
|
||||||
{
|
|
||||||
@@ -59,6 +66,13 @@
|
|
||||||
virtual void Announce(ANNOUNCEMENT::EAnnouncementFlag flag, const char *sender, const char *message, const CVariant &data);
|
|
||||||
virtual bool PowerOnCecDevices(CEC::cec_logical_address iLogicalAddress);
|
|
||||||
virtual bool StandbyCecDevices(CEC::cec_logical_address iLogicalAddress);
|
|
||||||
+ virtual bool HasConnectedAudioSystem(void);
|
|
||||||
+ virtual void ScheduleVolumeUp(void);
|
|
||||||
+ virtual void VolumeUp(void);
|
|
||||||
+ virtual void ScheduleVolumeDown(void);
|
|
||||||
+ virtual void VolumeDown(void);
|
|
||||||
+ virtual void ScheduleMute(void);
|
|
||||||
+ virtual void Mute(void);
|
|
||||||
|
|
||||||
virtual bool SendPing(void);
|
|
||||||
virtual bool SetHdmiPort(int iHdmiPort);
|
|
||||||
@@ -77,6 +91,7 @@
|
|
||||||
virtual bool InitialiseFeature(const PeripheralFeature feature);
|
|
||||||
virtual void Process(void);
|
|
||||||
virtual void ProcessNextCommand(void);
|
|
||||||
+ virtual void ProcessVolumeChange(void);
|
|
||||||
virtual void SetMenuLanguage(const char *strLanguage);
|
|
||||||
static bool FindConfigLocation(CStdString &strString);
|
|
||||||
static bool TranslateComPort(CStdString &strPort);
|
|
||||||
@@ -90,7 +105,9 @@
|
|
||||||
CDateTime m_screensaverLastActivated;
|
|
||||||
CecButtonPress m_button;
|
|
||||||
std::queue<CEC::cec_keypress> m_buttonQueue;
|
|
||||||
+ std::queue<CecVolumeChange> m_volumeChangeQueue;
|
|
||||||
unsigned int m_lastKeypress;
|
|
||||||
+ CecVolumeChange m_lastChange;
|
|
||||||
CCriticalSection m_critSection;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
--
|
|
||||||
1.7.5.4
|
|
||||||
|
|
||||||
|
|
||||||
From 35730475f96d0482b7a101cc49da6cc9d1894351 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Lars Op den Kamp <lars@opdenkamp.eu>
|
|
||||||
Date: Sun, 11 Dec 2011 23:43:17 +0100
|
|
||||||
Subject: [PATCH 2/5] cec: set the HDMI port and the device to which the CEC
|
|
||||||
adapter was connected, to be able to determine the
|
|
||||||
correct physical address. this is a work around, until
|
|
||||||
the CEC adapter's firmware supports physical address
|
|
||||||
detection, but is needed for people who have connected
|
|
||||||
XBMC to something else than the TV
|
|
||||||
|
|
||||||
---
|
|
||||||
system/peripherals.xml | 1 +
|
|
||||||
xbmc/peripherals/devices/PeripheralCecAdapter.cpp | 13 +++++++------
|
|
||||||
xbmc/peripherals/devices/PeripheralCecAdapter.h | 2 +-
|
|
||||||
3 files changed, 9 insertions(+), 7 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/system/peripherals.xml b/system/peripherals.xml
|
|
||||||
index f5cf50d..3882256 100644
|
|
||||||
--- a/system/peripherals.xml
|
|
||||||
+++ b/system/peripherals.xml
|
|
||||||
@@ -18,5 +18,6 @@
|
|
||||||
<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" />
|
|
||||||
+ <setting key="connected_device" type="int" label="21373" value="0" min="0" max="15" step="1" />
|
|
||||||
</peripheral>
|
|
||||||
</peripherals>
|
|
||||||
diff --git a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp
|
|
||||||
index 868a27c..d0c4e6c 100644
|
|
||||||
--- a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp
|
|
||||||
+++ b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp
|
|
||||||
@@ -248,8 +248,9 @@ void CPeripheralCecAdapter::Process(void)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// set correct physical address from peripheral settings
|
|
||||||
+ int iDevice = GetSettingInt("connected_device");
|
|
||||||
int iHdmiPort = GetSettingInt("cec_hdmi_port");
|
|
||||||
- SetHdmiPort(iHdmiPort);
|
|
||||||
+ SetHdmiPort(iDevice, iHdmiPort);
|
|
||||||
FlushLog();
|
|
||||||
|
|
||||||
// open the CEC adapter
|
|
||||||
@@ -360,15 +361,15 @@ bool CPeripheralCecAdapter::SendPing(void)
|
|
||||||
return bReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
-bool CPeripheralCecAdapter::SetHdmiPort(int iHdmiPort)
|
|
||||||
+bool CPeripheralCecAdapter::SetHdmiPort(int iDevice, int iHdmiPort)
|
|
||||||
{
|
|
||||||
bool bReturn(false);
|
|
||||||
if (m_cecAdapter && m_bIsReady)
|
|
||||||
{
|
|
||||||
if (iHdmiPort <= 0 || iHdmiPort > 16)
|
|
||||||
iHdmiPort = 1;
|
|
||||||
- CLog::Log(LOGDEBUG, "%s - changing active HDMI port to %d", __FUNCTION__, iHdmiPort);
|
|
||||||
- bReturn = m_cecAdapter->SetPhysicalAddress(iHdmiPort << 12);
|
|
||||||
+ CLog::Log(LOGDEBUG, "%s - changing active HDMI port to %d on device %d", __FUNCTION__, iHdmiPort, iDevice);
|
|
||||||
+ bReturn = m_cecAdapter->SetHDMIPort((cec_logical_address)iDevice, iHdmiPort);
|
|
||||||
}
|
|
||||||
|
|
||||||
return bReturn;
|
|
||||||
@@ -861,9 +862,9 @@ void CPeripheralCecAdapter::OnSettingChanged(const CStdString &strChangedSetting
|
|
||||||
else if (bEnabled && !m_cecAdapter && m_bStarted)
|
|
||||||
InitialiseFeature(FEATURE_CEC);
|
|
||||||
}
|
|
||||||
- else if (strChangedSetting.Equals("cec_hdmi_port"))
|
|
||||||
+ else if (strChangedSetting.Equals("connected_device") || strChangedSetting.Equals("cec_hdmi_port"))
|
|
||||||
{
|
|
||||||
- SetHdmiPort(GetSettingInt("cec_hdmi_port"));
|
|
||||||
+ SetHdmiPort(GetSettingInt("connected_device"), GetSettingInt("cec_hdmi_port"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/xbmc/peripherals/devices/PeripheralCecAdapter.h b/xbmc/peripherals/devices/PeripheralCecAdapter.h
|
|
||||||
index e1e302d..768e38a 100644
|
|
||||||
--- a/xbmc/peripherals/devices/PeripheralCecAdapter.h
|
|
||||||
+++ b/xbmc/peripherals/devices/PeripheralCecAdapter.h
|
|
||||||
@@ -75,7 +75,7 @@
|
|
||||||
virtual void Mute(void);
|
|
||||||
|
|
||||||
virtual bool SendPing(void);
|
|
||||||
- virtual bool SetHdmiPort(int iHdmiPort);
|
|
||||||
+ virtual bool SetHdmiPort(int iDevice, int iHdmiPort);
|
|
||||||
|
|
||||||
virtual void OnSettingChanged(const CStdString &strChangedSetting);
|
|
||||||
|
|
||||||
--
|
|
||||||
1.7.5.4
|
|
||||||
|
|
||||||
|
|
||||||
From 010c90708d5fe891feed31913382150757de5b2a Mon Sep 17 00:00:00 2001
|
|
||||||
From: Lars Op den Kamp <lars@opdenkamp.eu>
|
|
||||||
Date: Sun, 11 Dec 2011 23:44:29 +0100
|
|
||||||
Subject: [PATCH 3/5] cec: audiosystem control and the previous commit require
|
|
||||||
libcec v1.3 or higher
|
|
||||||
|
|
||||||
---
|
|
||||||
configure.in | 2 +-
|
|
||||||
lib/libcec/Makefile | 2 +-
|
|
||||||
project/BuildDependencies/scripts/libcec_d.txt | 2 +-
|
|
||||||
tools/darwin/depends/libcec/Makefile | 2 +-
|
|
||||||
4 files changed, 4 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/configure.in b/configure.in
|
|
||||||
index e7045ba..f6c28ca 100755
|
|
||||||
--- a/configure.in
|
|
||||||
+++ b/configure.in
|
|
||||||
@@ -1173,7 +1173,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 >= 1.1.0],,[use_libcec="no";AC_MSG_RESULT($libcec_disabled)])
|
|
||||||
+ PKG_CHECK_MODULES([CEC],[libcec >= 1.3.0],,[use_libcec="no";AC_MSG_RESULT($libcec_disabled)])
|
|
||||||
|
|
||||||
if test "x$use_libcec" != "xno"; then
|
|
||||||
INCLUDES="$INCLUDES $CEC_CFLAGS"
|
|
||||||
diff --git a/lib/libcec/Makefile b/lib/libcec/Makefile
|
|
||||||
index 8776161..0b6f322 100644
|
|
||||||
--- a/lib/libcec/Makefile
|
|
||||||
+++ b/lib/libcec/Makefile
|
|
||||||
@@ -7,7 +7,7 @@
|
|
||||||
|
|
||||||
# lib name, version
|
|
||||||
LIBNAME=libcec
|
|
||||||
-VERSION=1.2.0
|
|
||||||
+VERSION=1.3.0
|
|
||||||
SOURCE=$(LIBNAME)-$(VERSION)
|
|
||||||
|
|
||||||
# download location and format
|
|
||||||
diff --git a/project/BuildDependencies/scripts/libcec_d.txt b/project/BuildDependencies/scripts/libcec_d.txt
|
|
||||||
index ec9df80..fab03c5 100644
|
|
||||||
diff --git a/tools/darwin/depends/libcec/Makefile b/tools/darwin/depends/libcec/Makefile
|
|
||||||
index c6b44c0..38f9162 100644
|
|
||||||
--- a/tools/darwin/depends/libcec/Makefile
|
|
||||||
+++ b/tools/darwin/depends/libcec/Makefile
|
|
||||||
@@ -2,7 +2,7 @@ include ../Makefile.include
|
|
||||||
|
|
||||||
# lib name, version
|
|
||||||
LIBNAME=libcec
|
|
||||||
-VERSION=1.2.0
|
|
||||||
+VERSION=1.3.0
|
|
||||||
SOURCE=$(LIBNAME)-$(VERSION)
|
|
||||||
ARCHIVE=$(SOURCE).tar.gz
|
|
||||||
|
|
||||||
--
|
|
||||||
1.7.5.4
|
|
||||||
|
|
||||||
|
|
||||||
From 732175d6474da5a9f698fadd8c21617e8783bb6c Mon Sep 17 00:00:00 2001
|
|
||||||
From: Lars Op den Kamp <lars@opdenkamp.eu>
|
|
||||||
Date: Wed, 21 Dec 2011 00:05:54 +0100
|
|
||||||
Subject: [PATCH 4/5] cec: improved the volume change response time
|
|
||||||
|
|
||||||
---
|
|
||||||
xbmc/peripherals/devices/PeripheralCecAdapter.cpp | 33 ++++++++++++--------
|
|
||||||
1 files changed, 20 insertions(+), 13 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp
|
|
||||||
index d0c4e6c..9a49a46 100644
|
|
||||||
--- a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp
|
|
||||||
+++ b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp
|
|
||||||
@@ -382,20 +382,29 @@ bool CPeripheralCecAdapter::HasConnectedAudioSystem(void)
|
|
||||||
|
|
||||||
void CPeripheralCecAdapter::ScheduleVolumeUp(void)
|
|
||||||
{
|
|
||||||
- CSingleLock lock(m_critSection);
|
|
||||||
- m_volumeChangeQueue.push(VOLUME_CHANGE_UP);
|
|
||||||
+ {
|
|
||||||
+ CSingleLock lock(m_critSection);
|
|
||||||
+ m_volumeChangeQueue.push(VOLUME_CHANGE_UP);
|
|
||||||
+ }
|
|
||||||
+ Sleep(5);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPeripheralCecAdapter::ScheduleVolumeDown(void)
|
|
||||||
{
|
|
||||||
- CSingleLock lock(m_critSection);
|
|
||||||
- m_volumeChangeQueue.push(VOLUME_CHANGE_DOWN);
|
|
||||||
+ {
|
|
||||||
+ CSingleLock lock(m_critSection);
|
|
||||||
+ m_volumeChangeQueue.push(VOLUME_CHANGE_DOWN);
|
|
||||||
+ }
|
|
||||||
+ Sleep(5);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPeripheralCecAdapter::ScheduleMute(void)
|
|
||||||
{
|
|
||||||
- CSingleLock lock(m_critSection);
|
|
||||||
- m_volumeChangeQueue.push(VOLUME_CHANGE_MUTE);
|
|
||||||
+ {
|
|
||||||
+ CSingleLock lock(m_critSection);
|
|
||||||
+ m_volumeChangeQueue.push(VOLUME_CHANGE_MUTE);
|
|
||||||
+ }
|
|
||||||
+ Sleep(5);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPeripheralCecAdapter::ProcessVolumeChange(void)
|
|
||||||
@@ -407,20 +416,19 @@ void CPeripheralCecAdapter::ProcessVolumeChange(void)
|
|
||||||
if (m_volumeChangeQueue.size() > 0)
|
|
||||||
{
|
|
||||||
/* get the first change from the queue */
|
|
||||||
- if (pendingVolumeChange == VOLUME_CHANGE_NONE)
|
|
||||||
- {
|
|
||||||
- pendingVolumeChange = m_volumeChangeQueue.front();
|
|
||||||
- m_volumeChangeQueue.pop();
|
|
||||||
- }
|
|
||||||
+ pendingVolumeChange = m_volumeChangeQueue.front();
|
|
||||||
+ m_volumeChangeQueue.pop();
|
|
||||||
|
|
||||||
/* remove all dupe entries */
|
|
||||||
while (m_volumeChangeQueue.size() > 0 && m_volumeChangeQueue.front() == pendingVolumeChange)
|
|
||||||
m_volumeChangeQueue.pop();
|
|
||||||
|
|
||||||
+ /* send another keypress after CEC_BUTTON_TIMEOUT ms */
|
|
||||||
+ bool bRefresh(m_lastKeypress + CEC_BUTTON_TIMEOUT < XbmcThreads::SystemClockMillis());
|
|
||||||
m_lastKeypress = XbmcThreads::SystemClockMillis();
|
|
||||||
|
|
||||||
/* only send the keypress when it hasn't been sent yet */
|
|
||||||
- if (pendingVolumeChange != m_lastChange)
|
|
||||||
+ if (pendingVolumeChange != m_lastChange || bRefresh)
|
|
||||||
m_lastChange = pendingVolumeChange;
|
|
||||||
else
|
|
||||||
pendingVolumeChange = VOLUME_CHANGE_NONE;
|
|
||||||
@@ -429,7 +437,6 @@ void CPeripheralCecAdapter::ProcessVolumeChange(void)
|
|
||||||
{
|
|
||||||
/* send a key release */
|
|
||||||
bSendRelease = true;
|
|
||||||
- m_lastKeypress = 0;
|
|
||||||
m_lastChange = VOLUME_CHANGE_NONE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
--
|
|
||||||
1.7.5.4
|
|
||||||
|
|
||||||
|
|
||||||
From a7f0ec61297ce7b832576c97a641a7baa5d0f9b3 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Lars Op den Kamp <lars@opdenkamp.eu>
|
|
||||||
Date: Tue, 20 Dec 2011 21:17:46 +0100
|
|
||||||
Subject: [PATCH 5/5] cec: don't send playstate updates, but always keep the
|
|
||||||
default playstate. fixes buttons becoming deactivated
|
|
||||||
on some TVs. it also wasn't very fast, which resulted
|
|
||||||
in delays when starting/stopping playback
|
|
||||||
|
|
||||||
---
|
|
||||||
xbmc/peripherals/devices/PeripheralCecAdapter.cpp | 15 ---------------
|
|
||||||
1 files changed, 0 insertions(+), 15 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp
|
|
||||||
index 9a49a46..8990478 100644
|
|
||||||
--- a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp
|
|
||||||
+++ b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp
|
|
||||||
@@ -175,21 +175,6 @@ void CPeripheralCecAdapter::Announce(EAnnouncementFlag flag, const char *sender,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
- else if (flag == Player && !strcmp(sender, "xbmc") && !strcmp(message, "OnStop"))
|
|
||||||
- {
|
|
||||||
- m_cecAdapter->SetDeckControlMode(CEC_DECK_CONTROL_MODE_STOP, false);
|
|
||||||
- m_cecAdapter->SetDeckInfo(CEC_DECK_INFO_STOP);
|
|
||||||
- }
|
|
||||||
- else if (flag == Player && !strcmp(sender, "xbmc") && !strcmp(message, "OnPause"))
|
|
||||||
- {
|
|
||||||
- m_cecAdapter->SetDeckControlMode(CEC_DECK_CONTROL_MODE_SKIP_FORWARD_WIND, false);
|
|
||||||
- m_cecAdapter->SetDeckInfo(CEC_DECK_INFO_STILL);
|
|
||||||
- }
|
|
||||||
- else if (flag == Player && !strcmp(sender, "xbmc") && !strcmp(message, "OnPlay"))
|
|
||||||
- {
|
|
||||||
- m_cecAdapter->SetDeckControlMode(CEC_DECK_CONTROL_MODE_SKIP_FORWARD_WIND, false);
|
|
||||||
- m_cecAdapter->SetDeckInfo(CEC_DECK_INFO_PLAY);
|
|
||||||
- }
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CPeripheralCecAdapter::InitialiseFeature(const PeripheralFeature feature)
|
|
||||||
--
|
|
||||||
1.7.5.4
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user