blob: d5f567f0eff086dfecb00017bdf7fae32043458b [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_AUDIO_MODEM_AUDIO_RECORDER_IMPL_H_
#define COMPONENTS_AUDIO_MODEM_AUDIO_RECORDER_IMPL_H_
#include <string>
#include "base/gtest_prod_util.h"
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "components/audio_modem/audio_recorder.h"
#include "media/audio/audio_io.h"
#include "media/audio/audio_parameters.h"
namespace base {
class MessageLoop;
}
namespace media {
class AudioBus;
}
namespace audio_modem {
// The AudioRecorder class will record audio until told to stop.
class AudioRecorderImpl final
: public AudioRecorder,
public media::AudioInputStream::AudioInputCallback {
public:
using RecordedSamplesCallback = base::Callback<void(const std::string&)>;
AudioRecorderImpl();
// AudioRecorder overrides:
void Initialize(const RecordedSamplesCallback& decode_callback) override;
void Record() override;
void Stop() override;
void Finalize() override;
// Takes ownership of the stream.
void set_input_stream_for_testing(
media::AudioInputStream* input_stream_for_testing) {
input_stream_for_testing_.reset(input_stream_for_testing);
}
// Takes ownership of the params.
void set_params_for_testing(media::AudioParameters* params_for_testing) {
params_for_testing_.reset(params_for_testing);
}
protected:
~AudioRecorderImpl() override;
void set_is_recording(bool is_recording) { is_recording_ = is_recording; }
private:
friend class AudioRecorderTest;
FRIEND_TEST_ALL_PREFIXES(AudioRecorderTest, BasicRecordAndStop);
FRIEND_TEST_ALL_PREFIXES(AudioRecorderTest, OutOfOrderRecordAndStopMultiple);
// Methods to do our various operations; all of these need to be run on the
// audio thread.
void InitializeOnAudioThread();
void RecordOnAudioThread();
void StopOnAudioThread();
void StopAndCloseOnAudioThread();
void FinalizeOnAudioThread();
// AudioInputStream::AudioInputCallback overrides:
// Called by the audio recorder when a full packet of audio data is
// available. This is called from a special audio thread and the
// implementation should return as soon as possible.
void OnData(media::AudioInputStream* stream,
const media::AudioBus* source,
uint32 hardware_delay_bytes,
double volume) override;
void OnError(media::AudioInputStream* stream) override;
// Flushes the audio loop, making sure that any queued operations are
// performed.
void FlushAudioLoopForTesting();
bool is_recording_;
media::AudioInputStream* stream_;
RecordedSamplesCallback decode_callback_;
// Outside of the ctor/Initialize method, only access the next variables on
// the recording thread.
scoped_ptr<media::AudioBus> buffer_;
int total_buffer_frames_;
int buffer_frame_index_;
scoped_ptr<media::AudioInputStream> input_stream_for_testing_;
scoped_ptr<media::AudioParameters> params_for_testing_;
DISALLOW_COPY_AND_ASSIGN(AudioRecorderImpl);
};
} // namespace audio_modem
#endif // COMPONENTS_AUDIO_MODEM_AUDIO_RECORDER_IMPL_H_