unsigned Audio_Stream::timePlayedInSeconds() { if (m_audioStreamParserRunning) { return m_seekTime + audioQueue()->timePlayedInSeconds(); } return 0; }
void Audio_Stream::audioQueueBuffersEmpty() { AS_TRACE("%s: enter\n", __PRETTY_FUNCTION__); if (m_httpStreamRunning) { /* Still feeding the audio queue with data, don't stop yet */ return; } AS_TRACE("%s: closing the audio queue\n", __PRETTY_FUNCTION__); if (m_audioStreamParserRunning) { if (AudioFileStreamClose(m_audioFileStream) != 0) { AS_TRACE("%s: AudioFileStreamClose failed\n", __PRETTY_FUNCTION__); } m_audioStreamParserRunning = false; } // Keep the audio queue running until it has finished playing audioQueue()->stop(false); m_needNewQueue = true; AS_TRACE("%s: leave\n", __PRETTY_FUNCTION__); }
void Audio_Stream::audioQueueInitializationFailed() { if (m_httpStreamRunning) { m_httpStream->close(); m_httpStreamRunning = false; } setState(FAILED); if (m_delegate) { if (audioQueue()->m_lastError == kAudioFormatUnsupportedDataFormatError) { m_delegate->audioStreamErrorOccurred(AS_ERR_UNSUPPORTED_FORMAT); } else { m_delegate->audioStreamErrorOccurred(AS_ERR_STREAM_PARSE); } } }
void Audio_Stream::audioQueueBuffersEmpty() { AS_TRACE("%s: enter\n", __PRETTY_FUNCTION__); Stream_Configuration *config = Stream_Configuration::configuration(); if (m_httpStreamRunning && FAILED != state()) { /* Still feeding the audio queue with data, don't stop yet */ setState(BUFFERING); if (m_firstBufferingTime == 0) { // Never buffered, just increase the counter m_firstBufferingTime = CFAbsoluteTimeGetCurrent(); m_bounceCount++; AS_TRACE("stream buffered, increasing bounce count %zu, interval %i\n", m_bounceCount, config->bounceInterval); } else { // Buffered before, calculate the difference CFAbsoluteTime cur = CFAbsoluteTimeGetCurrent(); int diff = cur - m_firstBufferingTime; if (diff >= config->bounceInterval) { // More than bounceInterval seconds passed from the last // buffering. So not a continuous bouncing. Reset the // counters. m_bounceCount = 0; m_firstBufferingTime = 0; AS_TRACE("%i seconds passed from last buffering, resetting counters, interval %i\n", diff, config->bounceInterval); } else { m_bounceCount++; AS_TRACE("%i seconds passed from last buffering, increasing bounce count to %zu, interval %i\n", diff, m_bounceCount, config->bounceInterval); } } // Check if we have reached the bounce state if (m_bounceCount >= config->maxBounceCount) { closeAndSignalError(AS_ERR_BOUNCING); } return; } AS_TRACE("%s: closing the audio queue\n", __PRETTY_FUNCTION__); if (m_audioStreamParserRunning) { if (AudioFileStreamClose(m_audioFileStream) != 0) { AS_TRACE("%s: AudioFileStreamClose failed\n", __PRETTY_FUNCTION__); } m_audioStreamParserRunning = false; } // Keep the audio queue running until it has finished playing audioQueue()->stop(false); m_needNewQueue = true; AS_TRACE("%s: leave\n", __PRETTY_FUNCTION__); }
void Audio_Stream::pause() { audioQueue()->pause(); }