Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
|
Charlie
2014/08/08 22:24:14
Instead of all this wordy, duplicate code, why not
rkc
2014/08/09 06:58:54
Two audio streams would record the exact same samp
| |
| 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 Loading... | |
| 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 |
| OLD | NEW |