audio_record_input.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1// Copyright 2013 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#include "media/audio/android/audio_record_input.h"
6
7#include "base/logging.h"
8#include "jni/AudioRecordInput_jni.h"
9#include "media/audio/android/audio_manager_android.h"
10
11namespace media {
12
13AudioRecordInputStream::AudioRecordInputStream(
14    AudioManagerAndroid* audio_manager, const AudioParameters& params)
15    : audio_manager_(audio_manager),
16      callback_(NULL),
17      direct_buffer_address_(NULL) {
18  DVLOG(2) << __PRETTY_FUNCTION__;
19  DCHECK(params.IsValid());
20  j_audio_record_.Reset(
21      Java_AudioRecordInput_createAudioRecordInput(
22          base::android::AttachCurrentThread(),
23          reinterpret_cast<intptr_t>(this),
24          params.sample_rate(),
25          params.channels(),
26          params.bits_per_sample(),
27          params.GetBytesPerBuffer(),
28          params.effects() & AudioParameters::ECHO_CANCELLER));
29}
30
31AudioRecordInputStream::~AudioRecordInputStream() {
32  DVLOG(2) << __PRETTY_FUNCTION__;
33  DCHECK(thread_checker_.CalledOnValidThread());
34}
35
36void AudioRecordInputStream::CacheDirectBufferAddress(JNIEnv* env, jobject obj,
37                                                      jobject byte_buffer) {
38  DCHECK(thread_checker_.CalledOnValidThread());
39  direct_buffer_address_ = static_cast<uint8*>(
40      env->GetDirectBufferAddress(byte_buffer));
41}
42
43// static
44bool AudioRecordInputStream::RegisterAudioRecordInput(JNIEnv* env) {
45  return RegisterNativesImpl(env);
46}
47
48void AudioRecordInputStream::OnData(JNIEnv* env, jobject obj, jint size,
49                                    jint hardware_delay_bytes) {
50  DCHECK(direct_buffer_address_);
51  // Passing zero as the volume parameter indicates there is no access to a
52  // hardware volume slider.
53  callback_->OnData(this, direct_buffer_address_, size, hardware_delay_bytes,
54                    0.0);
55}
56
57bool AudioRecordInputStream::Open() {
58  DVLOG(2) << __PRETTY_FUNCTION__;
59  DCHECK(thread_checker_.CalledOnValidThread());
60  return Java_AudioRecordInput_open(
61      base::android::AttachCurrentThread(), j_audio_record_.obj());
62}
63
64void AudioRecordInputStream::Start(AudioInputCallback* callback) {
65  DVLOG(2) << __PRETTY_FUNCTION__;
66  DCHECK(thread_checker_.CalledOnValidThread());
67  DCHECK(callback);
68
69  if (callback_) {
70    // Start() was already called.
71    DCHECK_EQ(callback_, callback);
72    return;
73  }
74  // The Java thread has not yet started, so we are free to set |callback_|.
75  callback_ = callback;
76
77  Java_AudioRecordInput_start(
78      base::android::AttachCurrentThread(), j_audio_record_.obj());
79}
80
81void AudioRecordInputStream::Stop() {
82  DVLOG(2) << __PRETTY_FUNCTION__;
83  DCHECK(thread_checker_.CalledOnValidThread());
84  if (!callback_) {
85    // Start() was never called, or Stop() was already called.
86    return;
87  }
88
89  Java_AudioRecordInput_stop(
90      base::android::AttachCurrentThread(), j_audio_record_.obj());
91
92  // The Java thread must have been stopped at this point, so we are free to
93  // clear |callback_|.
94  callback_ = NULL;
95}
96
97void AudioRecordInputStream::Close() {
98  DVLOG(2) << __PRETTY_FUNCTION__;
99  DCHECK(thread_checker_.CalledOnValidThread());
100  Stop();
101  DCHECK(!callback_);
102  Java_AudioRecordInput_close(
103      base::android::AttachCurrentThread(), j_audio_record_.obj());
104  audio_manager_->ReleaseInputStream(this);
105}
106
107double AudioRecordInputStream::GetMaxVolume() {
108  NOTIMPLEMENTED();
109  return 0.0;
110}
111
112void AudioRecordInputStream::SetVolume(double volume) {
113  NOTIMPLEMENTED();
114}
115
116double AudioRecordInputStream::GetVolume() {
117  NOTIMPLEMENTED();
118  return 0.0;
119}
120
121void AudioRecordInputStream::SetAutomaticGainControl(bool enabled) {
122  NOTIMPLEMENTED();
123}
124
125bool AudioRecordInputStream::GetAutomaticGainControl() {
126  NOTIMPLEMENTED();
127  return false;
128}
129
130}  // namespace media
131