OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.media; | 5 package org.chromium.media; |
6 | 6 |
7 import android.bluetooth.BluetoothAdapter; | 7 import android.bluetooth.BluetoothAdapter; |
8 import android.bluetooth.BluetoothManager; | 8 import android.bluetooth.BluetoothManager; |
9 import android.content.BroadcastReceiver; | 9 import android.content.BroadcastReceiver; |
10 import android.content.ContentResolver; | 10 import android.content.ContentResolver; |
11 import android.content.Context; | 11 import android.content.Context; |
12 import android.content.Intent; | 12 import android.content.Intent; |
13 import android.content.IntentFilter; | 13 import android.content.IntentFilter; |
14 import android.content.pm.PackageManager; | 14 import android.content.pm.PackageManager; |
15 import android.database.ContentObserver; | 15 import android.database.ContentObserver; |
16 import android.media.AudioFormat; | 16 import android.media.AudioFormat; |
17 import android.media.AudioManager; | 17 import android.media.AudioManager; |
18 import android.media.AudioRecord; | 18 import android.media.AudioRecord; |
19 import android.media.AudioTrack; | 19 import android.media.AudioTrack; |
| 20 import android.media.audiofx.AcousticEchoCanceler; |
20 import android.os.Build; | 21 import android.os.Build; |
21 import android.os.Handler; | 22 import android.os.Handler; |
22 import android.os.Looper; | 23 import android.os.Looper; |
23 import android.os.Process; | 24 import android.os.Process; |
24 import android.provider.Settings; | 25 import android.provider.Settings; |
25 import android.util.Log; | 26 import android.util.Log; |
26 | 27 |
27 import org.chromium.base.CalledByNative; | 28 import org.chromium.base.CalledByNative; |
28 import org.chromium.base.JNINamespace; | 29 import org.chromium.base.JNINamespace; |
29 | 30 |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 i++; | 304 i++; |
304 } | 305 } |
305 } | 306 } |
306 logd("getAudioInputDeviceNames: " + devices); | 307 logd("getAudioInputDeviceNames: " + devices); |
307 return array; | 308 return array; |
308 } | 309 } |
309 } | 310 } |
310 | 311 |
311 @CalledByNative | 312 @CalledByNative |
312 private int getNativeOutputSampleRate() { | 313 private int getNativeOutputSampleRate() { |
313 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.J
ELLY_BEAN_MR1) { | 314 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { |
314 String sampleRateString = mAudioManager.getProperty( | 315 String sampleRateString = mAudioManager.getProperty( |
315 AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE); | 316 AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE); |
316 return (sampleRateString == null ? | 317 return (sampleRateString == null ? |
317 DEFAULT_SAMPLING_RATE : Integer.parseInt(sampleRateString)); | 318 DEFAULT_SAMPLING_RATE : Integer.parseInt(sampleRateString)); |
318 } else { | 319 } else { |
319 return DEFAULT_SAMPLING_RATE; | 320 return DEFAULT_SAMPLING_RATE; |
320 } | 321 } |
321 } | 322 } |
322 | 323 |
323 /** | 324 /** |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 } | 368 } |
368 | 369 |
369 @CalledByNative | 370 @CalledByNative |
370 private int getAudioLowLatencyOutputFrameSize() { | 371 private int getAudioLowLatencyOutputFrameSize() { |
371 String framesPerBuffer = | 372 String framesPerBuffer = |
372 mAudioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PE
R_BUFFER); | 373 mAudioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PE
R_BUFFER); |
373 return (framesPerBuffer == null ? | 374 return (framesPerBuffer == null ? |
374 DEFAULT_FRAME_PER_BUFFER : Integer.parseInt(framesPerBuffer)); | 375 DEFAULT_FRAME_PER_BUFFER : Integer.parseInt(framesPerBuffer)); |
375 } | 376 } |
376 | 377 |
| 378 @CalledByNative |
| 379 public static boolean shouldUseAcousticEchoCanceler() { |
| 380 // AcousticEchoCanceler was added in API level 16 (Jelly Bean). |
| 381 // Next is a list of device models which have been vetted for good |
| 382 // quality platform echo cancellation. |
| 383 return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && |
| 384 AcousticEchoCanceler.isAvailable() && |
| 385 (Build.MODEL.equals("Nexus 5") || |
| 386 Build.MODEL.equals("Nexus 7")); |
| 387 } |
| 388 |
377 /** Sets the speaker phone mode. */ | 389 /** Sets the speaker phone mode. */ |
378 public void setSpeakerphoneOn(boolean on) { | 390 public void setSpeakerphoneOn(boolean on) { |
379 boolean wasOn = mAudioManager.isSpeakerphoneOn(); | 391 boolean wasOn = mAudioManager.isSpeakerphoneOn(); |
380 if (wasOn == on) { | 392 if (wasOn == on) { |
381 return; | 393 return; |
382 } | 394 } |
383 mAudioManager.setSpeakerphoneOn(on); | 395 mAudioManager.setSpeakerphoneOn(on); |
384 } | 396 } |
385 | 397 |
386 /** Sets the microphone mute state. */ | 398 /** Sets the microphone mute state. */ |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
591 } | 603 } |
592 } | 604 } |
593 | 605 |
594 private void logDeviceInfo() { | 606 private void logDeviceInfo() { |
595 Log.i(TAG, "Manufacturer:" + Build.MANUFACTURER + | 607 Log.i(TAG, "Manufacturer:" + Build.MANUFACTURER + |
596 " Board: " + Build.BOARD + " Device: " + Build.DEVICE + | 608 " Board: " + Build.BOARD + " Device: " + Build.DEVICE + |
597 " Model: " + Build.MODEL + " PRODUCT: " + Build.PRODUCT); | 609 " Model: " + Build.MODEL + " PRODUCT: " + Build.PRODUCT); |
598 } | 610 } |
599 | 611 |
600 /** Trivial helper method for debug logging */ | 612 /** Trivial helper method for debug logging */ |
601 private void logd(String msg) { | 613 private static void logd(String msg) { |
602 Log.d(TAG, msg); | 614 Log.d(TAG, msg); |
603 } | 615 } |
604 | 616 |
605 /** Trivial helper method for error logging */ | 617 /** Trivial helper method for error logging */ |
606 private void loge(String msg) { | 618 private static void loge(String msg) { |
607 Log.e(TAG, msg); | 619 Log.e(TAG, msg); |
608 } | 620 } |
609 | 621 |
610 private class SettingsObserver extends ContentObserver { | 622 private class SettingsObserver extends ContentObserver { |
611 SettingsObserver() { | 623 SettingsObserver() { |
612 super(new Handler()); | 624 super(new Handler()); |
613 mContentResolver.registerContentObserver(Settings.System.CONTENT_URI
, true, this); | 625 mContentResolver.registerContentObserver(Settings.System.CONTENT_URI
, true, this); |
614 } | 626 } |
615 | 627 |
616 @Override | 628 @Override |
(...skipping 19 matching lines...) Expand all Loading... |
636 synchronized (mSettingsObserverLock) { | 648 synchronized (mSettingsObserverLock) { |
637 mSettingsObserver = new SettingsObserver(); | 649 mSettingsObserver = new SettingsObserver(); |
638 mSettingsObserverLock.notify(); | 650 mSettingsObserverLock.notify(); |
639 } | 651 } |
640 | 652 |
641 // Listen for volume change. | 653 // Listen for volume change. |
642 Looper.loop(); | 654 Looper.loop(); |
643 } | 655 } |
644 } | 656 } |
645 } | 657 } |
OLD | NEW |