Index: components/copresence/handlers/audio/audio_directive_handler.h |
diff --git a/components/copresence/handlers/audio/audio_directive_handler.h b/components/copresence/handlers/audio/audio_directive_handler.h |
index 19eae85e5520319040365e61d1fb80d2073bd54d..feff3378962f09724b35e11e04d74b0c4c30671e 100644 |
--- a/components/copresence/handlers/audio/audio_directive_handler.h |
+++ b/components/copresence/handlers/audio/audio_directive_handler.h |
@@ -2,10 +2,10 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#ifndef COMPONENTS_COPRESENCE_HANDLERS_AUDIO_AUDIO_DIRECTIVE_HANDLER_ |
-#define COMPONENTS_COPRESENCE_HANDLERS_AUDIO_AUDIO_DIRECTIVE_HANDLER_ |
+#ifndef COMPONENTS_COPRESENCE_HANDLERS_AUDIO_AUDIO_DIRECTIVE_HANDLER_H_ |
+#define COMPONENTS_COPRESENCE_HANDLERS_AUDIO_AUDIO_DIRECTIVE_HANDLER_H_ |
-#include <vector> |
+#include <string> |
#include "base/basictypes.h" |
#include "base/macros.h" |
@@ -15,6 +15,7 @@ |
#include "components/copresence/handlers/audio/audio_directive_list.h" |
#include "components/copresence/mediums/audio/audio_recorder.h" |
#include "components/copresence/proto/data.pb.h" |
+#include "components/copresence/timed_map.h" |
namespace media { |
class AudioBusRefCounted; |
@@ -25,11 +26,24 @@ namespace copresence { |
class AudioPlayer; |
// The AudioDirectiveHandler handles audio transmit and receive instructions. |
+// TODO(rkc): Currently since WhispernetClient can only have one token encoded |
+// callback at a time, we need to have both the audible and inaudible in this |
+// class. Investigate a better way to do this; a few options are abstracting |
+// out token encoding to a separate class, or allowing whispernet to have |
+// multiple callbacks for encoded tokens being sent back and have two versions |
+// of this class. |
class AudioDirectiveHandler { |
public: |
+ typedef base::Callback<void(const std::string&, |
+ bool, |
+ const scoped_refptr<media::AudioBusRefCounted>&)> |
+ SamplesCallback; |
+ typedef base::Callback<void(const std::string&, bool, const SamplesCallback&)> |
+ EncodeTokenCallback; |
+ |
AudioDirectiveHandler( |
const AudioRecorder::DecodeSamplesCallback& decode_cb, |
- const AudioDirectiveList::EncodeTokenCallback& encode_cb); |
+ const AudioDirectiveHandler::EncodeTokenCallback& encode_cb); |
virtual ~AudioDirectiveHandler(); |
// Do not use this class before calling this. |
@@ -38,40 +52,82 @@ class AudioDirectiveHandler { |
// Adds an instruction to our handler. The instruction will execute and be |
// removed after the ttl expires. |
void AddInstruction(const copresence::TokenInstruction& instruction, |
+ const std::string& op_id, |
base::TimeDelta ttl_ms); |
- protected: |
- // Protected and virtual since we want to be able to mock these out. |
- virtual void PlayAudio( |
- const scoped_refptr<media::AudioBusRefCounted>& samples, |
- base::TimeDelta duration); |
- virtual void RecordAudio(base::TimeDelta duration); |
+ // Removes all instructions associated with this operation id. |
+ void RemoveInstructions(const std::string& op_id); |
+ |
+ // Returns the currently playing DTMF token. |
+ const std::string& PlayingAudibleToken() const { |
+ return current_token_audible_; |
+ } |
+ |
+ // Returns the currently playing DSSS token. |
+ const std::string& PlayingInaudibleToken() const { |
+ return current_token_inaudible_; |
+ } |
+ |
+ void set_player_audible_for_testing(AudioPlayer* player) { |
+ player_audible_ = player; |
+ } |
+ |
+ void set_player_inaudible_for_testing(AudioPlayer* player) { |
+ player_inaudible_ = player; |
+ } |
+ |
+ void set_recorder_for_testing(AudioRecorder* recorder) { |
+ recorder_ = recorder; |
+ } |
private: |
- void StopPlayback(); |
- void StopRecording(); |
+ FRIEND_TEST_ALL_PREFIXES(AudioDirectiveHandlerTest, Basic); |
- // Execute the next active transmit instruction. |
- void ExecuteNextTransmit(); |
- // Execute the next active receive instruction. |
- void ExecuteNextReceive(); |
+ typedef TimedMap<std::string, scoped_refptr<media::AudioBusRefCounted> > |
+ SamplesMap; |
- AudioDirectiveList directive_list_inaudible_; |
- AudioDirectiveList directive_list_audible_; |
+ // Processes the next active transmit instruction. |
+ void ProcessNextTransmit(); |
+ // Processes the next active receive instruction. |
+ void ProcessNextReceive(); |
- // The next two pointers are self-deleting. When we call Finalize on them, |
- // they clean themselves up on the Audio thread. |
- AudioPlayer* player_; |
+ void HandleToken(const std::string token, bool audible); |
+ |
+ // This is the method that the whispernet client needs to call to return |
+ // samples to us. |
+ void OnTokenEncoded(const std::string& token, |
+ bool audible, |
+ const scoped_refptr<media::AudioBusRefCounted>& samples); |
+ |
+ AudioDirectiveList transmits_list_audible_; |
+ AudioDirectiveList transmits_list_inaudible_; |
+ AudioDirectiveList receives_list_; |
+ |
+ // Currently playing tokens. |
+ std::string current_token_audible_; |
+ std::string current_token_inaudible_; |
+ |
+ // AudioPlayer and AudioRecorder objects are self-deleting. When we call |
+ // Finalize on them, they clean themselves up on the Audio thread. |
+ AudioPlayer* player_audible_; |
+ AudioPlayer* player_inaudible_; |
AudioRecorder* recorder_; |
AudioRecorder::DecodeSamplesCallback decode_cb_; |
+ EncodeTokenCallback encode_cb_; |
- base::OneShotTimer<AudioDirectiveHandler> stop_playback_timer_; |
+ base::OneShotTimer<AudioDirectiveHandler> stop_audible_playback_timer_; |
+ base::OneShotTimer<AudioDirectiveHandler> stop_inaudible_playback_timer_; |
base::OneShotTimer<AudioDirectiveHandler> stop_recording_timer_; |
+ // Cache that holds the encoded samples. After reaching its limit, the cache |
+ // expires the oldest samples first. |
+ SamplesMap samples_cache_audible_; |
+ SamplesMap samples_cache_inaudible_; |
+ |
DISALLOW_COPY_AND_ASSIGN(AudioDirectiveHandler); |
}; |
} // namespace copresence |
-#endif // COMPONENTS_COPRESENCE_HANDLERS_AUDIO_AUDIO_DIRECTIVE_HANDLER_ |
+#endif // COMPONENTS_COPRESENCE_HANDLERS_AUDIO_AUDIO_DIRECTIVE_HANDLER_H_ |