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

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

Issue 453793002: Add audible support to the copresence API. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: 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
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/copresence/handlers/audio/audio_directive_handler.h" 5 #include "components/copresence/handlers/audio/audio_directive_handler.h"
6 6
7 #include <algorithm>
8
7 #include "base/bind.h" 9 #include "base/bind.h"
8 #include "base/logging.h" 10 #include "base/logging.h"
9 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
10 #include "base/time/time.h" 12 #include "base/time/time.h"
11 #include "components/copresence/mediums/audio/audio_player.h" 13 #include "components/copresence/mediums/audio/audio_player.h"
12 #include "components/copresence/mediums/audio/audio_recorder.h" 14 #include "components/copresence/mediums/audio/audio_recorder.h"
13 #include "components/copresence/proto/data.pb.h" 15 #include "components/copresence/proto/data.pb.h"
14 #include "media/base/audio_bus.h" 16 #include "media/base/audio_bus.h"
15 17
16 namespace copresence { 18 namespace copresence {
17 19
18 // Public methods. 20 // Public methods.
19 21
20 AudioDirectiveHandler::AudioDirectiveHandler( 22 AudioDirectiveHandler::AudioDirectiveHandler(
21 const AudioRecorder::DecodeSamplesCallback& decode_cb, 23 const AudioRecorder::DecodeSamplesCallback& decode_cb,
22 const AudioDirectiveList::EncodeTokenCallback& encode_cb) 24 const AudioDirectiveList::EncodeTokenCallback& encode_cb)
23 : directive_list_(encode_cb, 25 : directive_list_inaudible_(
24 base::Bind(&AudioDirectiveHandler::ExecuteNextTransmit, 26 encode_cb,
25 base::Unretained(this))), 27 base::Bind(&AudioDirectiveHandler::ExecuteNextTransmit,
28 base::Unretained(this)),
29 false),
30 directive_list_audible_(
31 encode_cb,
32 base::Bind(&AudioDirectiveHandler::ExecuteNextTransmit,
33 base::Unretained(this)),
34 true),
26 player_(NULL), 35 player_(NULL),
27 recorder_(NULL), 36 recorder_(NULL),
28 decode_cb_(decode_cb) { 37 decode_cb_(decode_cb) {
29 } 38 }
30 39
31 AudioDirectiveHandler::~AudioDirectiveHandler() { 40 AudioDirectiveHandler::~AudioDirectiveHandler() {
32 if (player_) 41 if (player_)
33 player_->Finalize(); 42 player_->Finalize();
34 if (recorder_) 43 if (recorder_)
35 recorder_->Finalize(); 44 recorder_->Finalize();
36 } 45 }
37 46
38 void AudioDirectiveHandler::Initialize() { 47 void AudioDirectiveHandler::Initialize() {
39 player_ = new AudioPlayer(); 48 player_ = new AudioPlayer();
40 player_->Initialize(); 49 player_->Initialize();
41 50
42 recorder_ = new AudioRecorder(decode_cb_); 51 recorder_ = new AudioRecorder(decode_cb_);
43 recorder_->Initialize(); 52 recorder_->Initialize();
44 } 53 }
45 54
46 void AudioDirectiveHandler::AddInstruction(const TokenInstruction& instruction, 55 void AudioDirectiveHandler::AddInstruction(const TokenInstruction& instruction,
47 base::TimeDelta ttl) { 56 base::TimeDelta ttl) {
48 switch (instruction.token_instruction_type()) { 57 switch (instruction.token_instruction_type()) {
49 case TRANSMIT: 58 case TRANSMIT:
50 DVLOG(2) << "Audio Transmit Directive received. Token: " 59 DVLOG(2) << "Audio Transmit Directive received. Token: "
51 << instruction.token_id() 60 << instruction.token_id()
52 << " with TTL=" << ttl.InMilliseconds(); 61 << " with TTL=" << ttl.InMilliseconds();
53 // TODO(rkc): Fill in the op_id once we get it from the directive. 62 // TODO(rkc): Fill in the op_id once we get it from the directive.
54 directive_list_.AddTransmitDirective( 63 switch (instruction.medium()) {
55 instruction.token_id(), std::string(), ttl); 64 case AUDIO_ULTRASOUND_PASSBAND:
65 directive_list_inaudible_.AddTransmitDirective(
66 instruction.token_id(), std::string(), ttl);
67 break;
68 case AUDIO_AUDIBLE_DTMF:
69 directive_list_audible_.AddTransmitDirective(
70 instruction.token_id(), std::string(), ttl);
71 break;
72 default:
73 NOTREACHED();
74 }
56 break; 75 break;
57 case RECEIVE: 76 case RECEIVE:
58 DVLOG(2) << "Audio Receive Directive received. TTL=" 77 DVLOG(2) << "Audio Receive Directive received. TTL="
59 << ttl.InMilliseconds(); 78 << ttl.InMilliseconds();
60 // TODO(rkc): Fill in the op_id once we get it from the directive. 79 // TODO(rkc): Fill in the op_id once we get it from the directive.
61 directive_list_.AddReceiveDirective(std::string(), ttl); 80 switch (instruction.medium()) {
81 case AUDIO_ULTRASOUND_PASSBAND:
82 directive_list_inaudible_.AddReceiveDirective(std::string(), ttl);
83 break;
84 case AUDIO_AUDIBLE_DTMF:
85 directive_list_audible_.AddReceiveDirective(std::string(), ttl);
86 break;
87 default:
88 NOTREACHED();
89 }
62 break; 90 break;
63 case UNKNOWN_TOKEN_INSTRUCTION_TYPE: 91 case UNKNOWN_TOKEN_INSTRUCTION_TYPE:
64 default: 92 default:
65 LOG(WARNING) << "Unknown Audio Transmit Directive received."; 93 LOG(WARNING) << "Unknown Audio Transmit Directive received.";
66 } 94 }
67 // ExecuteNextTransmit will be called by directive_list_ when Add is done. 95 // ExecuteNextTransmit will be called by directive_list_ when Add is done.
68 ExecuteNextReceive(); 96 ExecuteNextReceive();
69 } 97 }
70 98
71 // Protected methods. 99 // Protected methods.
(...skipping 20 matching lines...) Expand all
92 ExecuteNextTransmit(); 120 ExecuteNextTransmit();
93 } 121 }
94 122
95 void AudioDirectiveHandler::StopRecording() { 123 void AudioDirectiveHandler::StopRecording() {
96 recorder_->Stop(); 124 recorder_->Stop();
97 DVLOG(2) << "Done recording audio."; 125 DVLOG(2) << "Done recording audio.";
98 ExecuteNextReceive(); 126 ExecuteNextReceive();
99 } 127 }
100 128
101 void AudioDirectiveHandler::ExecuteNextTransmit() { 129 void AudioDirectiveHandler::ExecuteNextTransmit() {
102 scoped_ptr<AudioDirective> transmit(directive_list_.GetNextTransmit()); 130 scoped_ptr<AudioDirective> audible_transmit(
103 if (transmit) 131 directive_list_audible_.GetNextTransmit());
104 PlayAudio(transmit->samples, transmit->end_time - base::Time::Now()); 132 scoped_ptr<AudioDirective> inaudible_transmit(
133 directive_list_inaudible_.GetNextTransmit());
134
135 if (inaudible_transmit) {
136 PlayAudio(inaudible_transmit->samples,
137 inaudible_transmit->end_time - base::Time::Now());
138 }
139 if (audible_transmit) {
140 PlayAudio(audible_transmit->samples,
141 audible_transmit->end_time - base::Time::Now());
142 }
105 } 143 }
106 144
107 void AudioDirectiveHandler::ExecuteNextReceive() { 145 void AudioDirectiveHandler::ExecuteNextReceive() {
108 scoped_ptr<AudioDirective> receive(directive_list_.GetNextReceive()); 146 scoped_ptr<AudioDirective> audible_receive(
109 if (receive) 147 directive_list_audible_.GetNextReceive());
110 RecordAudio(receive->end_time - base::Time::Now()); 148 scoped_ptr<AudioDirective> inaudible_receive(
149 directive_list_inaudible_.GetNextReceive());
150
151 base::TimeDelta record_duration;
152 if (inaudible_receive)
153 record_duration = inaudible_receive->end_time - base::Time::Now();
154 if (audible_receive) {
155 record_duration = std::max(record_duration,
156 audible_receive->end_time - base::Time::Now());
157 }
158
159 if (record_duration > base::TimeDelta::FromSeconds(0))
160 RecordAudio(record_duration);
111 } 161 }
112 162
113 } // namespace copresence 163 } // namespace copresence
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698