audio_record_input.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
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} 29 30AudioRecordInputStream::~AudioRecordInputStream() { 31 DVLOG(2) << __PRETTY_FUNCTION__; 32 DCHECK(thread_checker_.CalledOnValidThread()); 33} 34 35void AudioRecordInputStream::CacheDirectBufferAddress(JNIEnv* env, jobject obj, 36 jobject byte_buffer) { 37 DCHECK(thread_checker_.CalledOnValidThread()); 38 direct_buffer_address_ = static_cast<uint8*>( 39 env->GetDirectBufferAddress(byte_buffer)); 40} 41 42// static 43bool AudioRecordInputStream::RegisterAudioRecordInput(JNIEnv* env) { 44 return RegisterNativesImpl(env); 45} 46 47void AudioRecordInputStream::OnData(JNIEnv* env, jobject obj, jint size, 48 jint hardware_delay_bytes) { 49 DCHECK(direct_buffer_address_); 50 // Passing zero as the volume parameter indicates there is no access to a 51 // hardware volume slider. 52 callback_->OnData(this, direct_buffer_address_, size, hardware_delay_bytes, 53 0.0); 54} 55 56bool AudioRecordInputStream::Open() { 57 DVLOG(2) << __PRETTY_FUNCTION__; 58 DCHECK(thread_checker_.CalledOnValidThread()); 59 return Java_AudioRecordInput_open( 60 base::android::AttachCurrentThread(), j_audio_record_.obj()); 61} 62 63void AudioRecordInputStream::Start(AudioInputCallback* callback) { 64 DVLOG(2) << __PRETTY_FUNCTION__; 65 DCHECK(thread_checker_.CalledOnValidThread()); 66 DCHECK(callback); 67 68 if (callback_) { 69 // Start() was already called. 70 DCHECK_EQ(callback_, callback); 71 return; 72 } 73 // The Java thread has not yet started, so we are free to set |callback_|. 74 callback_ = callback; 75 76 Java_AudioRecordInput_start( 77 base::android::AttachCurrentThread(), j_audio_record_.obj()); 78} 79 80void AudioRecordInputStream::Stop() { 81 DVLOG(2) << __PRETTY_FUNCTION__; 82 DCHECK(thread_checker_.CalledOnValidThread()); 83 if (!callback_) { 84 // Start() was never called, or Stop() was already called. 85 return; 86 } 87 88 Java_AudioRecordInput_stop( 89 base::android::AttachCurrentThread(), j_audio_record_.obj()); 90 91 // The Java thread must have been stopped at this point, so we are free to 92 // set |callback_|. 93 callback_->OnClose(this); 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