Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1492)

Side by Side Diff: components/copresence/handlers/audio/audio_directive_handler.cc

Issue 419073002: Add the copresence DirectiveHandler. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: review comments Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/copresence/handlers/audio/audio_directive_handler.h"
6
7 #include "base/bind.h"
8 #include "base/logging.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/time/time.h"
11 #include "components/copresence/mediums/audio/audio_player.h"
12 #include "components/copresence/mediums/audio/audio_recorder.h"
13 #include "components/copresence/proto/data.pb.h"
14 #include "media/base/audio_bus.h"
15
16 namespace copresence {
17
18 // Public methods.
19
20 AudioDirectiveHandler::AudioDirectiveHandler(
21 const AudioRecorder::DecodeSamplesCallback& decode_cb,
22 const AudioDirectiveList::EncodeTokenCallback& encode_cb)
23 : directive_list_(encode_cb,
24 base::Bind(&AudioDirectiveHandler::ExecuteNextTransmit,
25 base::Unretained(this))),
26 player_(new AudioPlayer()),
27 recorder_(new AudioRecorder(decode_cb)) {
28 }
29
30 AudioDirectiveHandler::~AudioDirectiveHandler() {
31 if (player_)
32 player_->Finalize();
33 if (recorder_)
34 recorder_->Finalize();
35 }
36
37 void AudioDirectiveHandler::AddInstruction(const TokenInstruction& instruction,
38 base::TimeDelta ttl) {
39 switch (instruction.token_instruction_type()) {
40 case TRANSMIT:
41 DVLOG(2) << "Audio Transmit Directive received. Token: "
42 << instruction.token_id()
43 << " with TTL=" << ttl.InMilliseconds();
44 // TODO(rkc): Fill in the op_id once we get it from the directive.
45 directive_list_.AddTransmitDirective(
46 instruction.token_id(), std::string(), ttl);
47 break;
48 case RECEIVE:
49 DVLOG(2) << "Audio Receive Directive received. TTL="
50 << ttl.InMilliseconds();
51 // TODO(rkc): Fill in the op_id once we get it from the directive.
52 directive_list_.AddReceiveDirective(std::string(), ttl);
53 break;
54 case UNKNOWN_TOKEN_INSTRUCTION_TYPE:
55 default:
56 LOG(WARNING) << "Unknown Audio Transmit Directive received.";
57 }
58 // ExecuteNextTransmit will be called by directive_list_ when Add is done.
59 ExecuteNextReceive();
60 }
61
62 // Protected methods.
63
64 AudioDirectiveHandler::AudioDirectiveHandler(
65 const AudioDirectiveList::EncodeTokenCallback& encode_cb)
66 : directive_list_(encode_cb,
67 base::Bind(&AudioDirectiveHandler::ExecuteNextTransmit,
68 base::Unretained(this))),
69 player_(NULL),
70 recorder_(NULL) {
71 }
72
73 void AudioDirectiveHandler::PlayAudio(
74 const scoped_refptr<media::AudioBusRefCounted>& samples,
75 base::TimeDelta duration) {
76 player_->Play(samples);
77 stop_playback_timer_.Start(
78 FROM_HERE, duration, this, &AudioDirectiveHandler::StopPlayback);
79 }
80
81 void AudioDirectiveHandler::RecordAudio(base::TimeDelta duration) {
82 recorder_->Record();
83 stop_recording_timer_.Start(
84 FROM_HERE, duration, this, &AudioDirectiveHandler::StopRecording);
85 }
86
87 // Private methods.
88
89 void AudioDirectiveHandler::StopPlayback() {
90 player_->Stop();
91 DVLOG(2) << "Done playing audio.";
92 ExecuteNextTransmit();
93 }
94
95 void AudioDirectiveHandler::StopRecording() {
96 recorder_->Stop();
97 DVLOG(2) << "Done recording audio.";
98 ExecuteNextReceive();
99 }
100
101 void AudioDirectiveHandler::ExecuteNextTransmit() {
102 scoped_ptr<AudioDirective> transmit(directive_list_.GetNextTransmit());
103 if (transmit)
104 PlayAudio(transmit->samples, transmit->end_time - base::Time::Now());
105 }
106
107 void AudioDirectiveHandler::ExecuteNextReceive() {
108 scoped_ptr<AudioDirective> receive(directive_list_.GetNextReceive());
109 if (receive)
110 RecordAudio(receive->end_time - base::Time::Now());
111 }
112
113 } // namespace copresence
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698