Skip to content

Commit

Permalink
Merge pull request #6545 from FernetMenta/audiosync
Browse files Browse the repository at this point in the history
dvdplayer: audiosync
  • Loading branch information
FernetMenta committed Feb 27, 2015
2 parents 52b0f6d + cec0fb4 commit 028f159
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 4 deletions.
7 changes: 7 additions & 0 deletions xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp
Expand Up @@ -292,6 +292,13 @@ bool CActiveAEBufferPoolResample::ResampleBuffers(int64_t timestamp)
in ? in->pkt->data : NULL,
in ? in->pkt->nb_samples : 0,
m_resampleRatio);
// in case of error, trigger re-create of resampler
if (out_samples < 0)
{
out_samples = 0;
m_changeResampler = true;
}

m_procSample->pkt->nb_samples += out_samples;
busy = true;
m_empty = (out_samples == 0);
Expand Down
Expand Up @@ -184,19 +184,19 @@ int CActiveAEResampleFFMPEG::Resample(uint8_t **dst_buffer, int dst_samples, uin
if (ratio != 1.0)
{
if (swr_set_compensation(m_pContext,
(dst_samples*ratio-dst_samples)*m_dst_rate/m_src_rate,
dst_samples*m_dst_rate/m_src_rate) < 0)
(dst_samples*ratio-dst_samples)*m_dst_rate/m_src_rate,
dst_samples*m_dst_rate/m_src_rate) < 0)
{
CLog::Log(LOGERROR, "CActiveAEResampleFFMPEG::Resample - set compensation failed");
return 0;
return -1;
}
}

int ret = swr_convert(m_pContext, dst_buffer, dst_samples, (const uint8_t**)src_buffer, src_samples);
if (ret < 0)
{
CLog::Log(LOGERROR, "CActiveAEResampleFFMPEG::Resample - resample failed");
return 0;
return -1;
}

// special handling for S24 formats which are carried in S32
Expand Down
3 changes: 3 additions & 0 deletions xbmc/cores/dvdplayer/DVDPlayerAudio.cpp
Expand Up @@ -371,6 +371,7 @@ int CDVDPlayerAudio::DecodeFrame(DVDAudioFrame &audioframe)
m_dvdAudio.SetPlayingPts(m_audioClock);
if (pMsgGeneralResync->m_clock)
m_pClock->Discontinuity(m_dvdAudio.GetPlayingPts());
m_syncclock = true;
}
else if (pMsg->IsType(CDVDMsg::GENERAL_RESET))
{
Expand Down Expand Up @@ -652,6 +653,8 @@ void CDVDPlayerAudio::HandleSyncError(double duration)
if (fabs(error) > DVD_MSEC_TO_TIME(100))
{
m_syncclock = true;
m_errors.Flush();
m_integral = 0.0;
return;
}
else if (m_syncclock && fabs(error) < DVD_MSEC_TO_TIME(50))
Expand Down

0 comments on commit 028f159

Please sign in to comment.