diff --git a/libarmbox/audio.cpp b/libarmbox/audio.cpp index b9f8cb8..196a03c 100644 --- a/libarmbox/audio.cpp +++ b/libarmbox/audio.cpp @@ -92,7 +92,15 @@ int map_volume(const int volume) if (vol > 100) vol = 100; + // convert to -1dB steps vol = 63 - vol * 63 / 100; + // now range is 63..0, where 0 is loudest + +#if BOXMODEL_VUPLUS4K + if (vol == 63) + vol = 255; +#endif + return vol; } @@ -103,10 +111,8 @@ int cAudio::setVolume(unsigned int left, unsigned int right) volume = (left + right) / 2; int v = map_volume(volume); - // convert to -1dB steps left = map_volume(volume); right = map_volume(volume); - //now range is 63..0, where 0 is loudest audio_mixer_t mixer; diff --git a/libarmbox/hdmi_cec.cpp b/libarmbox/hdmi_cec.cpp index 8ebe131..fafc8a0 100644 --- a/libarmbox/hdmi_cec.cpp +++ b/libarmbox/hdmi_cec.cpp @@ -60,6 +60,7 @@ }) #define CEC_DEVICE "/dev/cec0" +#define CEC_HDMIDEVICE "/dev/hdmi_cec" #define RC_DEVICE "/dev/input/event1" hdmi_cec * hdmi_cec::hdmi_cec_instance = NULL; @@ -72,6 +73,7 @@ hdmi_cec::hdmi_cec() standby_cec_activ = autoview_cec_activ = standby = muted = false; hdmiFd = -1; volume = 0; + hdmi_mode = false; } hdmi_cec::~hdmi_cec() @@ -193,15 +195,39 @@ bool hdmi_cec::SetCECMode(VIDEO_HDMI_CEC_MODE _deviceType) return true; } + + if (hdmiFd == -1) + { + hdmiFd = open(CEC_HDMIDEVICE, O_RDWR | O_NONBLOCK | O_CLOEXEC); + if (hdmiFd >= 0) + { + hdmi_mode = true; + + ::ioctl(hdmiFd, 0); + + GetCECAddressInfo(); + + if(autoview_cec_activ) + SetCECState(false); + + Start(); + return true; + } + } + return false; } void hdmi_cec::GetCECAddressInfo() { - if (hdmiFd >= 0) - { - struct addressinfo addressinfo; + struct addressinfo addressinfo; + if (hdmi_mode) + { + ::ioctl(hdmiFd, 1, &addressinfo); + } + else + { __u16 phys_addr; struct cec_log_addrs laddrs = {}; @@ -234,15 +260,15 @@ void hdmi_cec::GetCECAddressInfo() addressinfo.type = CEC_LOG_ADDR_UNREGISTERED; break; } + } - deviceType = addressinfo.type; - logicalAddress = addressinfo.logical; - if (memcmp(physicalAddress, addressinfo.physical, sizeof(physicalAddress))) - { - hal_info("[CEC] %s: detected physical address change: %02X%02X --> %02X%02X\n", __func__, physicalAddress[0], physicalAddress[1], addressinfo.physical[0], addressinfo.physical[1]); - memcpy(physicalAddress, addressinfo.physical, sizeof(physicalAddress)); - ReportPhysicalAddress(); - } + deviceType = addressinfo.type; + logicalAddress = addressinfo.logical; + if (memcmp(physicalAddress, addressinfo.physical, sizeof(physicalAddress))) + { + hal_info("[CEC] %s: detected physical address change: %02X%02X --> %02X%02X\n", __func__, physicalAddress[0], physicalAddress[1], addressinfo.physical[0], addressinfo.physical[1]); + memcpy(physicalAddress, addressinfo.physical, sizeof(physicalAddress)); + ReportPhysicalAddress(); } } @@ -269,11 +295,18 @@ void hdmi_cec::SendCECMessage(struct cec_message &txmessage) sprintf(str+(i*6),"[0x%02X]", txmessage.data[i]); } hal_info("[CEC] send message %s to %s (0x%02X>>0x%02X) '%s' (%s)\n",ToString((cec_logical_address)txmessage.initiator), txmessage.destination == 0xf ? "all" : ToString((cec_logical_address)txmessage.destination), txmessage.initiator, txmessage.destination, ToString((cec_opcode)txmessage.data[0]), str); - struct cec_msg msg; - cec_msg_init(&msg, txmessage.initiator, txmessage.destination); - memcpy(&msg.msg[1], txmessage.data, txmessage.length); - msg.len = txmessage.length + 1; - ioctl(hdmiFd, CEC_TRANSMIT, &msg); + if (hdmi_mode) + { + ::write(hdmiFd, &txmessage, 2 + txmessage.length); + } + else + { + struct cec_msg msg; + cec_msg_init(&msg, txmessage.initiator, txmessage.destination); + memcpy(&msg.msg[1], txmessage.data, txmessage.length); + msg.len = txmessage.length + 1; + ioctl(hdmiFd, CEC_TRANSMIT, &msg); + } } } @@ -500,15 +533,28 @@ void hdmi_cec::Receive() struct cec_message rxmessage; struct cec_message txmessage; - struct cec_msg msg; - if (::ioctl(hdmiFd, CEC_RECEIVE, &msg) >= 0) + if (hdmi_mode) { - rxmessage.length = msg.len - 1; - rxmessage.initiator = cec_msg_initiator(&msg); - rxmessage.destination = cec_msg_destination(&msg); - rxmessage.opcode = cec_msg_opcode(&msg); - memcpy(&rxmessage.data, &msg.msg[1], rxmessage.length); - hasdata = true; + if (::read(hdmiFd, &rxmessage, 2) == 2) + { + if (::read(hdmiFd, &rxmessage.data, rxmessage.length) == rxmessage.length) + { + hasdata = true; + } + } + } + else + { + struct cec_msg msg; + if (::ioctl(hdmiFd, CEC_RECEIVE, &msg) >= 0) + { + rxmessage.length = msg.len - 1; + rxmessage.initiator = cec_msg_initiator(&msg); + rxmessage.destination = cec_msg_destination(&msg); + rxmessage.opcode = cec_msg_opcode(&msg); + memcpy(&rxmessage.data, &msg.msg[1], rxmessage.length); + hasdata = true; + } } if (hasdata) diff --git a/libarmbox/hdmi_cec.h b/libarmbox/hdmi_cec.h index fb49137..3c32fa6 100644 --- a/libarmbox/hdmi_cec.h +++ b/libarmbox/hdmi_cec.h @@ -70,6 +70,7 @@ private: void request_audio_status(); bool muted; int volume; + bool hdmi_mode; protected: bool running; public: