diff options
-rwxr-xr-x | language/English/strings.po | 9 | ||||
-rw-r--r-- | system/settings/settings.xml | 4 | ||||
-rw-r--r-- | xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 27 | ||||
-rw-r--r-- | xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h | 1 | ||||
-rw-r--r-- | xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp | 11 | ||||
-rw-r--r-- | xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h | 3 | ||||
-rw-r--r-- | xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.cpp | 4 | ||||
-rw-r--r-- | xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h | 2 | ||||
-rw-r--r-- | xbmc/cores/AudioEngine/Utils/AERemap.cpp | 3 | ||||
-rw-r--r-- | xbmc/cores/omxplayer/OMXAudio.cpp | 4 | ||||
-rw-r--r-- | xbmc/cores/omxplayer/PCMRemap.cpp | 2 | ||||
-rw-r--r-- | xbmc/filesystem/File.cpp | 20 | ||||
-rw-r--r-- | xbmc/filesystem/LibraryDirectory.cpp | 3 | ||||
-rw-r--r-- | xbmc/guilib/GUIIncludes.cpp | 6 | ||||
-rw-r--r-- | xbmc/guilib/GUIWindow.cpp | 2 | ||||
-rw-r--r-- | xbmc/profiles/ProfilesManager.cpp | 5 | ||||
-rw-r--r-- | xbmc/profiles/ProfilesManager.h | 1 | ||||
-rw-r--r-- | xbmc/settings/Settings.cpp | 1 | ||||
-rw-r--r-- | xbmc/video/VideoDatabase.cpp | 3 |
19 files changed, 82 insertions, 29 deletions
diff --git a/language/English/strings.po b/language/English/strings.po index bd391fcaac..5096061f53 100755 --- a/language/English/strings.po +++ b/language/English/strings.po @@ -1434,7 +1434,7 @@ msgstr "" #: system/settings/settings.xml msgctxt "#346" -msgid "Boost volume level on downmix" +msgid "Normalize levels on downmix" msgstr "" #: system/settings/settings.xml @@ -14660,7 +14660,12 @@ msgctxt "#36532" msgid "Same as movie" msgstr "" -#empty strings from id 36533 to 36534 +#: settings/DisplaySettings.cpp +msgctxt "#36533" +msgid "Select how audio is downmixed, for example from 5.1 to 2.0: [Enabled] maintains the dynamic range of the original audio source when downmixed however volume will be lower [Disabled] maintains volume level of the original audio source however the dynamic range is compressed. Note - Dynamic range is the difference between the quietest and loudest sounds in a audio source." +msgstr "" + +#empty strings from id 36534 to 36534 #: guilib/StereoscopicsManager.cpp #: xbmc/video/dialogs/GUIDialogVideoSettings.cpp diff --git a/system/settings/settings.xml b/system/settings/settings.xml index f998480f71..00dce05c91 100644 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -2172,6 +2172,10 @@ </dependencies> <control type="toggle" /> </setting> + <setting id="audiooutput.normalizelevels" type="boolean" label="346" help="36533"> + <level>2</level> + <default>true</default> + </setting> <setting id="audiooutput.processquality" type="integer" label="13505" help="36169"> <requirement>HAS_AE_QUALITY_LEVELS</requirement> <level>2</level> diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp index 6494fab743..719494506f 100644 --- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp @@ -1004,7 +1004,7 @@ void CActiveAE::Configure(AEAudioFormat *desiredFmt) { (*it)->m_resampleBuffers = new CActiveAEBufferPoolResample((*it)->m_inputBuffers->m_format, outputFormat, m_settings.resampleQuality); (*it)->m_resampleBuffers->m_changeResampler = (*it)->m_forceResampler; - (*it)->m_resampleBuffers->Create(MAX_CACHE_LEVEL*1000, false, m_settings.stereoupmix); + (*it)->m_resampleBuffers->Create(MAX_CACHE_LEVEL*1000, false, m_settings.stereoupmix, m_settings.normalizelevels); } if (m_mode == MODE_TRANSCODE || m_streams.size() > 1) (*it)->m_resampleBuffers->m_fillPackets = true; @@ -1240,14 +1240,22 @@ void CActiveAE::ChangeResamplers() std::list<CActiveAEStream*>::iterator it; for(it=m_streams.begin(); it!=m_streams.end(); ++it) { + bool normalize = true; + if (((*it)->m_resampleBuffers->m_format.m_channelLayout.Count() < + (*it)->m_resampleBuffers->m_inputFormat.m_channelLayout.Count()) && + !m_settings.normalizelevels) + normalize = false; + if ((*it)->m_resampleBuffers && (*it)->m_resampleBuffers->m_resampler && (((*it)->m_resampleBuffers->m_resampleQuality != m_settings.resampleQuality) || - ((*it)->m_resampleBuffers->m_stereoUpmix != m_settings.stereoupmix))) + (((*it)->m_resampleBuffers->m_stereoUpmix != m_settings.stereoupmix)) || + ((*it)->m_resampleBuffers->m_normalize != normalize))) { (*it)->m_resampleBuffers->m_changeResampler = true; } (*it)->m_resampleBuffers->m_resampleQuality = m_settings.resampleQuality; (*it)->m_resampleBuffers->m_stereoUpmix = m_settings.stereoupmix; + (*it)->m_resampleBuffers->m_normalize = normalize; } } @@ -1634,8 +1642,9 @@ bool CActiveAE::RunStages() fadingStep = delta / samples; } - // for stream amplification we need to run on a per sample basis - if ((*it)->m_amplify != 1.0) + // for streams amplification of turned off downmix normalization + // we need to run on a per sample basis + if ((*it)->m_amplify != 1.0 || !(*it)->m_resampleBuffers->m_normalize) { nb_floats = out->pkt->config.channels / out->pkt->planes; nb_loops = out->pkt->nb_samples; @@ -1700,8 +1709,9 @@ bool CActiveAE::RunStages() fadingStep = delta / samples; } - // for stream amplification we need to run on a per sample basis - if ((*it)->m_amplify != 1.0) + // for streams amplification of turned off downmix normalization + // we need to run on a per sample basis + if ((*it)->m_amplify != 1.0 || !(*it)->m_resampleBuffers->m_normalize) { nb_floats = out->pkt->config.channels / out->pkt->planes; nb_loops = out->pkt->nb_samples; @@ -1981,6 +1991,7 @@ void CActiveAE::LoadSettings() m_settings.samplerate = CSettings::Get().GetInt("audiooutput.samplerate"); m_settings.stereoupmix = CSettings::Get().GetBool("audiooutput.stereoupmix"); + m_settings.normalizelevels = CSettings::Get().GetBool("audiooutput.normalizelevels"); m_settings.passthrough = m_settings.config == AE_CONFIG_FIXED ? false : CSettings::Get().GetBool("audiooutput.passthrough"); m_settings.ac3passthrough = CSettings::Get().GetBool("audiooutput.ac3passthrough"); @@ -2057,7 +2068,8 @@ void CActiveAE::OnSettingsChange(const std::string& setting) setting == "audiooutput.streamsilence" || setting == "audiooutput.processquality" || setting == "audiooutput.passthrough" || - setting == "audiooutput.samplerate") + setting == "audiooutput.samplerate" || + setting == "audiooutput.normalizelevels") { m_controlPort.SendOutMessage(CActiveAEControlProtocol::RECONFIGURE); } @@ -2438,6 +2450,7 @@ bool CActiveAE::ResampleSound(CActiveAESound *sound) orig_config.fmt, orig_config.bits_per_sample, false, + true, NULL, AE_QUALITY_MID); diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h index 0156593f39..2955bb8a58 100644 --- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h @@ -55,6 +55,7 @@ struct AudioSettings bool truehdpassthrough; bool dtshdpassthrough; bool stereoupmix; + bool normalizelevels; bool passthrough; int config; unsigned int samplerate; diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp index e64b2485fa..b5daee6995 100644 --- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp @@ -146,6 +146,7 @@ CActiveAEBufferPoolResample::CActiveAEBufferPoolResample(AEAudioFormat inputForm m_resampleQuality = quality; m_changeResampler = false; m_stereoUpmix = false; + m_normalize = true; } CActiveAEBufferPoolResample::~CActiveAEBufferPoolResample() @@ -153,10 +154,15 @@ CActiveAEBufferPoolResample::~CActiveAEBufferPoolResample() delete m_resampler; } -bool CActiveAEBufferPoolResample::Create(unsigned int totaltime, bool remap, bool upmix) +bool CActiveAEBufferPoolResample::Create(unsigned int totaltime, bool remap, bool upmix, bool normalize) { CActiveAEBufferPool::Create(totaltime); + m_stereoUpmix = upmix; + m_normalize = true; + if ((m_format.m_channelLayout.Count() < m_inputFormat.m_channelLayout.Count() && !normalize)) + m_normalize = false; + if (m_inputFormat.m_channelLayout != m_format.m_channelLayout || m_inputFormat.m_sampleRate != m_format.m_sampleRate || m_inputFormat.m_dataFormat != m_format.m_dataFormat || @@ -174,11 +180,11 @@ bool CActiveAEBufferPoolResample::Create(unsigned int totaltime, bool remap, boo CActiveAEResample::GetAVSampleFormat(m_inputFormat.m_dataFormat), CAEUtil::DataFormatToUsedBits(m_inputFormat.m_dataFormat), upmix, + m_normalize, remap ? &m_format.m_channelLayout : NULL, m_resampleQuality); } - m_stereoUpmix = upmix; m_changeResampler = false; return true; @@ -200,6 +206,7 @@ void CActiveAEBufferPoolResample::ChangeResampler() CActiveAEResample::GetAVSampleFormat(m_inputFormat.m_dataFormat), CAEUtil::DataFormatToUsedBits(m_inputFormat.m_dataFormat), m_stereoUpmix, + m_normalize, NULL, m_resampleQuality); diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h index fb1b19757d..8475918de9 100644 --- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h @@ -90,7 +90,7 @@ class CActiveAEBufferPoolResample : public CActiveAEBufferPool public: CActiveAEBufferPoolResample(AEAudioFormat inputFormat, AEAudioFormat outputFormat, AEQuality quality); virtual ~CActiveAEBufferPoolResample(); - virtual bool Create(unsigned int totaltime, bool remap, bool upmix); + virtual bool Create(unsigned int totaltime, bool remap, bool upmix, bool normalize = true); void ChangeResampler(); bool ResampleBuffers(unsigned int timestamp = 0); float GetDelay(); @@ -108,6 +108,7 @@ public: double m_resampleRatio; AEQuality m_resampleQuality; bool m_stereoUpmix; + bool m_normalize; }; } diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.cpp index 2c5f41bb69..e2e4aa591a 100644 --- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.cpp +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.cpp @@ -36,7 +36,7 @@ CActiveAEResample::~CActiveAEResample() m_dllSwResample.Unload(); } -bool CActiveAEResample::Init(uint64_t dst_chan_layout, int dst_channels, int dst_rate, AVSampleFormat dst_fmt, int dst_bits, uint64_t src_chan_layout, int src_channels, int src_rate, AVSampleFormat src_fmt, int src_bits, bool upmix, CAEChannelInfo *remapLayout, AEQuality quality) +bool CActiveAEResample::Init(uint64_t dst_chan_layout, int dst_channels, int dst_rate, AVSampleFormat dst_fmt, int dst_bits, uint64_t src_chan_layout, int src_channels, int src_rate, AVSampleFormat src_fmt, int src_bits, bool upmix, bool normalize, CAEChannelInfo *remapLayout, AEQuality quality) { if (!m_dllAvUtil.Load() || !m_dllSwResample.Load()) return false; @@ -86,7 +86,7 @@ bool CActiveAEResample::Init(uint64_t dst_chan_layout, int dst_channels, int dst // not required for sink stage (remapLayout == true) if ((m_dst_fmt == AV_SAMPLE_FMT_FLT || m_dst_fmt == AV_SAMPLE_FMT_FLTP) && (m_src_fmt == AV_SAMPLE_FMT_FLT || m_src_fmt == AV_SAMPLE_FMT_FLTP) && - !remapLayout) + !remapLayout && normalize) { m_dllAvUtil.av_opt_set_double(m_pContext, "rematrix_maxval", 1.0, 0); } diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h index 6fb39ebd5c..792ff12c6d 100644 --- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h @@ -34,7 +34,7 @@ class CActiveAEResample public: CActiveAEResample(); virtual ~CActiveAEResample(); - bool Init(uint64_t dst_chan_layout, int dst_channels, int dst_rate, AVSampleFormat dst_fmt, int dst_bits, uint64_t src_chan_layout, int src_channels, int src_rate, AVSampleFormat src_fmt, int src_bits, bool upmix, CAEChannelInfo *remapLayout, AEQuality quality); + bool Init(uint64_t dst_chan_layout, int dst_channels, int dst_rate, AVSampleFormat dst_fmt, int dst_bits, uint64_t src_chan_layout, int src_channels, int src_rate, AVSampleFormat src_fmt, int src_bits, bool upmix, bool normalize, CAEChannelInfo *remapLayout, AEQuality quality); int Resample(uint8_t **dst_buffer, int dst_samples, uint8_t **src_buffer, int src_samples, double ratio); int64_t GetDelay(int64_t base); int GetBufferedSamples(); diff --git a/xbmc/cores/AudioEngine/Utils/AERemap.cpp b/xbmc/cores/AudioEngine/Utils/AERemap.cpp index f99d52eeac..0f68c8df2f 100644 --- a/xbmc/cores/AudioEngine/Utils/AERemap.cpp +++ b/xbmc/cores/AudioEngine/Utils/AERemap.cpp @@ -206,8 +206,7 @@ bool CAERemap::Initialize(CAEChannelInfo input, CAEChannelInfo output, bool fina normalize = true; else { - //FIXME: guisetting is reversed, change the setting name after frodo - normalize = !CSettings::Get().GetBool("audiooutput.normalizelevels"); + normalize = CSettings::Get().GetBool("audiooutput.normalizelevels"); CLog::Log(LOGDEBUG, "AERemap: Downmix normalization is %s", (normalize ? "enabled" : "disabled")); } diff --git a/xbmc/cores/omxplayer/OMXAudio.cpp b/xbmc/cores/omxplayer/OMXAudio.cpp index a03d53bb00..e4d725d123 100644 --- a/xbmc/cores/omxplayer/OMXAudio.cpp +++ b/xbmc/cores/omxplayer/OMXAudio.cpp @@ -1087,6 +1087,10 @@ unsigned int COMXAudio::AddPackets(const void* data, unsigned int len, double dt void COMXAudio::UpdateAttenuation() { + // always called with m_critSection lock held + if (!m_Initialized || m_Passthrough) + return; + if (m_amplification == 1.0) { ApplyVolume(); diff --git a/xbmc/cores/omxplayer/PCMRemap.cpp b/xbmc/cores/omxplayer/PCMRemap.cpp index c0733c6309..c6431751a2 100644 --- a/xbmc/cores/omxplayer/PCMRemap.cpp +++ b/xbmc/cores/omxplayer/PCMRemap.cpp @@ -364,7 +364,7 @@ void CPCMRemap::BuildMap() m_outStride = m_inSampleSize * m_outChannels; /* see if we need to normalize the levels */ - bool dontnormalize = CSettings::Get().GetBool("audiooutput.normalizelevels"); + bool dontnormalize = !CSettings::Get().GetBool("audiooutput.normalizelevels"); CLog::Log(LOGDEBUG, "CPCMRemap: Downmix normalization is %s", (dontnormalize ? "disabled" : "enabled")); ResolveChannels(); diff --git a/xbmc/filesystem/File.cpp b/xbmc/filesystem/File.cpp index 357b8db84f..0973657387 100644 --- a/xbmc/filesystem/File.cpp +++ b/xbmc/filesystem/File.cpp @@ -402,6 +402,16 @@ bool CFile::Exists(const CStdString& strFileName, bool bUseCache /* = true */) int CFile::Stat(struct __stat64 *buffer) { + if (!buffer) + return -1; + + if (!m_pFile) + { + memset(buffer, 0, sizeof(struct __stat64)); + errno = ENOENT; + return -1; + } + return m_pFile->Stat(buffer); } @@ -414,6 +424,9 @@ bool CFile::SkipNext() int CFile::Stat(const CStdString& strFileName, struct __stat64* buffer) { + if (!buffer) + return -1; + CURL url; try @@ -463,7 +476,7 @@ int CFile::Stat(const CStdString& strFileName, struct __stat64* buffer) unsigned int CFile::Read(void *lpBuf, int64_t uiBufSize) { - if (!m_pFile) + if (!m_pFile || !lpBuf) return 0; if(m_pBuffer) @@ -641,7 +654,7 @@ int64_t CFile::GetPosition() const //********************************************************************************************* bool CFile::ReadString(char *szLine, int iLineLength) { - if (!m_pFile) + if (!m_pFile || !szLine) return false; if (m_pBuffer) @@ -701,6 +714,9 @@ bool CFile::ReadString(char *szLine, int iLineLength) int CFile::Write(const void* lpBuf, int64_t uiBufSize) { + if (!m_pFile || !lpBuf) + return -1; + try { return m_pFile->Write(lpBuf, uiBufSize); diff --git a/xbmc/filesystem/LibraryDirectory.cpp b/xbmc/filesystem/LibraryDirectory.cpp index 79ee3a4d3c..d3adb35129 100644 --- a/xbmc/filesystem/LibraryDirectory.cpp +++ b/xbmc/filesystem/LibraryDirectory.cpp @@ -84,7 +84,10 @@ bool CLibraryDirectory::GetDirectory(const CStdString& strPath, CFileItemList &i CStdString path; XMLUtils::GetPath(node, "path", path); if (!path.IsEmpty()) + { + URIUtils::AddSlashAtEnd(path); return CDirectory::GetDirectory(path, items, m_strFileMask, m_flags); + } } } return false; diff --git a/xbmc/guilib/GUIIncludes.cpp b/xbmc/guilib/GUIIncludes.cpp index 9240f50f88..0bab17917c 100644 --- a/xbmc/guilib/GUIIncludes.cpp +++ b/xbmc/guilib/GUIIncludes.cpp @@ -49,6 +49,12 @@ CGUIIncludes::CGUIIncludes() m_constantNodes.insert("posx"); m_constantNodes.insert("posy"); + m_constantNodes.insert("left"); + m_constantNodes.insert("right"); + m_constantNodes.insert("centerx"); + m_constantNodes.insert("top"); + m_constantNodes.insert("bottom"); + m_constantNodes.insert("centery"); m_constantNodes.insert("width"); m_constantNodes.insert("height"); m_constantNodes.insert("offsetx"); diff --git a/xbmc/guilib/GUIWindow.cpp b/xbmc/guilib/GUIWindow.cpp index a1f894b956..8306c793f3 100644 --- a/xbmc/guilib/GUIWindow.cpp +++ b/xbmc/guilib/GUIWindow.cpp @@ -219,6 +219,8 @@ bool CGUIWindow::Load(TiXmlElement* pRootElement) { XMLUtils::GetFloat(pChild, "posx", m_posX); XMLUtils::GetFloat(pChild, "posy", m_posY); + XMLUtils::GetFloat(pChild, "left", m_posX); + XMLUtils::GetFloat(pChild, "top", m_posY); TiXmlElement *originElement = pChild->FirstChildElement("origin"); while (originElement) diff --git a/xbmc/profiles/ProfilesManager.cpp b/xbmc/profiles/ProfilesManager.cpp index 0e55d3b8e1..ce3e6dcdd2 100644 --- a/xbmc/profiles/ProfilesManager.cpp +++ b/xbmc/profiles/ProfilesManager.cpp @@ -80,11 +80,6 @@ CProfilesManager& CProfilesManager::Get() return sProfilesManager; } -bool CProfilesManager::OnSettingsLoading() -{ - return true; -} - void CProfilesManager::OnSettingsLoaded() { // check them all diff --git a/xbmc/profiles/ProfilesManager.h b/xbmc/profiles/ProfilesManager.h index e9749136f7..8d7b4fa760 100644 --- a/xbmc/profiles/ProfilesManager.h +++ b/xbmc/profiles/ProfilesManager.h @@ -32,7 +32,6 @@ class CProfilesManager : public ISettingsHandler public: static CProfilesManager& Get(); - virtual bool OnSettingsLoading(); virtual void OnSettingsLoaded(); virtual bool OnSettingsSaved(); virtual void OnSettingsCleared(); diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp index a90164ddf3..226669a9fd 100644 --- a/xbmc/settings/Settings.cpp +++ b/xbmc/settings/Settings.cpp @@ -930,6 +930,7 @@ void CSettings::InitializeISettingCallbacks() settingSet.insert("audiooutput.audiodevice"); settingSet.insert("audiooutput.passthroughdevice"); settingSet.insert("audiooutput.streamsilence"); + settingSet.insert("audiooutput.normalizelevels"); settingSet.insert("lookandfeel.skin"); settingSet.insert("lookandfeel.skinsettings"); settingSet.insert("lookandfeel.font"); diff --git a/xbmc/video/VideoDatabase.cpp b/xbmc/video/VideoDatabase.cpp index c0c083ccd0..b78b9da702 100644 --- a/xbmc/video/VideoDatabase.cpp +++ b/xbmc/video/VideoDatabase.cpp @@ -1146,7 +1146,6 @@ int CVideoDatabase::AddMovie(const CStdString& strFilenameAndPath) CStdString strSQL=PrepareSQL("insert into movie (idMovie, idFile) values (NULL, %i)", idFile); m_pDS->exec(strSQL.c_str()); idMovie = (int)m_pDS->lastinsertid(); -// CommitTransaction(); } return idMovie; @@ -1200,8 +1199,6 @@ int CVideoDatabase::AddTvShow(const CStdString& strPath) strSQL=PrepareSQL("insert into tvshowlinkpath values (%i,%i)",idTvShow,idPath); m_pDS->exec(strSQL.c_str()); -// CommitTransaction(); - return idTvShow; } catch (...) |