summaryrefslogtreecommitdiff
path: root/setup.c
diff options
context:
space:
mode:
Diffstat (limited to 'setup.c')
-rw-r--r--setup.c83
1 files changed, 70 insertions, 13 deletions
diff --git a/setup.c b/setup.c
index cea00a1..9cf28d2 100644
--- a/setup.c
+++ b/setup.c
@@ -36,20 +36,33 @@ class cRpiSetupPage : public cMenuSetupPage
public:
- cRpiSetupPage(int *audioPort, int *passthrough, bool *audioSetupChanged) :
+ cRpiSetupPage(int *audioPort, int *passthrough, int *ignoreAudioEDID,
+ bool *audioSetupChanged) :
m_audioPort(audioPort),
m_passthrough(passthrough),
+ m_ignoreAudioEDID(ignoreAudioEDID),
m_audioSetupChanged(audioSetupChanged)
{
- static const char *const audioport[] = { tr("analog"), tr("HDMI") };
-
m_newAudioPort = *m_audioPort;
m_newPassthrough = *m_passthrough;
+ m_newIgnoreAudioEDID = *m_ignoreAudioEDID;
- Add(new cMenuEditStraItem(
- tr("Audio Port"), &m_newAudioPort, 2, audioport));
- Add(new cMenuEditBoolItem(
- tr("Digital Audio Pass-Through"), &m_newPassthrough));
+ Setup();
+ }
+
+ eOSState ProcessKey(eKeys Key)
+ {
+ int newAudioPort = m_newAudioPort;
+ bool newPassthrough = m_newPassthrough;
+
+ eOSState state = cMenuSetupPage::ProcessKey(Key);
+
+ if (Key != kNone)
+ if ((newAudioPort != m_newAudioPort) ||
+ (newPassthrough != m_newPassthrough))
+ Setup();
+
+ return state;
}
protected:
@@ -58,26 +71,60 @@ protected:
{
*m_audioSetupChanged =
(*m_audioPort != m_newAudioPort) ||
- (*m_passthrough != m_newPassthrough);
+ (*m_passthrough != m_newPassthrough) ||
+ (*m_ignoreAudioEDID != m_newIgnoreAudioEDID);
SetupStore("AudioPort", *m_audioPort = m_newAudioPort);
SetupStore("PassThrough", *m_passthrough = m_newPassthrough);
+ SetupStore("IgnoreAudioEDID", *m_ignoreAudioEDID = m_newIgnoreAudioEDID);
}
private:
+ void Setup(void)
+ {
+ int current = Current();
+ Clear();
+
+ Add(new cMenuEditStraItem(
+ tr("Audio Port"), &m_newAudioPort, 2, s_audioport));
+
+ if (m_newAudioPort == 1)
+ {
+ Add(new cMenuEditBoolItem(
+ tr("Digital Audio Pass-Through"), &m_newPassthrough));
+
+ if (m_newPassthrough)
+ Add(new cMenuEditBoolItem(
+ tr("Ignore Audio EDID"), &m_newIgnoreAudioEDID));
+ }
+
+ SetCurrent(Get(current));
+ Display();
+ }
+
int m_newAudioPort;
int m_newPassthrough;
+ int m_newIgnoreAudioEDID;
int *m_audioPort;
int *m_passthrough;
+ int *m_ignoreAudioEDID;
bool *m_audioSetupChanged;
+ static const char *const s_audioport[2];
};
+const char *const cRpiSetupPage::s_audioport[] =
+ { tr("analog"), tr("HDMI") };
+
bool cRpiSetup::HwInit(void)
{
+ cRpiSetup* instance = GetInstance();
+ if (!instance)
+ return false;
+
bcm_host_init();
if (!vc_gencmd_send("codec_enabled MPG2"))
@@ -115,9 +162,9 @@ bool cRpiSetup::HwInit(void)
ILOG("using %s video output at %dx%d%s",
cVideoPort::Str(port), width, height, progressive ? "p" : "i");
- GetInstance()->m_isProgressive = progressive;
- GetInstance()->m_displayHeight = height;
- GetInstance()->m_displayWidth = width;
+ instance->m_isProgressive = progressive;
+ instance->m_displayHeight = height;
+ instance->m_displayWidth = width;
}
else
{
@@ -131,11 +178,19 @@ bool cRpiSetup::HwInit(void)
bool cRpiSetup::IsAudioFormatSupported(cAudioCodec::eCodec codec,
int channels, int samplingRate)
{
+ // MPEG-1 layer 2 audio pass-through not supported by audio render
+ // and AAC audio pass-through not yet working
+ if (codec == cAudioCodec::eMPG || codec == cAudioCodec::eAAC)
+ return false;
+
+ if (IgnoreAudioEDID())
+ return true;
+
if (vc_tv_hdmi_audio_supported(
codec == cAudioCodec::eMPG ? EDID_AudioFormat_eMPEG1 :
codec == cAudioCodec::eAC3 ? EDID_AudioFormat_eAC3 :
codec == cAudioCodec::eEAC3 ? EDID_AudioFormat_eEAC3 :
- codec == cAudioCodec::eAAC ? EDID_AudioFormat_eAAC :
+ codec == cAudioCodec::eAAC ? EDID_AudioFormat_eAAC :
EDID_AudioFormat_ePCM, channels,
samplingRate == 32000 ? EDID_AudioSampleRate_e32KHz :
samplingRate == 44100 ? EDID_AudioSampleRate_e44KHz :
@@ -174,13 +229,15 @@ bool cRpiSetup::HasAudioSetupChanged(void)
cMenuSetupPage* cRpiSetup::GetSetupPage(void)
{
return new cRpiSetupPage(
- &m_audioPort, &m_passthrough, &m_audioSetupChanged);
+ &m_audioPort, &m_passthrough, &m_ignoreAudioEDID,
+ &m_audioSetupChanged);
}
bool cRpiSetup::Parse(const char *name, const char *value)
{
if (!strcasecmp(name, "AudioPort")) m_audioPort = atoi(value);
else if (!strcasecmp(name, "PassThrough")) m_passthrough = atoi(value);
+ else if (!strcasecmp(name, "IgnoreAudioEDID")) m_ignoreAudioEDID = atoi(value);
else return false;
return true;