mirror of
https://projects.vdr-developer.org/git/vdr-plugin-skindesigner.git
synced 2023-10-19 17:58:31 +02:00
added tokens for current video and audio bitrate in displaychannel
This commit is contained in:
parent
c53dbf7cd6
commit
abd8fd8db0
4
HISTORY
4
HISTORY
@ -42,6 +42,8 @@ Version 0.0.2
|
||||
|
||||
Version 0.0.3
|
||||
|
||||
|
||||
- added tokens for current video and audio bitrate in displaychannel. Thx @rofafor for the original code
|
||||
in the femon plugin and _Martin_ for extracting the code in skinflatplus
|
||||
- changed skin metrixHD to display bitrate infos
|
||||
|
||||
|
||||
|
1
Makefile
1
Makefile
@ -78,6 +78,7 @@ OBJS = $(PLUGIN).o \
|
||||
libcore/recfolderinfo.o \
|
||||
libcore/extrecinfo.o \
|
||||
libcore/timers.o \
|
||||
libcore/femonreceiver.o \
|
||||
libtemplate/globals.o \
|
||||
libtemplate/parameter.o \
|
||||
libtemplate/template.o \
|
||||
|
2
config.c
2
config.c
@ -23,6 +23,8 @@ cDesignerConfig::cDesignerConfig() {
|
||||
//menu display style, display menu items
|
||||
//one after each other or in one step
|
||||
blockFlush = 1;
|
||||
//interval for femon receiver to recalculate bitrates in tenth of a second
|
||||
bitrateCalcInterval = 10;
|
||||
//remember current skin and theme, osd size and osd fonts
|
||||
SetSkin();
|
||||
SetOSDSize();
|
||||
|
1
config.h
1
config.h
@ -61,6 +61,7 @@ public:
|
||||
int rerunDistance;
|
||||
int rerunMaxChannel;
|
||||
int blockFlush;
|
||||
int bitrateCalcInterval;
|
||||
};
|
||||
|
||||
#ifdef DEFINE_CONFIG
|
||||
|
@ -186,12 +186,14 @@ void cSDDisplayChannel::Flush(void) {
|
||||
channelView->DrawSignal();
|
||||
channelView->DrawAudioInfo();
|
||||
channelView->DrawDevices(initial);
|
||||
channelView->DrawBitrates();
|
||||
} else {
|
||||
channelView->ClearStatusIcons();
|
||||
channelView->ClearScreenResolution();
|
||||
channelView->ClearSignal();
|
||||
channelView->ClearSignalBackground();
|
||||
channelView->ClearDevices();
|
||||
channelView->DrawBitrates();
|
||||
}
|
||||
|
||||
if (initial) {
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
<!ELEMENT displaychannel (background | channelinfo | epginfo | progressbar | progressbarback |
|
||||
statusinfo | audioinfo | screenresolution | channelgroup |
|
||||
signalquality | signalqualityback | devices | scrapercontent |
|
||||
signalquality | signalqualityback | devices | bitrate | scrapercontent |
|
||||
datetime | message | customtokens)* >
|
||||
<!ATTLIST displaychannel
|
||||
x CDATA #REQUIRED
|
||||
@ -78,6 +78,11 @@
|
||||
debug CDATA #IMPLIED
|
||||
>
|
||||
|
||||
<!ELEMENT bitrate (area|areascroll)*>
|
||||
<!ATTLIST bitrate
|
||||
debug CDATA #IMPLIED
|
||||
>
|
||||
|
||||
<!ELEMENT scrapercontent (area|areascroll)*>
|
||||
<!ATTLIST scrapercontent
|
||||
debug CDATA #IMPLIED
|
||||
|
184
libcore/femonreceiver.c
Normal file
184
libcore/femonreceiver.c
Normal file
@ -0,0 +1,184 @@
|
||||
#include <unistd.h>
|
||||
#include "../config.h"
|
||||
#include "femonreceiver.h"
|
||||
|
||||
cFemonReceiver::cFemonReceiver(const cChannel *Channel, int ATrack, int DTrack)
|
||||
: cReceiver(Channel),
|
||||
cThread("femon receiver"),
|
||||
m_Mutex(),
|
||||
m_Sleep(),
|
||||
m_Active(false),
|
||||
m_VideoBuffer(KILOBYTE(512), TS_SIZE, false, "Femon video"),
|
||||
m_VideoType(Channel ? Channel->Vtype(): 0),
|
||||
m_VideoPid(Channel ? Channel->Vpid() : 0),
|
||||
m_VideoPacketCount(0),
|
||||
m_AudioBuffer(KILOBYTE(256), TS_SIZE, false, "Femon audio"),
|
||||
m_AudioPid(Channel ? Channel->Apid(ATrack) : 0),
|
||||
m_AudioPacketCount(0),
|
||||
m_AC3Buffer(KILOBYTE(256), TS_SIZE, false, "Femon AC3"),
|
||||
m_AC3Pid(Channel ? Channel->Dpid(DTrack) : 0),
|
||||
m_AC3PacketCount(0)
|
||||
{
|
||||
SetPids(NULL);
|
||||
AddPid(m_VideoPid);
|
||||
AddPid(m_AudioPid);
|
||||
AddPid(m_AC3Pid);
|
||||
|
||||
m_VideoBuffer.SetTimeouts(0, 100);
|
||||
m_AudioBuffer.SetTimeouts(0, 100);
|
||||
m_AC3Buffer.SetTimeouts(0, 100);
|
||||
|
||||
m_VideoBitrate = 0.0;
|
||||
m_AudioBitrate = 0.0;
|
||||
m_AC3Bitrate = 0.0;
|
||||
}
|
||||
|
||||
cFemonReceiver::~cFemonReceiver(void)
|
||||
{
|
||||
Deactivate();
|
||||
}
|
||||
|
||||
void cFemonReceiver::Deactivate(void)
|
||||
{
|
||||
Detach();
|
||||
if (m_Active) {
|
||||
m_Active = false;
|
||||
m_Sleep.Signal();
|
||||
if (Running())
|
||||
Cancel(3);
|
||||
}
|
||||
}
|
||||
|
||||
void cFemonReceiver::Activate(bool On)
|
||||
{
|
||||
if (On)
|
||||
Start();
|
||||
else
|
||||
Deactivate();
|
||||
}
|
||||
|
||||
void cFemonReceiver::Receive(uchar *Data, int Length)
|
||||
{
|
||||
// TS packet length: TS_SIZE
|
||||
if (Running() && (*Data == TS_SYNC_BYTE) && (Length == TS_SIZE)) {
|
||||
int len, pid = TsPid(Data);
|
||||
if (pid == m_VideoPid) {
|
||||
++m_VideoPacketCount;
|
||||
len = m_VideoBuffer.Put(Data, Length);
|
||||
if (len != Length) {
|
||||
m_VideoBuffer.ReportOverflow(Length - len);
|
||||
m_VideoBuffer.Clear();
|
||||
}
|
||||
}
|
||||
else if (pid == m_AudioPid) {
|
||||
++m_AudioPacketCount;
|
||||
len = m_AudioBuffer.Put(Data, Length);
|
||||
if (len != Length) {
|
||||
m_AudioBuffer.ReportOverflow(Length - len);
|
||||
m_AudioBuffer.Clear();
|
||||
}
|
||||
}
|
||||
else if (pid == m_AC3Pid) {
|
||||
++m_AC3PacketCount;
|
||||
len = m_AC3Buffer.Put(Data, Length);
|
||||
if (len != Length) {
|
||||
m_AC3Buffer.ReportOverflow(Length - len);
|
||||
m_AC3Buffer.Clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void cFemonReceiver::Action(void)
|
||||
{
|
||||
cTimeMs calcPeriod(0);
|
||||
m_Active = true;
|
||||
bool init = true;
|
||||
while (Running() && m_Active) {
|
||||
uint8_t *Data;
|
||||
double timeout;
|
||||
int Length;
|
||||
bool processed = false;
|
||||
|
||||
// process available video data
|
||||
while ((Data = m_VideoBuffer.Get(Length))) {
|
||||
if (!m_Active || (Length < TS_SIZE))
|
||||
break;
|
||||
Length = TS_SIZE;
|
||||
if (*Data != TS_SYNC_BYTE) {
|
||||
for (int i = 1; i < Length; ++i) {
|
||||
if (Data[i] == TS_SYNC_BYTE) {
|
||||
Length = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
m_VideoBuffer.Del(Length);
|
||||
continue;
|
||||
}
|
||||
processed = true;
|
||||
if (TsPayloadStart(Data)) {
|
||||
m_VideoAssembler.Reset();
|
||||
}
|
||||
m_VideoAssembler.PutTs(Data, Length);
|
||||
m_VideoBuffer.Del(Length);
|
||||
}
|
||||
|
||||
// process available audio data
|
||||
while ((Data = m_AudioBuffer.Get(Length))) {
|
||||
if (!m_Active || (Length < TS_SIZE))
|
||||
break;
|
||||
Length = TS_SIZE;
|
||||
if (*Data != TS_SYNC_BYTE) {
|
||||
for (int i = 1; i < Length; ++i) {
|
||||
if (Data[i] == TS_SYNC_BYTE) {
|
||||
Length = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
m_AudioBuffer.Del(Length);
|
||||
continue;
|
||||
}
|
||||
processed = true;
|
||||
m_AudioAssembler.PutTs(Data, Length);
|
||||
m_AudioBuffer.Del(Length);
|
||||
}
|
||||
|
||||
// process available dolby data
|
||||
while ((Data = m_AC3Buffer.Get(Length))) {
|
||||
if (!m_Active || (Length < TS_SIZE))
|
||||
break;
|
||||
Length = TS_SIZE;
|
||||
if (*Data != TS_SYNC_BYTE) {
|
||||
for (int i = 1; i < Length; ++i) {
|
||||
if (Data[i] == TS_SYNC_BYTE) {
|
||||
Length = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
m_AC3Buffer.Del(Length);
|
||||
continue;
|
||||
}
|
||||
processed = true;
|
||||
m_AC3Assembler.PutTs(Data, Length);
|
||||
m_AC3Buffer.Del(Length);
|
||||
}
|
||||
|
||||
// calculate bitrates
|
||||
timeout = double(calcPeriod.Elapsed());
|
||||
if (m_Active && (init || (timeout >= (100.0 * config.bitrateCalcInterval )))) {
|
||||
// TS packet 188 bytes - 4 byte header; MPEG standard defines 1Mbit = 1000000bit
|
||||
// PES headers should be compensated!
|
||||
m_VideoBitrate = (1000.0 * 8.0 * 184.0 * m_VideoPacketCount) / timeout;
|
||||
m_VideoPacketCount = 0;
|
||||
m_AudioBitrate = (1000.0 * 8.0 * 184.0 * m_AudioPacketCount) / timeout;
|
||||
m_AudioPacketCount = 0;
|
||||
m_AC3Bitrate = (1000.0 * 8.0 * 184.0 * m_AC3PacketCount) / timeout;
|
||||
m_AC3PacketCount = 0;
|
||||
calcPeriod.Set(0);
|
||||
init = false;
|
||||
}
|
||||
|
||||
if (!processed)
|
||||
m_Sleep.Wait(10); // to avoid busy loop and reduce cpu load
|
||||
}
|
||||
}
|
53
libcore/femonreceiver.h
Normal file
53
libcore/femonreceiver.h
Normal file
@ -0,0 +1,53 @@
|
||||
#ifndef __FEMONRECEIVER_H
|
||||
#define __FEMONRECEIVER_H
|
||||
|
||||
#include <vdr/thread.h>
|
||||
#include <vdr/receiver.h>
|
||||
|
||||
class cFemonReceiver : public cReceiver, public cThread {
|
||||
private:
|
||||
cMutex m_Mutex;
|
||||
cCondWait m_Sleep;
|
||||
bool m_Active;
|
||||
|
||||
cRingBufferLinear m_VideoBuffer;
|
||||
cTsToPes m_VideoAssembler;
|
||||
int m_VideoType;
|
||||
int m_VideoPid;
|
||||
int m_VideoPacketCount;
|
||||
double m_VideoBitrate;
|
||||
|
||||
cRingBufferLinear m_AudioBuffer;
|
||||
cTsToPes m_AudioAssembler;
|
||||
int m_AudioPid;
|
||||
int m_AudioPacketCount;
|
||||
double m_AudioBitrate;
|
||||
bool m_AudioValid;
|
||||
|
||||
cRingBufferLinear m_AC3Buffer;
|
||||
cTsToPes m_AC3Assembler;
|
||||
int m_AC3Pid;
|
||||
int m_AC3PacketCount;
|
||||
double m_AC3Bitrate;
|
||||
bool m_AC3Valid;
|
||||
|
||||
protected:
|
||||
virtual void Activate(bool On);
|
||||
virtual void Receive(uchar *Data, int Length);
|
||||
virtual void Action(void);
|
||||
|
||||
public:
|
||||
cFemonReceiver(const cChannel* Channel, int ATrack, int DTrack);
|
||||
virtual ~cFemonReceiver();
|
||||
void Deactivate(void);
|
||||
|
||||
double VideoBitrate(void) { cMutexLock MutexLock(&m_Mutex);
|
||||
return m_VideoBitrate; }; // bit/s
|
||||
double AudioBitrate(void) { cMutexLock MutexLock(&m_Mutex);
|
||||
return m_AudioBitrate; }; // bit/s
|
||||
double AC3Bitrate(void) { cMutexLock MutexLock(&m_Mutex);
|
||||
return m_AC3Bitrate; }; // bit/s
|
||||
};
|
||||
|
||||
#endif //__FEMONRECEIVER_H
|
||||
|
@ -613,6 +613,7 @@ void cTemplateViewChannel::SetViewElements(void) {
|
||||
viewElementsAllowed.insert("signalquality");
|
||||
viewElementsAllowed.insert("signalqualityback");
|
||||
viewElementsAllowed.insert("devices");
|
||||
viewElementsAllowed.insert("bitrate");
|
||||
viewElementsAllowed.insert("scrapercontent");
|
||||
viewElementsAllowed.insert("datetime");
|
||||
viewElementsAllowed.insert("message");
|
||||
@ -655,6 +656,9 @@ string cTemplateViewChannel::GetViewElementName(eViewElement ve) {
|
||||
case veSignalQualityBack:
|
||||
name = "Signal Quality Background";
|
||||
break;
|
||||
case veBitRate:
|
||||
name = "Bit Rate";
|
||||
break;
|
||||
case veDevices:
|
||||
name = "Devices";
|
||||
break;
|
||||
@ -702,6 +706,8 @@ void cTemplateViewChannel::AddPixmap(string sViewElement, cTemplatePixmap *pix,
|
||||
ve = veSignalQuality;
|
||||
} else if (!sViewElement.compare("signalqualityback")) {
|
||||
ve = veSignalQualityBack;
|
||||
} else if (!sViewElement.compare("bitrate")) {
|
||||
ve = veBitRate;
|
||||
} else if (!sViewElement.compare("devices")) {
|
||||
ve = veDevices;
|
||||
} else if (!sViewElement.compare("scrapercontent")) {
|
||||
|
@ -37,6 +37,7 @@ enum eViewElement {
|
||||
veScreenResolution,
|
||||
veSignalQuality,
|
||||
veSignalQualityBack,
|
||||
veBitRate,
|
||||
veScraperContent,
|
||||
//DisplayMenu ViewElements
|
||||
veHeader,
|
||||
|
@ -19,7 +19,7 @@
|
||||
#endif
|
||||
|
||||
|
||||
static const char *VERSION = "0.0.3";
|
||||
static const char *VERSION = "0.0.4dev";
|
||||
static const char *DESCRIPTION = "SkinDesigner";
|
||||
static const char *MAINMENUENTRY = "Skin Designer";
|
||||
|
||||
|
@ -164,8 +164,9 @@
|
||||
{signalquality} SNR value of currently displayed channel
|
||||
-->
|
||||
<signalquality>
|
||||
<area x="22%" y="94%" width="76%" height="6%" layer="3">
|
||||
<drawtext x="0" valign="center" font="{light}" fontsize="70%" color="{clrWhite}" text="STR: {signalstrength}% SNR: {signalquality}%" />
|
||||
<area x="22%" y="94%" width="10%" height="6%" layer="3">
|
||||
<drawtext x="0" y="0" font="{light}" fontsize="50%" color="{clrWhite}" text="STR: {signalstrength}%" />
|
||||
<drawtext x="0" y="50%" font="{light}" fontsize="50%" color="{clrWhite}" text="SNR: {signalquality}%" />
|
||||
</area>
|
||||
</signalquality>
|
||||
|
||||
@ -208,6 +209,19 @@
|
||||
</area>
|
||||
</devices>
|
||||
|
||||
<!-- Available Variables scrapercontent:
|
||||
{bitratevideo} bitrate of currently displayed video track in MBit/s (with two decimal places)
|
||||
{bitrateaudio} bitrate of currently displayed stereo audio track in KBit/s
|
||||
{bitratedolby} bitrate of currently displayed ac3 audio track in KBit/s
|
||||
{isdolby} true if bitrate of ac3 stream is > 0
|
||||
-->
|
||||
<bitrate>
|
||||
<area x="32%" y="94%" width="15%" height="6%" layer="3">
|
||||
<drawtext x="0" y="0" font="{light}" fontsize="50%" color="{clrWhite}" text="Video: {bitratevideo} MBit/s" />
|
||||
<drawtext condition="not{isdolby}" x="0" y="50%" font="{light}" fontsize="50%" color="{clrWhite}" text="Stereo: {bitrateaudio} KBit/s" />
|
||||
<drawtext condition="{isdolby}" x="0" y="50%" font="{light}" fontsize="50%" color="{clrWhite}" text="AC3: {bitratedolby} KBit/s" />
|
||||
</area>
|
||||
</bitrate>
|
||||
<!-- Available Variables scrapercontent:
|
||||
{mediapath} Full Path of Poster or Banner to use in image path attribute
|
||||
{mediawidth} width of image in pixel
|
||||
|
@ -125,6 +125,15 @@
|
||||
<devices>
|
||||
</devices>
|
||||
|
||||
<!-- Available Variables scrapercontent:
|
||||
{bitratevideo} bitrate of currently displayed video track in MBit/s (with two decimal places)
|
||||
{bitrateaudio} bitrate of currently displayed stereo audio track in KBit/s
|
||||
{bitratedolby} bitrate of currently displayed ac3 audio track in KBit/s
|
||||
{isdolby} true if bitrate of ac3 stream is > 0
|
||||
-->
|
||||
<bitrate>
|
||||
</bitrate>
|
||||
|
||||
<!-- Available Variables scrapercontent:
|
||||
{mediapath} Full Path of Poster or Banner to use in image path attribute
|
||||
{mediawidth} width of image in pixel
|
||||
|
@ -5,7 +5,6 @@
|
||||
#include "../libcore/timers.h"
|
||||
#include "../libcore/helpers.h"
|
||||
|
||||
|
||||
cDisplayChannelView::cDisplayChannelView(cTemplateView *tmplView) : cView(tmplView) {
|
||||
lastDate = "";
|
||||
lastScreenWidth = 0;
|
||||
@ -18,6 +17,7 @@ cDisplayChannelView::cDisplayChannelView(cTemplateView *tmplView) : cView(tmplVi
|
||||
lastTracDesc = "";
|
||||
lastTrackLang = "";
|
||||
InitDevices();
|
||||
InitFemonReceiver();
|
||||
DeleteOsdOnExit();
|
||||
SetFadeTime(tmplView->GetNumericParameter(ptFadeTime));
|
||||
}
|
||||
@ -424,6 +424,33 @@ void cDisplayChannelView::ClearDevices(void) {
|
||||
ClearViewElement(veDevices);
|
||||
}
|
||||
|
||||
void cDisplayChannelView::DrawBitrates(void) {
|
||||
if (!ViewElementImplemented(veBitRate)) {
|
||||
return;
|
||||
}
|
||||
double bitrateVideo;
|
||||
double bitrateAudio;
|
||||
double bitrateDolby;
|
||||
|
||||
bool changed = GetBitrates(bitrateVideo, bitrateAudio, bitrateDolby);
|
||||
if (!changed) {
|
||||
return;
|
||||
}
|
||||
map < string, string > stringTokens;
|
||||
map < string, int > intTokens;
|
||||
stringTokens.insert(pair<string,string>("bitratevideo", *cString::sprintf("%.2f", bitrateVideo)));
|
||||
intTokens.insert(pair<string,int>("bitrateaudio", bitrateAudio));
|
||||
intTokens.insert(pair<string,int>("bitratedolby", bitrateDolby));
|
||||
intTokens.insert(pair<string,int>("isdolby", (bitrateDolby > 0) ? true : false));
|
||||
|
||||
ClearBitrates();
|
||||
DrawViewElement(veBitRate, &stringTokens, &intTokens);
|
||||
}
|
||||
|
||||
void cDisplayChannelView::ClearBitrates(void) {
|
||||
ClearViewElement(veBitRate);
|
||||
}
|
||||
|
||||
void cDisplayChannelView::DrawChannelGroups(const cChannel *Channel, cString ChannelName) {
|
||||
if (!ViewElementImplemented(veChannelGroup)) {
|
||||
return;
|
||||
|
@ -47,6 +47,8 @@ public:
|
||||
void ClearSignalBackground(void);
|
||||
void DrawDevices(bool initial);
|
||||
void ClearDevices(void);
|
||||
void DrawBitrates(void);
|
||||
void ClearBitrates(void);
|
||||
void DrawChannelGroups(const cChannel *Channel, cString ChannelName);
|
||||
void ClearChannelGroups(void);
|
||||
void DisplayMessage(eMessageType Type, const char *Text);
|
||||
|
@ -4,6 +4,8 @@
|
||||
|
||||
cViewHelpers::cViewHelpers(void) {
|
||||
devicesInit = false;
|
||||
femonReceiver = NULL;
|
||||
bitrateVideoLast = bitrateAudioLast = bitrateDolbyLast = 0.0;
|
||||
}
|
||||
|
||||
cViewHelpers::~cViewHelpers() {
|
||||
@ -12,6 +14,10 @@ cViewHelpers::~cViewHelpers() {
|
||||
delete[] lastSignalQuality;
|
||||
delete[] recDevices;
|
||||
}
|
||||
if (femonReceiver) {
|
||||
femonReceiver->Deactivate();
|
||||
delete femonReceiver;
|
||||
}
|
||||
}
|
||||
|
||||
void cViewHelpers::InitDevices(void) {
|
||||
@ -132,3 +138,69 @@ bool cViewHelpers::SetDevices(bool initial, map<string,int> *intTokens, vector<m
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void cViewHelpers::InitFemonReceiver(void) {
|
||||
const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
|
||||
if (channel) {
|
||||
femonReceiver = new cFemonReceiver(channel,
|
||||
IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0,
|
||||
IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0);
|
||||
cDevice::ActualDevice()->AttachReceiver(femonReceiver);
|
||||
}
|
||||
}
|
||||
|
||||
void cViewHelpers::ChannelSwitch(const cDevice * device, int channelNumber, bool liveView) {
|
||||
if (!femonReceiver)
|
||||
return;
|
||||
bitrateVideoLast = bitrateAudioLast = bitrateDolbyLast = 0.0;
|
||||
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
|
||||
const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||
|
||||
if (!liveView || !channelNumber || !channel || channel->Number() != channelNumber)
|
||||
return;
|
||||
|
||||
if (femonReceiver) {
|
||||
femonReceiver->Deactivate();
|
||||
delete femonReceiver;
|
||||
femonReceiver = NULL;
|
||||
}
|
||||
if (channel) {
|
||||
femonReceiver = new cFemonReceiver(channel,
|
||||
IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0,
|
||||
IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0);
|
||||
cDevice::ActualDevice()->AttachReceiver(femonReceiver);
|
||||
}
|
||||
}
|
||||
|
||||
void cViewHelpers::SetAudioTrack(int Index, const char * const *Tracks) {
|
||||
if (!femonReceiver)
|
||||
return;
|
||||
bitrateVideoLast = bitrateAudioLast = bitrateDolbyLast = 0.0;
|
||||
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
|
||||
if (femonReceiver) {
|
||||
femonReceiver->Deactivate();
|
||||
delete femonReceiver;
|
||||
femonReceiver = NULL;
|
||||
}
|
||||
const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||
if (channel) {
|
||||
femonReceiver = new cFemonReceiver(channel,
|
||||
IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0,
|
||||
IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0);
|
||||
cDevice::ActualDevice()->AttachReceiver(femonReceiver);
|
||||
}
|
||||
}
|
||||
|
||||
bool cViewHelpers::GetBitrates(double &bitrateVideo, double &bitrateAudio, double &bitrateDolby) {
|
||||
bitrateVideo = (int)(femonReceiver->VideoBitrate() / 1024 / 1024 * 100 + 0.5) / 100.0;
|
||||
bitrateAudio = (int)(femonReceiver->AudioBitrate() / 1024 * 100 + 0.5) / 100.0;
|
||||
bitrateDolby = (int)(femonReceiver->AC3Bitrate() / 1024 * 100 + 0.5) / 100.0;
|
||||
if (bitrateVideo != bitrateVideoLast || bitrateAudio != bitrateAudioLast || bitrateDolby != bitrateDolbyLast) {
|
||||
bitrateVideoLast = bitrateVideo;
|
||||
bitrateAudioLast = bitrateAudio;
|
||||
bitrateDolbyLast = bitrateDolby;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -1,18 +1,29 @@
|
||||
#ifndef __VIEWHELPERS_H
|
||||
#define __VIEWHELPERS_H
|
||||
|
||||
class cViewHelpers {
|
||||
#include <vdr/status.h>
|
||||
#include "../libcore/femonreceiver.h"
|
||||
|
||||
class cViewHelpers : public cStatus {
|
||||
private:
|
||||
bool devicesInit;
|
||||
int* lastSignalStrength;
|
||||
int* lastSignalQuality;
|
||||
bool* recDevices;
|
||||
cFemonReceiver *femonReceiver;
|
||||
double bitrateVideoLast;
|
||||
double bitrateAudioLast;
|
||||
double bitrateDolbyLast;
|
||||
protected:
|
||||
virtual void ChannelSwitch(const cDevice *device, int channelNumber, bool liveView);
|
||||
virtual void SetAudioTrack(int Index, const char * const *Tracks);
|
||||
void InitDevices(void);
|
||||
bool SetDevices(bool initial, map<string,int> *intTokens, vector<map<string,string> > *devices);
|
||||
void InitFemonReceiver(void);
|
||||
bool GetBitrates(double &bitrateVideo, double &bitrateAudio, double &bitrateDolby);
|
||||
public:
|
||||
cViewHelpers(void);
|
||||
virtual ~cViewHelpers(void);
|
||||
void InitDevices(void);
|
||||
bool SetDevices(bool initial, map<string,int> *intTokens, vector<map<string,string> > *devices);
|
||||
};
|
||||
|
||||
#endif //__VIEWHELPERS_H
|
Loading…
Reference in New Issue
Block a user