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

Unified Diff: components/copresence/handlers/audio/audio_directive_handler.h

Issue 461803003: Stop playing/recording when not needed. (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 side-by-side diff with in-line comments
Download patch
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_

Powered by Google App Engine
This is Rietveld 408576698