if (delay < 0)
delay = 0.0;
- delay += stream->m_bufferedTime;
+ delay += stream->m_bufferedTime / stream->m_streamResampleRatio;
return delay;
}
float CEngineStats::GetWaterLevel()
{
+ CSingleLock lock(m_lock);
return (float)m_bufferedSamples / m_sinkSampleRate;
}
// resample buffers for sink
if (m_sinkBuffers &&
- (!CompareFormat(m_sinkBuffers->m_format,m_sinkFormat) || !CompareFormat(m_sinkBuffers->m_inputFormat, sinkInputFormat)))
+ (!CompareFormat(m_sinkBuffers->m_format,m_sinkFormat) ||
+ !CompareFormat(m_sinkBuffers->m_inputFormat, sinkInputFormat) ||
+ m_sinkBuffers->m_format.m_frames != m_sinkFormat.m_frames))
{
m_discardBufferPools.push_back(m_sinkBuffers);
m_sinkBuffers = NULL;
}
}
}
+ }
- // serve sink buffers
- busy = m_sinkBuffers->ResampleBuffers();
- while(!m_sinkBuffers->m_outputSamples.empty())
- {
- CSampleBuffer *out = NULL;
- out = m_sinkBuffers->m_outputSamples.front();
- m_sinkBuffers->m_outputSamples.pop_front();
- m_sink.m_dataPort.SendOutMessage(CSinkDataProtocol::SAMPLE,
- &out, sizeof(CSampleBuffer*));
- busy = true;
- }
+ // serve sink buffers
+ busy |= m_sinkBuffers->ResampleBuffers();
+ while(!m_sinkBuffers->m_outputSamples.empty())
+ {
+ CSampleBuffer *out = NULL;
+ out = m_sinkBuffers->m_outputSamples.front();
+ m_sinkBuffers->m_outputSamples.pop_front();
+ m_sink.m_dataPort.SendOutMessage(CSinkDataProtocol::SAMPLE,
+ &out, sizeof(CSampleBuffer*));
+ busy = true;
}
return busy;
IAEStream *CActiveAE::MakeStream(enum AEDataFormat dataFormat, unsigned int sampleRate, unsigned int encodedSampleRate, CAEChannelInfo channelLayout, unsigned int options)
{
+ if (IsSuspended())
+ return NULL;
+
//TODO: pass number of samples in audio packet
AEAudioFormat format;