Packet* CPlaylist::ReturnNextAudioPacket() { CAutoLock vectorLock(&m_sectionVector); firstPacketRead=true; firstAudioPESPacketSeen=true; Packet * ret = (*m_itCurrentAudioPlayBackClip)->ReturnNextAudioPacket(playlistFirstPacketTime); if (ret) { ret->nPlaylist=nPlaylist; } else { if (m_itCurrentAudioPlayBackClip - m_vecClips.begin() == m_vecClips.size() - 1) { SetEmptiedAudio(); } else { (*m_itCurrentAudioPlayBackClip)->Superceed(SUPERCEEDED_AUDIO_RETURN); m_itCurrentAudioPlayBackClip++; ret=ReturnNextAudioPacket(); } } return ret; }
Packet* CClip::ReturnNextAudioPacket(REFERENCE_TIME playlistOffset) { CAutoLock vectorALock(&m_sectionVectorAudio); Packet* ret=NULL; if (!firstPacketReturned) { // CAutoLock lock (&m_sectionRead); firstPacketReturned=true; if (abs(earliestPacketAccepted - playlistFirstPacketTime - m_rtClipStartingOffset) > ONE_SECOND) { m_rtClipStartingOffset = earliestPacketAccepted - playlistFirstPacketTime; } return ReturnNextAudioPacket(playlistOffset); } if (noAudio) { ret=GenerateFakeAudio(audioPlaybackPosition); if (earliestPacketAccepted == INT64_MAX) earliestPacketAccepted = audioPlaybackPosition; } else { if (m_vecClipAudioPackets.size()>0) { ivecAudioBuffers it = m_vecClipAudioPackets.begin(); ret=*it; audioPlaybackPosition=ret->rtStart; it=m_vecClipAudioPackets.erase(it); } } if (ret && ret->rtStart!=Packet::INVALID_TIME) { if (firstAudio) { firstAudioPosition = ret->rtStart; ret->nNewSegment = NS_STREAM_RESET; ret->bDiscontinuity = clipInterrupted | bSeekTarget | clipReset; firstAudio = false; if (!clipReset) ret->nNewSegment |= NS_NEW_CLIP; if (clipInterrupted) ret->nNewSegment |= NS_INTERRUPTED; } ret->rtPlaylistTime = ret->rtStart - m_playlistOffset; ret->rtClipStartTime = ret->rtStart - earliestPacketAccepted; ret->rtStart += clipPlaylistOffset - earliestPacketAccepted; ret->rtStop += clipPlaylistOffset - earliestPacketAccepted; } // LogDebug("Clip: aud: return Packet rtStart: %I64d offset: %I64d seekRequired %d",ret->rtStart, ret->rtOffset,ret->bSeekRequired); return ret; }