audio_recorder.h revision 5f1c94371a64b3196d4be9466099bb892df9b88e
15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifndef COMPONENTS_COPRESENCE_MEDIUMS_AUDIO_AUDIO_RECORDER_
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define COMPONENTS_COPRESENCE_MEDIUMS_AUDIO_AUDIO_RECORDER_
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <string>
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/gtest_prod_util.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/macros.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "media/audio/audio_io.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "media/audio/audio_parameters.h"
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "media/base/audio_converter.h"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace base {
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MessageLoop;
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace media {
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class AudioBus;
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace copresence {
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// The AudioRecorder class will record audio until told to stop.
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class AudioRecorder : public media::AudioInputStream::AudioInputCallback,
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      public media::AudioConverter::InputCallback {
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  typedef base::Callback<void(const std::string&)> DecodeSamplesCallback;
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  explicit AudioRecorder(const DecodeSamplesCallback& decode_callback);
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Initializes the object. Do not use this object before calling this method.
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void Initialize();
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void Record();
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void Stop();
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Cleans up and deletes this object. Do not use object after this call.
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void Finalize();
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Takes ownership of the stream.
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void set_input_stream_for_testing(
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      media::AudioInputStream* input_stream_for_testing) {
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    input_stream_for_testing_.reset(input_stream_for_testing);
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Takes ownership of the params.
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void set_params_for_testing(media::AudioParameters* params_for_testing) {
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    params_for_testing_.reset(params_for_testing);
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  friend class AudioRecorderTest;
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AudioRecorderTest, BasicRecordAndStop);
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AudioRecorderTest, OutOfOrderRecordAndStopMultiple);
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual ~AudioRecorder();
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Methods to do our various operations; all of these need to be run on the
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // audio thread.
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void InitializeOnAudioThread();
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void RecordOnAudioThread();
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void StopOnAudioThread();
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void StopAndCloseOnAudioThread();
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void FinalizeOnAudioThread();
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // AudioInputStream::AudioInputCallback overrides:
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Called by the audio recorder when a full packet of audio data is
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // available. This is called from a special audio thread and the
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // implementation should return as soon as possible.
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void OnData(media::AudioInputStream* stream,
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      const media::AudioBus* source,
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      uint32 hardware_delay_bytes,
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      double volume) OVERRIDE;
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void OnError(media::AudioInputStream* stream) OVERRIDE;
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // AudioConverter::InputCallback overrides:
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual double ProvideInput(media::AudioBus* dest,
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                              base::TimeDelta buffer_delay) OVERRIDE;
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Flushes the audio loop, making sure that any queued operations are
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // performed.
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void FlushAudioLoopForTesting();
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  media::AudioInputStream* stream_;
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool is_recording_;
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DecodeSamplesCallback decode_callback_;
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // ProvideInput will use this buffer as its source.
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const media::AudioBus* temp_conversion_buffer_;
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Outside of the ctor/Initialize method, only access the next variables on
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // the recording thread.
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<media::AudioBus> buffer_;
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int total_buffer_frames_;
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int buffer_frame_index_;
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<media::AudioConverter> converter_;
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<media::AudioInputStream> input_stream_for_testing_;
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<media::AudioParameters> params_for_testing_;
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AudioRecorder);
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace copresence
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif  // COMPONENTS_COPRESENCE_MEDIUMS_AUDIO_AUDIO_RECORDER_
112