void Audio_Stream::open() { if (m_httpStreamRunning) { AS_TRACE("%s: already running: return\n", __PRETTY_FUNCTION__); return; } if (m_needNewQueue && m_audioQueue) { m_needNewQueue = false; closeAudioQueue(); } m_contentLength = 0; m_seekTime = 0; m_processedPacketsSizeTotal = 0; m_processedPacketsCount = 0; m_bitrateBufferIndex = 0; if (m_httpStream->open()) { AS_TRACE("%s: HTTP stream opened, buffering...\n", __PRETTY_FUNCTION__); m_httpStreamRunning = true; setState(BUFFERING); } else { AS_TRACE("%s: failed to open the HTTP stream\n", __PRETTY_FUNCTION__); closeAndSignalError(AS_ERR_OPEN); } }
void Audio_Stream::close() { AS_TRACE("%s: enter\n", __PRETTY_FUNCTION__); if (m_watchdogTimer) { CFRunLoopTimerInvalidate(m_watchdogTimer); CFRelease(m_watchdogTimer), m_watchdogTimer = 0; } /* Close the HTTP stream first so that the audio stream parser isn't fed with more data to parse */ if (m_httpStreamRunning) { m_httpStream->close(); m_httpStreamRunning = false; } if (m_audioStreamParserRunning) { if (m_audioFileStream) { if (AudioFileStreamClose(m_audioFileStream) != 0) { AS_TRACE("%s: AudioFileStreamClose failed\n", __PRETTY_FUNCTION__); } m_audioFileStream = 0; } m_audioStreamParserRunning = false; } closeAudioQueue(); if (FAILED != state()) { /* * Set the stream state to stopped if the stream was stopped successfully. * We don't want to cause a spurious stopped state as the fail state should * be the final state in case the stream failed. */ setState(STOPPED); } /* * Free any remaining queud packets for encoding. */ queued_packet_t *cur = m_queuedHead; while (cur) { queued_packet_t *tmp = cur->next; free(cur); cur = tmp; } m_queuedHead = m_queuedTail = 0; AS_TRACE("%s: leave\n", __PRETTY_FUNCTION__); }
void Audio_Stream::close() { AS_TRACE("%s: enter\n", __PRETTY_FUNCTION__); /* Close the HTTP stream first so that the audio stream parser isn't fed with more data to parse */ if (m_httpStreamRunning) { m_httpStream->close(); m_httpStreamRunning = false; } if (m_audioStreamParserRunning) { if (m_audioFileStream) { if (AudioFileStreamClose(m_audioFileStream) != 0) { AS_TRACE("%s: AudioFileStreamClose failed\n", __PRETTY_FUNCTION__); } m_audioFileStream = 0; } m_audioStreamParserRunning = false; } closeAudioQueue(); setState(STOPPED); /* * Free any remaining queud packets for encoding. */ queued_packet_t *cur = m_queuedHead; while (cur) { queued_packet_t *tmp = cur->next; free(cur); cur = tmp; } m_queuedHead = m_queuedTail = 0; AS_TRACE("%s: leave\n", __PRETTY_FUNCTION__); }
void Audio_Stream::open() { if (m_httpStreamRunning) { AS_TRACE("%s: already running: return\n", __PRETTY_FUNCTION__); return; } if (m_needNewQueue && m_audioQueue) { m_needNewQueue = false; closeAudioQueue(); } m_contentLength = 0; m_seekTime = 0; m_bounceCount = 0; m_firstBufferingTime = 0; m_processedPacketsCount = 0; m_bitrateBufferIndex = 0; m_initializationError = noErr; if (m_watchdogTimer) { CFRunLoopTimerInvalidate(m_watchdogTimer); CFRelease(m_watchdogTimer), m_watchdogTimer = 0; } Stream_Configuration *config = Stream_Configuration::configuration(); if (m_contentType) { CFRelease(m_contentType), m_contentType = NULL; } if (m_httpStream->open()) { AS_TRACE("%s: HTTP stream opened, buffering...\n", __PRETTY_FUNCTION__); m_httpStreamRunning = true; setState(BUFFERING); if (config->startupWatchdogPeriod > 0) { /* * Start the WD if we have one requested. In this way we can track * that the stream doesn't stuck forever on the buffering state * (for instance some network error condition) */ CFRunLoopTimerContext ctx = {0, this, NULL, NULL, NULL}; m_watchdogTimer = CFRunLoopTimerCreate(NULL, CFAbsoluteTimeGetCurrent() + config->startupWatchdogPeriod, 0, 0, 0, watchdogTimerCallback, &ctx); AS_TRACE("Starting the startup watchdog, period %i seconds\n", config->startupWatchdogPeriod); CFRunLoopAddTimer(CFRunLoopGetCurrent(), m_watchdogTimer, kCFRunLoopCommonModes); } } else { AS_TRACE("%s: failed to open the HTTP stream\n", __PRETTY_FUNCTION__); closeAndSignalError(AS_ERR_OPEN); } }