blob: 69d789c518a5897bb701d0f7be0d2e8c5136faf0 [file] [log] [blame]
// Copyright 2018 The Cobalt Authors. 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.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License 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 COBALT_MEDIA_STREAM_MEDIA_STREAM_AUDIO_SOURCE_H_
#define COBALT_MEDIA_STREAM_MEDIA_STREAM_AUDIO_SOURCE_H_
#include "base/callback.h"
#include "base/gtest_prod_util.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "cobalt/media_stream/audio_parameters.h"
#include "cobalt/media_stream/media_stream_audio_deliverer.h"
#include "cobalt/media_stream/media_stream_audio_track.h"
#include "cobalt/media_stream/media_stream_source.h"
#include "cobalt/media_stream/media_track_settings.h"
namespace cobalt {
namespace media_stream {
// Base class that provides functionality to connect tracks
// and have audio data delivered to them.
// Subclasses should:
// implement |EnsureSourceIsStarted()| and |EnsureSourceIsStopped()|
// call |SetFormat()| and |DeliverDataToTracks()|
class MediaStreamAudioSource : public MediaStreamSource {
public:
MediaStreamAudioSource();
~MediaStreamAudioSource() override;
// Connects this source to the track. One source can be connected to multiple
// tracks. Returns true if successful.
bool ConnectToTrack(MediaStreamAudioTrack* track);
MediaTrackSettings GetMediaTrackSettings() const;
protected:
// Subclasses should override these Ensure* methods.
// Returns true if the source has been successfully started.
// After the source has been started, subclasses should call
// |DeliverDataToTracks| to deliver the data.
virtual bool EnsureSourceIsStarted() = 0;
// Stops the source. |DeliverDataToTracks| must not be called after
// the source is stopped.
virtual void EnsureSourceIsStopped() = 0;
// Subclasses should call these methods. |DeliverDataToTracks| can be
// called from a different thread than where MediaStreamAudioSource
// was created.
void DeliverDataToTracks(const MediaStreamAudioTrack::AudioBus& audio_bus,
base::TimeTicks reference_time);
void SetFormat(const media_stream::AudioParameters& params) {
DLOG(INFO) << "MediaStreamAudioSource@" << this << "::SetFormat("
<< params.AsHumanReadableString() << "), was previously set to {"
<< deliverer_.GetAudioParameters().AsHumanReadableString()
<< "}.";
deliverer_.OnSetFormat(params);
}
protected:
void NotifyTracksOfNewReadyState(
MediaStreamAudioTrack::ReadyState new_ready_state);
private:
MediaStreamAudioSource(const MediaStreamAudioSource&) = delete;
MediaStreamAudioSource& operator=(const MediaStreamAudioSource&) = delete;
void DoStopSource() final;
void StopAudioDeliveryTo(MediaStreamAudioTrack* track);
THREAD_CHECKER(thread_checker_);
base::Closure stop_callback_;
base::WeakPtrFactory<MediaStreamAudioSource> weak_ptr_factory_;
base::WeakPtr<MediaStreamAudioSource> weak_this_;
MediaStreamAudioDeliverer<MediaStreamAudioTrack> deliverer_;
bool is_stopped_ = false;
FRIEND_TEST_ALL_PREFIXES(MediaStreamAudioSourceTest, DeliverData);
};
} // namespace media_stream
} // namespace cobalt
#endif // COBALT_MEDIA_STREAM_MEDIA_STREAM_AUDIO_SOURCE_H_