blob: dc806662cd555d7b20979fb5dbd75986dc5fe6da [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "remoting/ios/audio/audio_stream_consumer_proxy.h"
#include <utility>
#include "base/bind.h"
#include "base/callback_helpers.h"
#include "base/location.h"
#include "base/logging.h"
#include "base/macros.h"
#include "base/single_thread_task_runner.h"
namespace remoting {
// Runs an instance of |HostWindow| on the |audio_task_runner_| thread.
class AudioStreamConsumerProxy::Core {
public:
Core(base::WeakPtr<AudioStreamConsumer> audio_stream_consumer);
~Core();
void AddAudioPacket(std::unique_ptr<AudioPacket> packet);
base::WeakPtr<AudioStreamConsumer> AudioStreamConsumerAsWeakPtr();
base::WeakPtr<Core> GetWeakPtr();
private:
// The wrapped |AudioStreamConsumer| instance running on the
// |audio_task_runner_| thread.
base::WeakPtr<AudioStreamConsumer> audio_stream_consumer_;
base::WeakPtrFactory<Core> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(Core);
};
std::unique_ptr<AudioStreamConsumerProxy> AudioStreamConsumerProxy::Create(
scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner,
base::WeakPtr<AudioStreamConsumer> audio_stream_consumer) {
std::unique_ptr<Core> core(new Core(std::move(audio_stream_consumer)));
std::unique_ptr<AudioStreamConsumerProxy> result(
new AudioStreamConsumerProxy(audio_task_runner, std::move(core)));
return result;
}
AudioStreamConsumerProxy::AudioStreamConsumerProxy(
scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner,
std::unique_ptr<Core> core)
: audio_task_runner_(audio_task_runner),
core_(std::move(core)),
weak_factory_(this) {}
AudioStreamConsumerProxy::~AudioStreamConsumerProxy() {
audio_task_runner_->DeleteSoon(FROM_HERE, core_.release());
}
void AudioStreamConsumerProxy::AddAudioPacket(
std::unique_ptr<AudioPacket> packet) {
audio_task_runner_->PostTask(
FROM_HERE, base::Bind(&Core::AddAudioPacket, core_->GetWeakPtr(),
base::Passed(&packet)));
}
base::WeakPtr<AudioStreamConsumer>
AudioStreamConsumerProxy::AudioStreamConsumerAsWeakPtr() {
return weak_factory_.GetWeakPtr();
}
AudioStreamConsumerProxy::Core::Core(
base::WeakPtr<AudioStreamConsumer> audio_stream_consumer)
: audio_stream_consumer_(audio_stream_consumer), weak_factory_(this) {}
AudioStreamConsumerProxy::Core::~Core() {}
void AudioStreamConsumerProxy::Core::AddAudioPacket(
std::unique_ptr<AudioPacket> packet) {
if (audio_stream_consumer_) {
audio_stream_consumer_->AddAudioPacket(std::move(packet));
}
}
base::WeakPtr<AudioStreamConsumerProxy::Core>
AudioStreamConsumerProxy::Core::GetWeakPtr() {
return weak_factory_.GetWeakPtr();
}
} // namespace remoting