avs-device-sdk/MediaPlayer/include/MediaPlayer/UrlSource.h

128 lines
4.4 KiB
C++

/*
* UrlSource.h
*
* Copyright 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0/
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
#ifndef ALEXA_CLIENT_SDK_MEDIA_PLAYER_INCLUDE_MEDIA_PLAYER_URL_SOURCE_H_
#define ALEXA_CLIENT_SDK_MEDIA_PLAYER_INCLUDE_MEDIA_PLAYER_URL_SOURCE_H_
#include <future>
#include <memory>
#include <mutex>
#include <queue>
#include <gst/gst.h>
#include <AVSCommon/Utils/MediaPlayer/MediaPlayerInterface.h>
#include <AVSCommon/Utils/PlaylistParser/PlaylistParserInterface.h>
#include <AVSCommon/Utils/PlaylistParser/PlaylistParserObserverInterface.h>
#include "MediaPlayer/SourceInterface.h"
namespace alexaClientSDK {
namespace mediaPlayer {
class UrlSource
: public SourceInterface
, public avsCommon::utils::playlistParser::PlaylistParserObserverInterface
, public std::enable_shared_from_this<UrlSource> {
public:
/**
* Creates an instance of the @c UrlSource and installs the source within the GStreamer pipeline.
*
* @param pipeline The @c PipelineInterface through which the source of the @c AudioPipeline may be set.
* @param playlistParser The @c PlaylistParserInterface which will parse playlist urls.
* @param url The url from which to create the pipeline source from.
*
* @return An instance of the @c UrlSource if successful else a @c nullptr.
*/
static std::shared_ptr<UrlSource> create(
PipelineInterface* pipeline,
std::shared_ptr<avsCommon::utils::playlistParser::PlaylistParserInterface> playlistParser,
const std::string& url);
void onPlaylistEntryParsed(
int requestId,
std::string url,
avsCommon::utils::playlistParser::PlaylistParseResult parseResult) override;
bool hasAdditionalData() override;
bool handleEndOfStream() override;
/**
* @note This function will block until the @c onPlaylistParsed callback.
* To avoid deadlock, callers must ensure that @c preprocess is not called on the same thread
* as the event loop handling @c onPlaylistParsed.
*/
void preprocess() override;
/// @name Overridden StreamSourceInterface methods.
/// @{
bool isPlaybackRemote() const override;
void terminate() override;
/// @}
private:
/**
* Constructor.
*
* @param pipeline The @c PipelineInterface through which the source of the @c AudioPipeline may be set.
* @param playlistParser The @c PlaylistParserInterface which will parse playlist urls.
* @param url The @c url from which to create the pipeline source from.
*/
UrlSource(
PipelineInterface* pipeline,
std::shared_ptr<avsCommon::utils::playlistParser::PlaylistParserInterface> playlistParser,
const std::string& url);
/**
* Initializes the UrlSource by doing the following:
*
* -# Attempt to parse the url as a playlist.
* -# Initialize internal url queue.
* -# Create the source element for the audio pipeline.
* -# Add the source element to the audio pipeline @c m_pipeline.
*/
bool init();
/// A lock to serialize access to m_audioUrlQueue and m_url.
std::mutex m_mutex;
/// The url to read audioData from.
std::string m_url;
/// A queue of parsed audio urls. This should not contain any playlist urls.
std::queue<std::string> m_audioUrlQueue;
/// A Playlist Parser.
std::shared_ptr<avsCommon::utils::playlistParser::PlaylistParserInterface> m_playlistParser;
/// Indicates if the initial callback has been received from the playlist parser.
bool m_hasReceivedAPlaylistCallback;
/// Promise to notify when at least one url has been returned from playlist parsing.
std::promise<void> m_playlistParsedPromise;
bool m_isValid;
/// The @c PipelineInterface through which the source of the @c AudioPipeline may be set.
PipelineInterface* m_pipeline;
};
} // namespace mediaPlayer
} // namespace alexaClientSDK
#endif // ALEXA_CLIENT_SDK_MEDIA_PLAYER_INCLUDE_MEDIA_PLAYER_URL_SOURCE_H_