X-Git-Url: http://code.vuplus.com/gitweb/?a=blobdiff_plain;f=xbmc%2Fcores%2FAudioEngine%2FEngines%2FActiveAE%2FActiveAE.cpp;h=eae62530dd815d94ead2345ad0f80ca6d8cfa2df;hb=35b5f279740b89321e8be3a6d80ef10eeed5748e;hp=8ac14d3e986b521be4a7fe6ce81d1c0d4ef92f07;hpb=33f178cd89caa06b0a5df3dba76e765e580b5593;p=vuplus_xbmc diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp index 8ac14d3..eae6253 100644 --- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp @@ -102,7 +102,7 @@ float CEngineStats::GetDelay(CActiveAEStream *stream) if (delay < 0) delay = 0.0; - delay += stream->m_bufferedTime; + delay += stream->m_bufferedTime / stream->m_streamResampleRatio; return delay; } @@ -122,6 +122,7 @@ float CEngineStats::GetCacheTotal(CActiveAEStream *stream) float CEngineStats::GetWaterLevel() { + CSingleLock lock(m_lock); return (float)m_bufferedSamples / m_sinkSampleRate; } @@ -149,6 +150,7 @@ CActiveAE::CActiveAE() : m_vizBuffers = NULL; m_vizBuffersInput = NULL; m_volume = 1.0; + m_volumeScaled = 1.0; m_aeVolume = 1.0; m_muted = false; m_aeMuted = false; @@ -166,7 +168,7 @@ CActiveAE::~CActiveAE() void CActiveAE::Dispose() { -#if defined(HAS_GLX) || defined(TARGET_DARWIN_OSX) +#if defined(HAS_GLX) || defined(TARGET_DARWIN) g_Windowing.Unregister(this); #endif @@ -225,6 +227,7 @@ void CActiveAE::StateMachine(int signal, Protocol *port, Message *msg) return; case CActiveAEControlProtocol::VOLUME: m_volume = *(float*)msg->data; + m_volumeScaled = CAEUtil::GainToScale(CAEUtil::PercentToGain(m_volume)); if (m_sinkHasVolume) m_sink.m_controlPort.SendOutMessage(CSinkControlProtocol::VOLUME, &m_volume, sizeof(float)); return; @@ -433,6 +436,7 @@ void CActiveAE::StateMachine(int signal, Protocol *port, Message *msg) case CActiveAEControlProtocol::DEVICECHANGE: time_t now; time(&now); + CLog::Log(LOGDEBUG,"CActiveAE - device change event"); while (!m_extLastDeviceChange.empty() && (now - m_extLastDeviceChange.front() > 0)) { m_extLastDeviceChange.pop(); @@ -444,6 +448,7 @@ void CActiveAE::StateMachine(int signal, Protocol *port, Message *msg) } m_extLastDeviceChange.push(now); UnconfigureSink(); + m_controlPort.PurgeOut(CActiveAEControlProtocol::DEVICECHANGE); m_sink.EnumerateSinkList(true); LoadSettings(); m_extError = false; @@ -458,7 +463,6 @@ void CActiveAE::StateMachine(int signal, Protocol *port, Message *msg) m_state = AE_TOP_ERROR; m_extTimeout = 500; } - m_controlPort.PurgeOut(CActiveAEControlProtocol::DEVICECHANGE); return; case CActiveAEControlProtocol::PAUSESTREAM: CActiveAEStream *stream; @@ -632,11 +636,13 @@ void CActiveAE::StateMachine(int signal, Protocol *port, Message *msg) switch (signal) { case CActiveAEControlProtocol::DISPLAYRESET: + CLog::Log(LOGDEBUG,"CActiveAE - display reset event"); displayReset = true; case CActiveAEControlProtocol::INIT: m_extError = false; if (!displayReset) { + m_controlPort.PurgeOut(CActiveAEControlProtocol::DEVICECHANGE); m_sink.EnumerateSinkList(true); LoadSettings(); } @@ -656,6 +662,8 @@ void CActiveAE::StateMachine(int signal, Protocol *port, Message *msg) m_stats.SetSuspended(false); m_extDeferData = false; return; + case CActiveAEControlProtocol::DEVICECHANGE: + return; default: break; } @@ -1025,6 +1033,7 @@ void CActiveAE::Configure(AEAudioFormat *desiredFmt) outputFormat = inputFormat; outputFormat.m_dataFormat = AE_FMT_FLOATP; outputFormat.m_sampleRate = 48000; + outputFormat.m_encodedRate = 48000; // setup encoder if (!m_encoder) @@ -1161,7 +1170,9 @@ void CActiveAE::Configure(AEAudioFormat *desiredFmt) // 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; @@ -1410,6 +1421,7 @@ void CActiveAE::ApplySettingsToFormat(AEAudioFormat &format, AudioSettings &sett { format.m_dataFormat = AE_FMT_AC3; format.m_sampleRate = 48000; + format.m_encodedRate = 48000; format.m_channelLayout = AE_CH_LAYOUT_2_0; if (mode) *mode = MODE_TRANSCODE; @@ -1634,13 +1646,15 @@ bool CActiveAE::RunStages() CSampleBuffer *buffer; if (!(*it)->m_drain) { - while (time < MAX_CACHE_LEVEL && !(*it)->m_inputBuffers->m_freeSamples.empty()) + float buftime = (float)(*it)->m_inputBuffers->m_format.m_frames / (*it)->m_inputBuffers->m_format.m_sampleRate; + time += buftime * (*it)->m_processingSamples.size(); + while ((time < MAX_CACHE_LEVEL || (*it)->m_streamIsBuffering) && !(*it)->m_inputBuffers->m_freeSamples.empty()) { buffer = (*it)->m_inputBuffers->GetFreeBuffer(); (*it)->m_processingSamples.push_back(buffer); (*it)->m_streamPort->SendInMessage(CActiveAEDataProtocol::STREAMBUFFER, &buffer, sizeof(CSampleBuffer*)); (*it)->IncFreeBuffers(); - time += (float)buffer->pkt->max_nb_samples / buffer->pkt->config.sample_rate; + time += buftime; } } else @@ -1733,7 +1747,14 @@ bool CActiveAE::RunStages() if ((*it)->m_fadingSamples == -1) { (*it)->m_fadingSamples = m_internalFormat.m_sampleRate * (float)(*it)->m_fadingTime / 1000.0f; - (*it)->m_volume = (*it)->m_fadingBase; + if ((*it)->m_fadingSamples > 0) + (*it)->m_volume = (*it)->m_fadingBase; + else + { + (*it)->m_volume = (*it)->m_fadingTarget; + CSingleLock lock((*it)->m_streamLock); + (*it)->m_streamFading = false; + } } if ((*it)->m_fadingSamples > 0) { @@ -1963,7 +1984,7 @@ bool CActiveAE::RunStages() CSampleBuffer *buffer; for (it = m_streams.begin(); it != m_streams.end(); ++it) { - if (!(*it)->m_resampleBuffers->m_outputSamples.empty()) + if (!(*it)->m_resampleBuffers->m_outputSamples.empty() && !(*it)->m_paused) { buffer = (*it)->m_resampleBuffers->m_outputSamples.front(); (*it)->m_resampleBuffers->m_outputSamples.pop_front(); @@ -1972,18 +1993,18 @@ bool CActiveAE::RunStages() } } } + } - // 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; @@ -2062,11 +2083,11 @@ void CActiveAE::MixSounds(CSoundPacket &dstSample) void CActiveAE::Deamplify(CSoundPacket &dstSample) { - if (m_volume < 1.0 || m_muted) + if (m_volumeScaled < 1.0 || m_muted) { float *buffer; int nb_floats = dstSample.nb_samples * dstSample.config.channels / dstSample.planes; - float volume = m_muted ? 0.0f : m_volume; + float volume = m_muted ? 0.0f : m_volumeScaled; for(int j=0; j