Home | History | Annotate | Download | only in audio
      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
      3 // found in the LICENSE file.
      4 
      5 #ifndef COMPONENTS_COPRESENCE_MEDIUMS_AUDIO_AUDIO_RECORDER_H_
      6 #define COMPONENTS_COPRESENCE_MEDIUMS_AUDIO_AUDIO_RECORDER_H_
      7 
      8 #include <string>
      9 
     10 #include "base/gtest_prod_util.h"
     11 #include "base/macros.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "media/audio/audio_io.h"
     14 #include "media/audio/audio_parameters.h"
     15 #include "media/base/audio_converter.h"
     16 
     17 namespace base {
     18 class MessageLoop;
     19 }
     20 
     21 namespace media {
     22 class AudioBus;
     23 }
     24 
     25 namespace copresence {
     26 
     27 // The AudioRecorder class will record audio until told to stop.
     28 class AudioRecorder : public media::AudioInputStream::AudioInputCallback,
     29                       public media::AudioConverter::InputCallback {
     30  public:
     31   typedef base::Callback<void(const std::string&)> DecodeSamplesCallback;
     32 
     33   explicit AudioRecorder(const DecodeSamplesCallback& decode_callback);
     34 
     35   // Initializes the object. Do not use this object before calling this method.
     36   virtual void Initialize();
     37 
     38   virtual void Record();
     39   virtual void Stop();
     40 
     41   // Cleans up and deletes this object. Do not use object after this call.
     42   virtual void Finalize();
     43 
     44   bool IsRecording();
     45 
     46   // Takes ownership of the stream.
     47   void set_input_stream_for_testing(
     48       media::AudioInputStream* input_stream_for_testing) {
     49     input_stream_for_testing_.reset(input_stream_for_testing);
     50   }
     51 
     52   // Takes ownership of the params.
     53   void set_params_for_testing(media::AudioParameters* params_for_testing) {
     54     params_for_testing_.reset(params_for_testing);
     55   }
     56 
     57  protected:
     58   virtual ~AudioRecorder();
     59   void set_is_recording(bool is_recording) { is_recording_ = is_recording; }
     60 
     61  private:
     62   friend class AudioRecorderTest;
     63   FRIEND_TEST_ALL_PREFIXES(AudioRecorderTest, BasicRecordAndStop);
     64   FRIEND_TEST_ALL_PREFIXES(AudioRecorderTest, OutOfOrderRecordAndStopMultiple);
     65 
     66   // Methods to do our various operations; all of these need to be run on the
     67   // audio thread.
     68   void InitializeOnAudioThread();
     69   void RecordOnAudioThread();
     70   void StopOnAudioThread();
     71   void StopAndCloseOnAudioThread();
     72   void FinalizeOnAudioThread();
     73 
     74   // AudioInputStream::AudioInputCallback overrides:
     75   // Called by the audio recorder when a full packet of audio data is
     76   // available. This is called from a special audio thread and the
     77   // implementation should return as soon as possible.
     78   virtual void OnData(media::AudioInputStream* stream,
     79                       const media::AudioBus* source,
     80                       uint32 hardware_delay_bytes,
     81                       double volume) OVERRIDE;
     82   virtual void OnError(media::AudioInputStream* stream) OVERRIDE;
     83 
     84   // AudioConverter::InputCallback overrides:
     85   virtual double ProvideInput(media::AudioBus* dest,
     86                               base::TimeDelta buffer_delay) OVERRIDE;
     87 
     88   // Flushes the audio loop, making sure that any queued operations are
     89   // performed.
     90   void FlushAudioLoopForTesting();
     91 
     92   bool is_recording_;
     93 
     94   media::AudioInputStream* stream_;
     95   DecodeSamplesCallback decode_callback_;
     96 
     97   // ProvideInput will use this buffer as its source.
     98   const media::AudioBus* temp_conversion_buffer_;
     99 
    100   // Outside of the ctor/Initialize method, only access the next variables on
    101   // the recording thread.
    102   scoped_ptr<media::AudioBus> buffer_;
    103   int total_buffer_frames_;
    104   int buffer_frame_index_;
    105 
    106   scoped_ptr<media::AudioConverter> converter_;
    107 
    108   scoped_ptr<media::AudioInputStream> input_stream_for_testing_;
    109   scoped_ptr<media::AudioParameters> params_for_testing_;
    110 
    111   DISALLOW_COPY_AND_ASSIGN(AudioRecorder);
    112 };
    113 
    114 }  // namespace copresence
    115 
    116 #endif  // COMPONENTS_COPRESENCE_MEDIUMS_AUDIO_AUDIO_RECORDER_H_
    117