diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp index d11e98727417e..ed98c7bf4c85c 100644 --- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp @@ -74,7 +74,10 @@ void CEngineStats::AddSamples(int samples, std::list &streams) std::deque::iterator itBuf; for(itBuf=(*it)->m_processingSamples.begin(); itBuf!=(*it)->m_processingSamples.end(); ++itBuf) { - delay += (float)(*itBuf)->pkt->nb_samples / (*itBuf)->pkt->config.sample_rate; + if (m_pcmOutput) + delay += (float)(*itBuf)->pkt->nb_samples / (*itBuf)->pkt->config.sample_rate; + else + delay += m_sinkFormat.m_streamInfo.GetDuration() / 1000; } delay += (*it)->m_resampleBuffers->GetDelay(); (*it)->m_bufferedTime = delay; diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp index 8e3acf5cb0b48..2b90f759a7fd8 100644 --- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp @@ -895,7 +895,21 @@ unsigned int CActiveAESink::OutputSamples(CSampleBuffer* samples) if (m_requestedFormat.m_dataFormat == AE_FMT_RAW && m_needIecPack && samples->pool) { - m_packer->Pack(m_sinkFormat.m_streamInfo, buffer[0], frames); + if (m_sinkFormat.m_streamInfo.m_type == CAEStreamInfo::STREAM_TYPE_TRUEHD) + { + int offset; + int len; + m_packer->GetBuffer(); + for (int i=0; i<24; i++) + { + offset = i*2560; + len = (*(buffer[0] + offset+2560-2) << 8) + *(buffer[0] + offset+2560-1); + m_packer->Pack(m_sinkFormat.m_streamInfo, buffer[0] + offset, len); + } + } + else + m_packer->Pack(m_sinkFormat.m_streamInfo, buffer[0], frames); + unsigned int size = m_packer->GetSize(); packBuffer = m_packer->GetBuffer(); buffer = &packBuffer; diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp index 640bf87601d64..a83533de1ebba 100644 --- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp @@ -263,13 +263,37 @@ unsigned int CActiveAEStream::AddData(uint8_t* const *data, unsigned int offset, } copied += minFrames; + bool rawPktComplete = false; { CSingleLock lock(*m_statsLock); - m_currentBuffer->pkt->nb_samples += minFrames; - m_bufferedTime += (double)minFrames / m_currentBuffer->pkt->config.sample_rate; + if (m_format.m_dataFormat != AE_FMT_RAW) + { + m_currentBuffer->pkt->nb_samples += minFrames; + m_bufferedTime += (double)minFrames / m_currentBuffer->pkt->config.sample_rate; + } + else + { + if (m_format.m_streamInfo.m_type == CAEStreamInfo::STREAM_TYPE_TRUEHD) + { + m_currentBuffer->pkt->nb_samples += 2560; + uint8_t highByte = (minFrames >> 8) & 0xFF; + uint8_t lowByte = minFrames & 0xFF; + memcpy(m_currentBuffer->pkt->data[0]+m_currentBuffer->pkt->nb_samples-2, &highByte, 1); + memcpy(m_currentBuffer->pkt->data[0]+m_currentBuffer->pkt->nb_samples-1, &lowByte, 1); + m_bufferedTime += m_format.m_streamInfo.GetDuration() / 1000 / 24; + if (m_currentBuffer->pkt->nb_samples / 2560 == 24) + rawPktComplete = true; + } + else + { + m_bufferedTime += m_format.m_streamInfo.GetDuration() / 1000; + m_currentBuffer->pkt->nb_samples += minFrames; + rawPktComplete = true; + } + } } - if (m_currentBuffer->pkt->nb_samples == m_currentBuffer->pkt->max_nb_samples || m_format.m_dataFormat == AE_FMT_RAW) + if (m_currentBuffer->pkt->nb_samples == m_currentBuffer->pkt->max_nb_samples || rawPktComplete) { MsgStreamSample msgData; msgData.buffer = m_currentBuffer; diff --git a/xbmc/cores/AudioEngine/Utils/AEBitstreamPacker.cpp b/xbmc/cores/AudioEngine/Utils/AEBitstreamPacker.cpp index 84ec762338b4d..0ac5bfd590ba0 100644 --- a/xbmc/cores/AudioEngine/Utils/AEBitstreamPacker.cpp +++ b/xbmc/cores/AudioEngine/Utils/AEBitstreamPacker.cpp @@ -98,6 +98,7 @@ unsigned int CAEBitstreamPacker::GetSize() uint8_t* CAEBitstreamPacker::GetBuffer() { m_dataSize = 0; + m_trueHDPos = 0; return m_packedBuffer; }