X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fimplementations%2FCECCommandHandler.cpp;h=e30810c6671c7c564721c0906ed5db94630db0c1;hb=c0b1d868c775f3b2d8246b183a31fe34a1ad30f5;hp=932068254acd71e8b6864646c58a7c05a3ca8c85;hpb=56701628bc0683330d679147aa857f4b92403daa;p=deb_libcec.git diff --git a/src/lib/implementations/CECCommandHandler.cpp b/src/lib/implementations/CECCommandHandler.cpp index 9320682..e30810c 100644 --- a/src/lib/implementations/CECCommandHandler.cpp +++ b/src/lib/implementations/CECCommandHandler.cpp @@ -32,6 +32,7 @@ #include "CECCommandHandler.h" #include "../devices/CECBusDevice.h" +#include "../devices/CECAudioSystem.h" #include "../CECProcessor.h" using namespace CEC; @@ -45,7 +46,7 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command) { bool bHandled(true); - if (command.destination == m_busDevice->GetMyLogicalAddress()) + if (m_busDevice->MyLogicalAddressContains(command.destination)) { switch(command.opcode) { @@ -57,6 +58,7 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command) break; case CEC_OPCODE_SET_MENU_LANGUAGE: HandleSetMenuLanguage(command); + m_busDevice->GetProcessor()->AddCommand(command); break; case CEC_OPCODE_GIVE_PHYSICAL_ADDRESS: HandleGivePhysicalAddress(command); @@ -91,13 +93,21 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command) case CEC_OPCODE_USER_CONTROL_RELEASE: HandleUserControlRelease(command); break; + case CEC_OPCODE_GIVE_AUDIO_STATUS: + HandleGiveAudioStatus(command); + break; + case CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS: + HandleGiveSystemAudioModeStatus(command); + break; + case CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST: + HandleSetSystemAudioModeRequest(command); + break; default: UnhandledCommand(command); + m_busDevice->GetProcessor()->AddCommand(command); bHandled = false; break; } - - m_busDevice->GetProcessor()->AddCommand(command); } else if (command.destination == CECDEVICE_BROADCAST) { @@ -106,15 +116,18 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command) { case CEC_OPCODE_SET_MENU_LANGUAGE: HandleSetMenuLanguage(command); + m_busDevice->GetProcessor()->AddCommand(command); break; case CEC_OPCODE_REQUEST_ACTIVE_SOURCE: HandleRequestActiveSource(command); break; case CEC_OPCODE_SET_STREAM_PATH: HandleSetStreamPath(command); + m_busDevice->GetProcessor()->AddCommand(command); break; case CEC_OPCODE_ROUTING_CHANGE: HandleRoutingChange(command); + m_busDevice->GetProcessor()->AddCommand(command); break; case CEC_OPCODE_DEVICE_VENDOR_ID: HandleDeviceVendorId(command); @@ -124,16 +137,15 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command) break; default: UnhandledCommand(command); + m_busDevice->GetProcessor()->AddCommand(command); bHandled = false; break; } - - m_busDevice->GetProcessor()->AddCommand(command); } else { CStdString strLog; - strLog.Format("ignoring frame: destination: %u != %u", command.destination, (uint8_t)m_busDevice->GetMyLogicalAddress()); + strLog.Format("ignoring frame: we're not at destination %x", command.destination); m_busDevice->AddLog(CEC_LOG_DEBUG, strLog.c_str()); bHandled = false; } @@ -173,54 +185,63 @@ bool CCECCommandHandler::HandleDeviceVendorId(const cec_command &command) bool CCECCommandHandler::HandleGetCecVersion(const cec_command &command) { - CCECBusDevice *device = GetDevice(command.initiator); + CCECBusDevice *device = GetDevice(command.destination); if (device) - return device->ReportCECVersion(); + return device->TransmitCECVersion(command.initiator); + + return false; +} + +bool CCECCommandHandler::HandleGiveAudioStatus(const cec_command &command) +{ + CCECBusDevice *device = GetDevice(command.destination); + if (device && device->GetType() == CEC_DEVICE_TYPE_AUDIO_SYSTEM) + return ((CCECAudioSystem *) device)->TransmitAudioStatus(command.initiator); return false; } bool CCECCommandHandler::HandleGiveDeckStatus(const cec_command &command) { - CCECBusDevice *device = GetDevice(command.initiator); + CCECBusDevice *device = GetDevice(command.destination); if (device) - return device->ReportDeckStatus(); + return device->TransmitDeckStatus(command.initiator); return false; } bool CCECCommandHandler::HandleGiveDevicePowerStatus(const cec_command &command) { - CCECBusDevice *device = GetDevice(command.initiator); + CCECBusDevice *device = GetDevice(command.destination); if (device) - return device->ReportPowerState(); + return device->TransmitPowerState(command.initiator); return false; } bool CCECCommandHandler::HandleGiveDeviceVendorId(const cec_command &command) { - CCECBusDevice *device = GetDevice(command.initiator); + CCECBusDevice *device = GetDevice(command.destination); if (device) - return device->ReportVendorID(); + return device->TransmitVendorID(command.initiator); return false; } bool CCECCommandHandler::HandleGiveOSDName(const cec_command &command) { - CCECBusDevice *device = GetDevice(command.initiator); + CCECBusDevice *device = GetDevice(command.destination); if (device) - return device->ReportOSDName(); + return device->TransmitOSDName(command.initiator); return false; } bool CCECCommandHandler::HandleGivePhysicalAddress(const cec_command &command) { - CCECBusDevice *device = GetThisDevice(); + CCECBusDevice *device = GetDevice(command.destination); if (device) - return device->BroadcastPhysicalAddress(); + return device->TransmitPhysicalAddress(); return false; } @@ -229,9 +250,9 @@ bool CCECCommandHandler::HandleMenuRequest(const cec_command &command) { if (command.parameters[0] == CEC_MENU_REQUEST_TYPE_QUERY) { - CCECBusDevice *device = GetDevice(command.initiator); + CCECBusDevice *device = GetDevice(command.destination); if (device) - return device->ReportMenuState(); + return device->TransmitMenuState(command.initiator); } return false; } @@ -252,9 +273,9 @@ bool CCECCommandHandler::HandleRequestActiveSource(const cec_command &command) CStdString strLog; strLog.Format(">> %i requests active source", (uint8_t) command.initiator); m_busDevice->AddLog(CEC_LOG_DEBUG, strLog.c_str()); - CCECBusDevice *device = GetThisDevice(); + CCECBusDevice *device = m_busDevice->GetProcessor()->m_busDevices[m_busDevice->GetMyLogicalAddress()]; if (device) - return device->BroadcastActiveSource(); + return device->TransmitActiveSource(); return false; } @@ -298,17 +319,33 @@ bool CCECCommandHandler::HandleSetStreamPath(const cec_command &command) CStdString strLog; strLog.Format(">> %i requests stream path from physical address %04x", command.initiator, streamaddr); m_busDevice->AddLog(CEC_LOG_DEBUG, strLog.c_str()); - if (streamaddr == m_busDevice->GetMyPhysicalAddress()) - { - CCECBusDevice *device = GetThisDevice(); - if (device) - return device->BroadcastActiveSource(); - return false; - } + CCECBusDevice *device = GetDeviceByPhysicalAddress(streamaddr); + if (device) + return device->TransmitActiveSource(); } return true; } +bool CCECCommandHandler::HandleSetSystemAudioModeRequest(const cec_command &command) +{ + if (command.parameters.size >= 1) + { + CCECBusDevice *device = GetDevice(command.destination); + if (device&& device->GetType() == CEC_DEVICE_TYPE_AUDIO_SYSTEM) + return ((CCECAudioSystem *) device)->SetSystemAudioMode(command); + } + return true; +} + +bool CCECCommandHandler::HandleGiveSystemAudioModeStatus(const cec_command &command) +{ + CCECBusDevice *device = GetDevice(command.destination); + if (device && device->GetType() == CEC_DEVICE_TYPE_AUDIO_SYSTEM) + return ((CCECAudioSystem *) device)->TransmitSystemAudioModeStatus(command.initiator); + + return false; +} + bool CCECCommandHandler::HandleUserControlPressed(const cec_command &command) { if (command.parameters.size > 0) @@ -350,7 +387,18 @@ CCECBusDevice *CCECCommandHandler::GetDevice(cec_logical_address iLogicalAddress return device; } -CCECBusDevice *CCECCommandHandler::GetThisDevice(void) const +CCECBusDevice *CCECCommandHandler::GetDeviceByPhysicalAddress(uint16_t iPhysicalAddress) const { - return m_busDevice->GetProcessor()->m_busDevices[m_busDevice->GetMyLogicalAddress()]; + CCECBusDevice *device = NULL; + + for (unsigned int iPtr = 0; iPtr < 16; iPtr++) + { + if (m_busDevice->GetProcessor()->m_busDevices[iPtr]->GetPhysicalAddress() == iPhysicalAddress) + { + device = m_busDevice->GetProcessor()->m_busDevices[iPtr]; + break; + } + } + + return device; }